uart
TRANSCRIPT
UART
Diseño de Sistemas con FPGA
2o cuatrimestre 2011
Patricia Borensztejn
UART
• Universal Asynchronous receiver and transmitter: dispositivo que envía datos paralelos sobre una línea serie.
• RS-232: standard que especifica las características eléctricas, mecánicas, funcionales de los dos equipos que se comunican.
• Debido a que el nivel de voltaje definido en RS-232 es distinto al voltaje de los pines de E/S de la FPGA, es necesario un chip convertidor entre ambos (entre el puerto serie y los pines de la FPGA).
• En la placa S3 hay un puerto RS-232 con el conector standard de 9 pines, y la placa contiene el convertidor de tensión.
• Vamos a diseñar entonces la UART.
RS-232
• RS232 (Recommended Standard 232,
también conocido como Electronic
Industries Alliance RS-232C) es una
interfaz que designa una norma para el
intercambio de una serie de datos binarios
entre un DTE (Equipo terminal de datos) y
un DCE (Data Communication Equipment,
Equipo de Comunicación de datos),
aunque existen otras en las que también
se utiliza la interfaz RS-232.
Puertos RS-232
Puertos RS-232 de la
Spartan3e
• As shown in Figure 7-1, the Spartan-3E Starter Kit board
has two RS-232 serial ports: a female DB9 DCE
connector and a male DTE connector. The DCE-style
port connects directly to the serial port connector
available on most personal computers and workstations
via a standard straight-through serial cable.
• Use the DTE-style connector to control other RS-232
peripherals, such as modems or printers, or perform
simple loopback testing with the DCE connector.
Puertos RS-232
• Figure 7-1 shows the connection between the FPGA and
the two DB9 connectors. The FPGA supplies serial
output data using LVTTL or LVCMOS levels to the
Maxim device, which in turn, converts the logic value to
the appropriate RS-232 voltage level. Likewise, the
Maxim device converts the RS-232 serial input data to
LVTTL levels for the FPGA. A series resistor between
the Maxim output pin and the FPGA’s RXD pin protects
against accidental logic conflicts.
• Hardware flow control is not supported on the connector.
The port’s DCD, DTR, and DSR signals connect
together, as shown in Figure 7-1. Similarly, the port’s
RTS and CTS signals connect together.
Puerto Serie
UART • La UART incluye un transmisor y un receptor.
• El transmisor es básicamente un shift register que carga los datos en paralelo a transmitir y luego los shiftea uno a uno a una velocidad determinada (rate). Empezando por el LSB(Least Significand Bit)
• El receptor, recibe los bits uno a uno y reensambla el dato completo.
• Procedimiento: – Cuando la línea serie no lleva datos (iddle) está a “1”.
– La transmisión comienza con un bit de start (“0”), seguido por los bits de datos (6,7, o 8), un bit opcional de paridad (paridad par (igual a cero cuando hay un número par de unos) o impar) y finaliza con los bits de stop (1, 1.5 o 2).
– No se envía señal de clk.
– Antes de iniciarse la transferencia, el emisor y el transmisor deben ponerse de acuerdo en lo que se transmite y además en la velocidad de transmisión (baud rate: bits por segundo)
UART: Subsistema receptor • Módulo Generador de Baud Rate
– Debido a que no hay un reloj que permita decidir cuando el dato (bit) está disponible a la entrada, el receptor usará un sistema de “oversampling” que permite estimar el punto medio del bit transmitido y adquirirlo en ese instante. Este módulo es el encargado de generar las señales para el procedimiento de oversampling.
• Modulo Receptor – En función de los parámetros acordados (formato de la trama ) y del procedimiento de oversampling, se
van obteniendo los bits hasta completar el dato.
• Módulo Interface – Provee un mecanismo para señalizar al sistema la llegada de un nuevo dato, y previene que éste no
sea adquirido dos o mas veces.
– Provee buffers para almacenar los datos entre el sistema y el receptor.
FPGA
Procedimiento de Muestreo
• Dado el baud rate de transmisión, se genera una frecuencia que es 16 veces el baud rate, y se sigue el siguiente procedimiento:
1. Esperar que la señal se ponga a “0”, el principio del bit de start, e iniciar el conteo.
2. Cuando el conteo llega a 7, quiere decir que estamos en la mitad del start bit, se resetea el contador a cero.
3. Cuando el contador llega a 15, quiere decir que estamos en la mitad del primer bit de datos. Se obtiene el bit y se resetea el contador.
4. Repetir el paso 3 por cada bit de datos.
5. Si hay bit de paridad, repetir el paso 3 para el bit de paridad
6. Repetir el paso 3 para el bit de stop.
Módulo Generador de Baud Rate
• Su función será generar un “tick” 16 veces por baud rate.
• Si el baud rate es de 19.200 ciclos por segundo, la frecuencia de muestreo debe ser 19.200 *16= 307.200 ticks por segundo. Si el reloj de la placa (en spartan) es de 50 Mhz, entonces hay que generar un tick cada 163 ciclos de reloj.
• Para ello podemos utilizar un contador modulo 163.
• La señal generada, llamada “tick” no se comporta como un reloj, sino mas bien como un enable, porque valdrá “1” durante un ciclo de reloj, del reloj del sistema, y luego valdrá cero.
163307200
10*50 6
Módulo Generador de Baud Rate
• Usamos un contador módulo m genérico,
instanciado a mod 163(M) y 8 (N)bits
• Módulo Generador de Baud Rate
(mod_m_counter.v)
Módulo Receptor
• Este módulo es el responsable del
sampleo de la línea de datos serie, debe
seguir el procedimiento del muestreo
descrito anteriormente, de forma que será
necesario realizar una máquina de
estados o bien un diagrama de estados.
(ASMD: algorithmic state machine with
Data Path)
FSM y ASM
• Para representar Maquinas de Estados Finitas (FSM) se pueden utilizar: – Grados de Estado o Diagramas de Estado
– O bien ASM: Algorithmic State Machine
• Ambos tienen su extensión con Data Path: – FSMD
– ASMD
ASMD del Módulo Receptor
Modulo Receptor
• Módulo Receptor: uart_rx.v
Módulo Interface
– Provee un mecanismo para señalizar al sistema la llegada de un nuevo dato, y previene que éste no sea adquirido dos o mas veces.
– Provee buffers para almacenar los datos entre el sistema y el receptor.
Módulo Interface
• El módulo Interface utiliza una FIFO para
almacenar el dato (fifo.v)
Módulo Transmisor
• La organización del transmisor es similar a la del receptor, es decir, consiste de: – Transmisor:
• Es un shift register que envía hacia fuera uno a uno los bits a una determinada velocidad.
• Como aquí no hay muestreo de bits, la frecuencia de los ticks es 16 veces más lenta que en el caso del receptor.
• Usa el mismo generador de baud rate que el receptor pero se le agrega un contador de forma que cada bit es shifteado cada 16 ticks.
– Generador de baud rate
• El mismo módulo que usa el receptor.
– Interface:
• FIFO de transmisión
Módulo Transmisor
• Módulo Transmisor (uart_tx.v)
• Módulo Interface (fifo.v)
UART Completa
• Código UART (uart.v)
Prueba de la UART
• El circuito de prueba consiste en recibir desde la PC datos. Estos datos se incrementan en 1 y vuelven a ser transmitidos a la PC. Las señales de control de la FIFO (escribir en la FIFO de transmisión y eliminar de la FIFO de recepción) se generan al apretar el pushbottom. Los datos de entrada a la UART están conectados a los LEDS, y las señales tx_full y rx_empty a los dos segmentos horizontales del digito de la derecha de los 7 segmentos (todo un debugger).
HyperTerminal
• Configurar el Hyper Terminal a:
– 19.200 baudios, 8 bits de datos, 1 bit de stop
y no paridad.
Prueba de la UART
• Por ejemplo:
– Conectar el cable serie (o usb-serie) a la PC y
a la FPGA
– Abrir el Hiper Terminal y configurarlo para la
conexión
– Tipear HAL en el Hiper terminal
– Apretar el pushbottom 3 veces (cada vez que
se aprieta remueve un dato de la cola de
recepcion, y lo introduce, ya incrementado, en
la de transmisión)
– Debemos ver en la PC: IBM (la típica!)