1 Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 Transmisión de información con el puerto PCI express x1 Gustavo Moreno Domínguez1, Ernesto Castellanos Velasco1, Isaac Campos Cantón1, Raul Balderas Navarro2 1 Facultad de Ciencias, Universidad Autónoma de San Luis Potosí (UASLP), San Luis Potosí, S.L.P.- MEXICO, CP-78290. 2 IICO – UASLP, S.L.P. - MEXICO. TEL: +(444)8262387, ext. 2909, correo-e: proyectoente@gmail.com, ecastellv@fciencias.uaslp.mx Resumen — Se muestra la arquitectura y puesta en marcha de un puerto expreso de periféricos, conocido por sus siglas en inglés como “PCI-express o PCIe”. Las capas del modelo de referencia OSI que son cubiertas con este diseño son: la capa física, la capa de datos, la capa de transacciones y la capa de aplicación. Con base a éste modelo de referencia se realiza el diseño del arreglo lógico re-configurable (FPGA), que permite escudriñar los paquetes que transitan por el enlace de “Recepción - Transmisión”, del canal de transacciones PCIe. Abstract — In this paper, it is shown the architecture and the implementation of one configuration for the Peripheral Communication Interface, “PCI-express or PCIe”. The ISO layers covered with this design are the following: physic, data, transport and application. With the ISO reference model given for a PCIe port, the designer can configure a Field Programmable Gate Array (FPGA), which improve the way of scan all the bits inside of a link on the transaction packet, TLP “Receipt and Transmit”. Descriptores — puerto de entrada/salida, periféricos de computadora: PCI, PCI-express, diseño digital con Verilog. D I.INTRODUCCIÓN entro de la arquitectura que conforma al puerto PCIe, se sabe que se utilizan principalmente 3 capas de procesamiento [1], que están definidas en el modelo OSI [2]. Las capas de la información son: la capa física, la capa de protocolo y la capa de aplicación. El procesamiento de la capa física se realiza mediante el circuito NPX1011A de Philips Semiconductor. La especificación 1.1 del estándar PCIe tiene las siguientes características: codificación de 8 ó 10 bits de datos, transmisión y recepción de señales diferenciales de voltaje, tasa de transferencia de 2.5Gbits/s, y la programación de 4 capas de información. A través de la capa física están definidos los canales de transmisión y recepción (en dos vías), la velocidad de transferencia depende del número de canales que se tenga. Las señales digitales que se reciben en el canal de Recepción (RxD), son procesadas por un arreglo lógico reconfigurable, la FPGA XC3S1000. La configuración del experimento se encuentra dada por una tarjeta de desarrollo de la serie Spartan 3PCIexp de Xilinx. Además, a través de la capa de transacciones, es donde se hace uso del núcleo lógico de configuración (LogiCORE, PIPE PCI-exp), para que proporcione los bits de datos que se tendrán en la memoria RAM de la FPGA. Una vez que el núcleo lógico proporciona los datos provenientes de las capas de datos, y de transacciones, se procede a manejar apuntadores de memoria que permitan realizar el escudriñamiento de las tramas de bits que se encuentren localizados en el registro base de direcciones BAR0. 70 Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 En este punto es donde se configuran las tramas de los bits de acuerdo a las necesidades que se demanden de la siguiente capa superior, que en este caso corresponde a la capa de aplicación. Esta flexibilidad en el diseño, permite al usuario utilizar cualquier lenguaje de alto nivel (Basic, Pascal, C, Java, etc.), para crear una interfaz gráfica, que será el interprete entre el usuario y el enlace de comunicación. Algunas características de la aplicación que se ha creado para el puerto PCIe son: •Programación de la aplicación bajo el sistema operativo Linux, •Creación y manejo de apuntadores de memoria en lenguaje C, •Aplicación gráfica hecha en el entorno gráfico Lazarus que compila con lenguaje Pascal, •Consulta de los valores almacenados en cualquiera de los registros de direcciones (BAR – Base Address Registers). A continuación son descritas las secciones del presente trabajo. En la sección 2, se muestra un resumen del desarrollo previo en el área referente al diseño de interfaces de periféricos para computadora. En la sección 3, se muestra de forma breve la arquitectura que define a la especificación del puerto PCIe y se hace mención a las capas del modelo OSI. En la sección 4, se muestra la especificación técnica que tiene un enlace del tipo x1. En la sección 5, se introduce la noción del núcleo de configuración lógica, que define a la plataforma donde se procesará la información a nivel de hardware. Se muestra una tabla con el listado de las partes que permiten alambrar al experimento. En la sección 6, se muestra la aportación principal de éste trabajo, pues es donde se hace mención al manejador y a la interfaz gráfica del sistema que controla la información a través del puerto PCIe. Finalmente, se presentan las conclusiones en donde se mencionan algunas de las muchas áreas de aplicación que tiene este tipo de puertos tipo PCIe. II. DESARROLLO Y EVOLUCIÓN DE LOS PERIFÉRICOS DE COMPUTADORA Aquí se presentan varias arquitecturas que han aparecido con el paso del tiempo. Uno de los primeros canales de datos que tenía la computadora personal IBM, fue el canal ISA. El canal ISA procesa datos y comandos en paralelo, con 8 o 16 bits. Para obtener una configuración se requería de que el usuario configurase una serie de conexiones (jumpers), los cuales asignan recursos como interrupciones, puertos de entrada - salida y el canal DMA. Una de las principales necesidades de computo, existe con el despliegue de gráficos, por tal motivo han aparecido canales de datos con mejoras. Entre los canales de datos se encuentra el estándar VESA y MCA. El siguiente avance que se presentó, correspondió al canal de datos PCI de 32 bits [3], el cual fue creado por Intel, donde fueron establecidas una serie de mejoras que facilitaban la instalación de periféricos. Entre sus características destacó que es un bus paralelo de 32 bits, tiene una conexión de dispositivos Plug and Play, establece un espacio de memoria para la configuración, tiene 2 bloques de memoria por separado de 32-bit y 64-bits que corresponden a la memoria y al puerto de direcciones de entrada y salida de la familia de microprocesadores X86. Algunas de las características del canal de datos PCI paralelo de 32 bits son las siguientes: Reloj de 33.33 MHz con transferencias síncronas, Canal de datos de 32 bits o 64 bits, Tasa de transferencia máxima de 133Mbs con 32 bits (33.33MHz × 32 bits ÷ 8 bits = 133 MB/s), Tasa de transferencia máxima de 266Mbs con 64 bits, Registros de direcciones de 32 bits, Puertos de entrada y salida de 32 bits, 256 bytes con registros de configuración, Canal de datos compartido es decir, un sólo dispositivo a la vez puede mandar o recibir datos, por lo que teóricamente el ancho de banda total se distribuye, Las líneas de transmisión en un circuito impreso deben medir la misma distancia, Al aumentar la frecuencia de operación, también aumenta la posibilidad de recibir señales parásitas. Después de haberse propuesto el canal de 32 bits en paralelo, surge el canal PCI-X de 64 bits [4], el cual presenta casi el doble de capacidad y ventajas, pero al mismo tiempo el doble de limitaciones y desventajas. Si se continuara en esta misma dirección del procesamiento de canales de datos, se tendría que Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 diseñar otro canal de 128 bits, lo cual haría imposible su implementación física debido al exceso de pistas o canales, el manejo de la sincronía con el reloj, los tiempos de espera para transmitir o recibir tramas de datos y principalmente los efectos parásitos eléctricos que se suman al manejo de muchas líneas de bits en paralelo. III. PROCESAMIENTO DE DATOS CON EL PCI EXPRESS La aparición de este nuevo canal de datos para periféricos, permite el uso de un ancho de banda más grande y que pueda escalar de manera sencilla la velocidad en la conexión. Algunas de las principales características son: Frecuencia de trabajo 2.5 Ghz, versión 1.0a, Empleo de señales diferenciales de voltaje, Cada canal de datos (LANE), ofrece un ancho de banda de 250MB/s, Múltiplos de posibles velocidades: x1, x4, x8, x16 y x32, Ancho de banda máximo 8 GB/s, Un canal sencillo es full duplex es decir, admite transmisión y recepción en forma simultánea, Compatibilidad con el estandar PCI a nivel de software. La arquitectura PCIe – Estación de trabajo, tiene cuatro capas que permiten hacer la comunicación: Capa física, Capa de datos, Capa de transacciones, y Capa de aplicación (propia de la estación de trabajo). El proceso de la información que se envía o recibe, está ligada con la arquitectura del puerto de comunicaciones y también con el número de capas que la arquitectura tiene [1] y [2]. Para entender mejor la forma en la que se procesan los datos, es necesario saber lo que ocurre en cada una de las tres capas del PCIe. 71 De la terminal TX del dispositivo A, hasta la terminal RX del dispositivo B y de la terminal TX del dispositivo B, hasta la terminal RX del dispositivo A, se genera y define lo que es un enlace. En cada enlace son empleados 4 hilos de cobre, donde cada dos hilos contiene a una señal de transmisión o de recepción que están basadas en señales diferenciales. En la Figura 1, se muestra la configuración de un canal x1 (LANE). Figura 1: Descripción del canal x1 CAPA DE DATOS En esta capa se reciben o envían los paquetes de la capa física. Los paquetes son enviados en bloques de 8 ó 10bits, todos los bloques se unen, para conformar la información que se recibirá o se transmitirá. En la Figura 2 se muestra a cada uno de los bloques que conforman al paquete que es procesado en la capa de datos. Figura 2: Descripción y contenido del paquete de datos. CAPA DE TRANSACCIONES CAPA FÍSICA Esta capa es la encargada de leer o escribir a los bits por un medio físico, por ejemplo: las pistas de cobre en una placa impresa y el acoplamiento de impedancia para el manejo eléctrico de las señales bipolares de voltaje. En ésta capa son definidos 4 tipos de protocolos que permiten definir transacciones de: memoria, entrada/salida, configuración y mensajes. A continuación se resume cada uno. Memoria. Tipos de transacción: lectura de memoria (solicitud y relleno), escritura de memoria (solicitud). 72 Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 Las direcciones de memoria que corresponden a cualquiera de dos formatos; corto (32 bits) o largo(64 bits). Configuración. Son las transacciones que permiten presentar toda la información acerca del modelo de la tarjeta, fabricante, revisión del hardware, número de serie y las regiones de memoria que se utilizarán. Tipos de transacción: lectura de configuración (solicitud y relleno), escritura de configuración (solicitud y relleno). Entrada/Salida (E/S). Tipos de transacción: lectura de E/S (solicitud y relleno), escritura de E/S (solicitud y relleno) y se utiliza el formato de direccionamiento corto (32 bits). Mensajes. Son las transacciones que permiten manejar: los señalamientos de interrupción, los señalamientos de error, y el consumo eléctrico de energía. IV. CONFIGURACION DEL ENLACE X1 Los circuitos FPGA tienen un número considerable de terminales de entrada y salida. También se permite la re-configuración del sistema, que incluso pueda contar con versiones de desarrollo [3]. El lenguaje de descripción de hardware (HDL) que se emplea es Verilog, el cual permite configurar el núcleo lógico y agregarle todas aquellas funciones que se requieran para el control del puerto PCIe. La plataforma del núcleo lógico, contiene un entorno flexible para el desarrollo de prototipos. Físicamente la plataforma tiene leds indicadores, interruptores, un conector para puerto serie, memoria flash y PROM, un conector VGA, y un acoplamiento eléctrico para conector PCIe x1, un FPGA Spartan-3 XC3S1000 de Xilinx y dos conectores con 120 terminales tipo QTE, para expansión de periféricos de entrada y salida que se denominan módulos hijos. Con estas especificaciones se cuenta con lo necesario para diseñar la configuración del puerto PCIe a nivel de un sistema mínimo de hardware. Para lograr el acoplamiento de la interfaz eléctrica, la capa física utiliza amplificadores operacionales que soportan las altas frecuencias de transmisión del puerto PCIe. Como alternativa se tiene el circuito integrado de Phillips, el NPX1011A. Sus características principales son: Especificación 1.1 de PCIe, Canal de enlace PCIe de 2.5Gbit/s, El reloj, las interrupciones y los datos se obtienen del canal de datos, es una comunicación en serie diferencial, Codificación y de-codificación de 8b/10b, Se basa en Intel PHY para arquitectura PCIe v1.0 (PIPE), Transmisión y recepción a 250 Mhz, Reloj externo de 100 Mhz para referencia con tolerancia de +300 ppm, V. NÚCLEO DE CONFIGURACIÓN LÓGICA CON UART Las capas de datos y transacciones son las que manejan todo el protocolo dentro del puerto PCIe. El módulo de desarrollo de Xilinx cuenta con un núcleo de propiedad intelectual (IP LogiCore), llamado LogiCORE Endpoint PIPE v1.7. Mediante éste núcleo se puede configurar el FPGA para que se puedan incluir algunas configuraciones básicas que se tienen marcadas en la especificación PCIe v1.1. La Figura 3 muestra las operaciones que se hacen para entablar la comunicación con el puerto PCIe. Figura 3: Diagrama a bloques del núcleo (LogiCore) Para la aplicación hecha, se decidió introducir y configurar al módulo de comunicaciones seriales asíncronas, que también se le conoce como UART [5]. En la Tabla I, se muestra el listado de todos los módulos (en formato RTL), que se configuran para que el núcleo lógico permita incluir el funcionamiento de la comunicación serial. Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 TABLA I. MÓDULOS POR EDITAR CON EL PCIE Descripción NÚCLEO LÓGICO Nombre del Función módulo Agregada 1_lane_epi Código RTL donde Terminales: pe_epse alambran las Tx y Rx de la XC3S1000- terminales del circuito UART FG676-4.ucf y del FPGA. Diseño del pci_exp_1 Terminales: alambrado. _lane_epipe Tx y Rx de la Interconexión interna _ep.v UART con el FPGA pci_exp_3 Asignación de los 2b_app.v registros de 32 bits. Módulos programables de entrada salida. PIO.v Comunicación serial: UART Comunicación serial: UART. Se agregan dos registros de 32 bits para una entrada, una salida. Módulos Comuniprogramados de cación serial: entrada y salida. UART. Se PIO_EP.v Definición del agregan dos registro BAR0. registros de 32 bits. Conexiones entre Comuniel registro BAR0 con cación serial: las terminales de UART. Se bar0_io_d entrada y salida. agregan los evices.v Asignación de registros que terminales con el almacenan los FPGA. tramas de bits. Código generado async_rec por el usuario o eiver.v diseñador de la interfaz. 73 Se definen las tareas a realizar con la UART serial. La importancia de la re-configuración del núcleo lógico, consiste en que se pueden añadir todas aquellas funciones que el diseñador necesite para enviar o recibir paquetes de información a través del puerto PCIe. En la Figura 4, se muestra el código en RTL-Verilog que configura al registro base de direccionamientos, BAR0, para que se alambre y se asigne a un espacio dentro de la memoria del FPGA. Diseño de los módulos de 32 y 64 bits. 8Kbytes de memoria programable de entrada y salida. Módulo de los registros de control del mapeo de memoria de entrada y bar0_regis salida. Aqui se define ters.v el enlace x1 con las líneas Tx, Rx. Contenido de los registros que llevan los paquetes. Se agregan los dos registros de TX y RX. Figura 4: Código Verilog del registro BAR0 del puerto PCIe. En la Figura 5, se muestra el código en RTL-Verilog que configura a las terminales y las conexiones de entrada y salida para el registro BAR0, dentro del espacio de memoria RAM de 8Kbytes del FPGA. Figura 5: Configuración del espacio de memoria de 8Kbytes 74 Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 VI. APLICACIÓN PARA ENVIAR Y RECIBIR DATOS Para establecer la comunicación con el puerto PCIe, la estación de trabajo a nivel del sistema operativo requiere de un software especial, comúnmente llamado manejador. En la arquitectura que se diseñó se establece que al modificar la memoria interna se interactúa con las funciones de las que se dotó al hardware. La interacción con dicha memoria se consigue mediante un dispositivo especial con el que cuenta el sistema operativo LINUX, este es “/dev/mem”, toda la memoria física y de dispositivos se mapea en éste espacio. Sólo se debe obtener la dirección base que asigna el sistema operativo a la controladora del puerto PCIe. Para facilitar su manejo se diseñó una librería (cpcixp.c) en lenguaje C, la cual proporciona las funciones necesarias para manejar la aplicación desde cualquier lenguaje de programación o directamente con el lenguaje C. En la Figura 6, se muestra el código del manejador de memoria para el puerto PCIe. más interesante, se encarga de controlar y manejar las funciones especiales del puerto PCIe. Cualquier cambio que se presente inmediatamente se le informa al hilo de ejecución gráfica para que realice los cambios correspondientes. Cabe aclarar que este es uno de los puntos críticos en el diseño de este proyecto, la arquitectura digital del puerto esta completamente ligada al diseño de este software, en ambas partes se debe estructurar como van a interactuar cada una de las partes involucradas, un mal diseño diseño digital provoca que sea muy difícil programar aplicaciones que usen las funciones especiales que pueda contener el puerto. Por otro lado, un mal diseño de software provocará que el sistema se comporte muy lento o no se haga buen uso de las funciones especiales que tenga el hardware del puerto PCIe. En resumen, a partir de la escritura y/o lectura de la información en la memoria de la estación de trabajo, se programa una interfaz gráfica que nos permite desplegar los valores que se tienen en cualquier posición del registro de direcciones BAR0. En la Figura 7, se muestra la aplicación de la terminal remota que transmite códigos ASCII a través del puerto serial de la estación de trabajo o PC remota. Figura 7: Terminal remota de la aplicación. UART serial En la Figura 8, se muestra la aplicación de la terminal local, es decir, la interfaz hecha en la estación de trabajo que tiene insertada la tarjeta PCIe. Figura 6: Manejador de memoria PCIe El desarrollo de la interfaz gráfica en LINUX se llevo a cabo mediante el sistema RAD Lazarus (lenguaje PASCAL orientado a objetos) que tiene una paleta de funciones para interfaces gráficas. Como puntos especiales en este programa se pueden mencionar, el heccho de que se manejan 2 hilos de ejecución. Esto beneficia a sistemas con 2 procesadores o núcleos, donde el primer hilo se dedica al manejo y actualización de datos de la interfaz gráfica, mientras que el segundo hilo es el Figura 8: Terminal local de la aplicación. Contenido del registro BAR0. Encuentro de Investigación en IE, 25 — 26 de Marzo, 2010 75 VII.CONCLUSIONES El resultado final del programa gráfico es bastante interesante, porque permite el empleo de tecnologías de vanguardia en el campo de la arquitectura de computadoras. El primer aporte es con el uso del puerto PCIe para desarrollo de electrónica de alta velocidad, el segundo esta relacionado con el manejo de hardware en un sistema operativo que se considera de los más modernos y flexibles en cuanto a su diseño, para terminar el manejo de varios hilos de ejecución dentro de un sólo programa. El puerto expreso de periféricos (PCIe), es una arquitectura que permite dos tipos de direccionamientos (32 ó 64 bits) en un sólo esquema El procesamiento de los paquetes de bits se puede configurar para recibir la longitud de bits que se necesite, gracias a los protocolos que se tienen en la capa de transacciones. Esto permite al diseñador una gran variedad de aplicaciones como son: la instrumentación a nivel microelectrónico (p.e. tarjetas de adquisición de datos), control de procesos digitales, control de tráfico en redes de datos y transmisión inalámbrica. También se puede enfatizar su aplicación en el área del procesamiento de señales: imágenes, audio y manejo de enlaces de datos. Existe un campo abierto al diseñador en lo que respecta a la creación de aplicaciones, la capa de aplicación. Para lograr el funcionamiento de una interfaz tipo PCIe, se requiere de un trabajo multidisciplinal que incluya programación de diseño digital (HDL), conocimiento de la arquitectura de computadoras, diseño y construcción del sistema electrónico que haga la interfaz con la capa física, programación y creación de aplicaciones y entornos gráficos para con el usuario. REFERENCIAS [1]Wilen A.H., Schade J.P., Thornburg R., Introduction to PCI Express: A hardware and software developer's guide, Intel Press, E.U.A., (2003). [2]Tanenbaum, A.S, Redes de computadoras, PrenticeHall, Pearson Educación, México, (2003). [3]Shanley T., Anderson D., PCI System Architecture, Addison Wesley - PC System Architecture Series , E.U.A, (1999). [4]Shanley T., PCI-X System Architecture, Addison Wesley - PC System Architecture Series , E.U.A, (2004). [5]Desarrollo rápido de aplicaciones, (RAD) - Wikipedia, (1/Feb/2010), http://es.wikipedia.org/wiki/Desarrollo_r %C3%A1pido_de_aplicaciones.