Anda di halaman 1dari 6

Universidad Simón Bolívar

EC-1723 Circuitos Digitales


Prof. Ángel Terrones
Braulio Chávez (14-10219) Carlos Torres (14-11080) Michelle Hernández (15-10694)

Laboratorio 4: Circuitos Secuenciales. UART


1. Objetivos
● Hacer el diseño de un circuito (Tx) que permita transmitir los datos recibidos en el circuito
de recepción Rx.
● Diseñar el circuito Loopback que conecta el módulo UART y el FIFO.
● Probar el correcto funcionamiento del circuito diseñado a través de los tests recibidos.
● Sintetizar y grabar el circuito diseñado en el FPGA (Spartan-3).

2. Diseño
En esta sección se terminarán de diseñar dos circuitos que permitan la comunicación entre la
computadora y la tarjeta de desarrollo (FPGA) La base de esta comunicación es un circuito UART
(Transmisor-Receptor Asíncrono Universal). Tal como su nombre lo dice es uno de los circuitos
más utilizados para transmisión y recepción de información de forma asíncrona, esto significa que
no se utiliza un reloj dentro de la señal, sino que las señales de transmisión (Tx) y recepción (Rx)
tienen un bit de start y otro de stop para saber cuándo empieza y termina la Data.
Algunas de las especificaciones del circuito a diseñar son: la frecuencia de transmisión y
recepción será de 115200Hz, el FIFO tiene un tamaño de 128 posiciones, el ancho de los datos es
de 8 bits, el circuito Loopback debe almacenar en el FIFO hasta recibir el carácter ‘\n’ o que se
llene la FIFO (cuando se hayan recibido 128 caracteres) y el número de caracteres recibidos debe
ser mostrado en el display 7-segementos.
Para esto se nos hizo entrega del módulo del UART (para la comunicación con la PC) al cual
le faltaba el circuito Tx, el módulo del FIFO para el almacenamiento de los datos recibidos y el
módulo del driver 7 segmentos para mostrar el número de datos almacenados en la FIFO. Además
del circuito Tx, faltaba el Loopback, el circuito principal que conecta el UART con el FIFO.

2.1 Diseño del circuito Tx


Tal y como se dijo, el circuito Tx es el que transmite la data al dispositivo receptor. Será
diseñado con una máquina de estados de dos instancias: IDLE (estoy ocioso) y TRANS (estoy
transmitiendo). Tiene dos salidas, ready_o que indica si el circuito está listo o no para transmitir
información y Tx que es la señal que contendrá la data. Esta última, en estado ocioso se mantiene
TRUE, cuando empieza a transmitir es FALSE durante un baudio (bit de start), luego transmite
los 8 bits de data y, por último, transmite un bit de stop, TRUE. Este circuito cuenta con 3 entradas,
adicionales al “reset”:
 Start_i: Indica el comienzo de la transmisión de la data.
 Dat_i: Es la información recibida del circuito de recepción Rx.
 Tx_tick_i: Son los flancos positivos de la señal que irán cambiando los valores de la data
recibida para su transmisión.
Como el circuito de por sí, tiene dos estados, se decidió diseñarlo como un circuito secuencial
de dos estados (IDLE (ocioso) y TRANS (transmisión). En la figura #1 se muestra el diagrama de
estados de este circuito y en la Tabla #1 las salidas para cada estado. Note que para la
implementación del circuito, es necesario usar un contador, una variable que vaya contando cuánto
tiempo (cuántos tx_tick) estoy en estado de transmisión, para asegurarnos de transmitir el bit de
start, los 8 bits de data y un bit de stop.

Figura #1: Diagrama de Estados del circuito Tx


Estado Count tx ready
Idle: S0 0 1 1
0 0
1
2
0
Trans: S1 . dat[0]
.
.
9 1 1
Tabla #1: Tabla de la verdad (a grandes rasgos) del circuito Tx.

En la figura #2 se muestra el código diseñado del Tx en lenguaje Python. Note que se decidió
shiftear la data para que en cada tick el valor a mostrar estuviera guardado en dat[0]. Asegurese de
leer con detenimiento los comentarios realizados en el mismo.

Figura #2: Código del tx


Como el circuito de transmisión cuenta con una máquina de estados, la salida próxima del
circuito depende del estado en el que se encuentre. El estado inicial S 0 establece el momento en el
que el circuito se encuentra listo para transmitir, esperando que la entrada start_i esté en 1. Mientras
start_i no se inicie en 1, no se podrá avanzar de estado. Al activarse start_i, el estado pasa a ser S 1
en el cual el circuito ya está transmitiendo (manteniéndose ocupado) y un contador interno
aumentará su valor a 1. Durante este estado, cada 1/Baudio la data irá variando desde 0 hasta 8 (la
cantidad máxima de bits que puede transmitirse) a la vez que el contador irá aumentando en 1
unidad. Al detectar que el contador ya se encuentra en 9, el circuito sabrá que ha terminado de
transmitir, por lo que el circuito vuelve a pasar al estado S 0 indicando que se encuentra listo para
transmitir nuevamente.

2.2 Diseño del circuito Loopback


Tal y como se dijo, el circuito Loopback es el main que conecta el circuito del FIFO con
el UART. Debe almacenar en el FIFO hasta recibir el carácter ‘\n’ o hasta que este se llene (cuando
se hayan recibido 128 caracteres). Este circuito tiene como entrada las señales clk, rst, y rx_i que
es la data recibida por la computadora. Y como salida, tx_o (señal de transmisión del circuito Tx),
anodos_o (indica qué ánodo del display de 7 segmentos está ensendido) y segmentos_o (indica
cuales son los leds que se estarán encendiendo en cada ánodo para mostrar cuántos caracteres están
almacenados en el FIFO). Además, este circuito lógico, implementa todos los módulos
involucrados: UART, FIFO y driver7seg.
En la figura #3 se muestra un diagrama de bloques del circuito a diseñar. En el bloque
denominado UART, el circuito recibe rx_i tx_start y tx_data. La primera es, como se dijo antes, la
señal recibida, la segunda indica el comienzo de la transmisión de la data, mientras que la tercera
envía la información que almacena previamente el módulo en la máquina de estados. Este mismo
bloque genera dos señales de recepción de datos: rx_dat y rx_ready. Rx_dat envía la información
al bloque FIFO para su almacenamiento, mientras que rx_ready es enviada al circuito generado en
el loopback para indicar si el circuito ha dejado o no de recibir información. A su vez, generan
otras dos señales de transmisión: tx_ready y tx_o. Estas señales indican si el circuito se encuentra
listo para transmitir y muestran la información transmitida luego de su almacenamiento previo en
los módulos anteriores.
En el bloque FIFO, se recibe una señal de entrada dat_i, la cual es la enviada por el UART para
almacenar la información que se requiere transmitir en una cola, guardando cada 8 caracteres hasta
llegar a una capacidad máxima. Este bloque genera señales de salida dat_o, count_o, empty_o,
full_o. Dat_o envía la señal almacenada previamente en la cola luego de culminar con la recepción,
para su procesar su transmisión en el bloque UART. Count_o indica la cantidad de caracteres que
se van almacenando en el FIFO para mostrar en el driver de 7 segmentos del display (bloque
driver7seg). Empty_o y full_o indican al loopback si se encuentra vacío o lleno la capacidad de
almacenamiento en el FIFO.
El circuito interno del Loopback recibe señales de salida tanto del UART como del FIFO para
indicar cuando el circuito se encuentra listo para recibir o transmitir, cuando la cantidad de
caracteres es máxima, indicar cuando almacenar la información recibida y cuando enviar la
información a transmitir, además de indicar si el circuito se encuentra esperando para transmitir o
si se encuentra ocupado transmitiendo.
Por último, el bloque del driver7seg, almacena el valor de la salida count_o del FIFO para
mostrar en el display del FPGA, en sus ánodos, la cantidad de caracteres que se están almacenando
en el circuito.

Figura #3 Diagrama de bloques del Loopback


En sí, el circuito a diseñar tiene como entrada las señales empty_o, full_o, rx_dat_o,
rx_ready_o y tx_ready y como salida tx_start, enqueue y dequeue. Este circuito genera las señales
que permitirán al tx empezar a transmitir y al FIFO encolar o desencolar un valor (data). Recuerde
que el FIFO funciona como una cola, por tanto el primero en entrar es el primero en salir (de allí
su nombre). En la figura # 4 se muestra el código en lenguaje Python de este circuito, observe en
la misma que l circuito no encola y desencola a la vez

Figura #4: Código del Loopback


3. Resultados:
Para comprobar el correcto funcionamiento de los códigos diseñados, se hicieron las pruebas
que se nos fueron entregadas con el enunciado de esta práctica a través del… En la figura #5 se
muestran los resultados obtenidos en los tests. Observe que los 5 test fueron aprobados y que el
código no tenía ningún error de sintaxis.

Figura #5: Resultados de los tests


Además, con la ayuda del programa “GTK Wave” se comprobó que las señales del circuito
se comportaban de la manera adecuada (Ver figura #6).

Figura #6: Señales del circuito en función del tiempo a través del simulador “GTK Wave”
Una vez chequeado el correcto funcionamiento de los códigos diseñados, se procedió a
grabar el programa en el FPGA. Luego de grabado, se probó con la ayuda del programa
“Realterm”, de esta forma se comprobó que aunque el programa enviaba y transmitía tal y como
debía, no mostraba en el display del FPGA el número de caracteres (bytes) que ingresaba el
usuario.
Una de las especificaciones del diseño era precisamente esa, que se mostrara en la pantalla
del FPGA el número de caracteres ingresados, sin embargo, que esto no sucediera no era
consecuencia de nuestro diseño, sino de alguno de los códigos que se nos fue entregado,
específicamente el Driver del 7 segmento. En tal sentido, se dispuso a arreglar este problema.
El problema era consecuencia de que la lógica en la que fue escrito el driver 7 segmentos
fue inversa a la que utiliza la tableta de desarrollo. El FPGA del laboratorio es ánodo común, por
lo que si el ánodo está en TRUE, significa que está apagado, mientras si está en FALSE, significa
que está encendido. El driver debía encender secuencialmente un ánodo a la vez, pero por cómo
fue escrito, encendía 3 ánodos a la vez. Luego de cambiar esta lógica y el valor inicial de los
ánodos (de 0001 a 1110), se volvió a quemar el programa en el FPGA y se logró que cumpliera
con todas las especificaciones, ahora si mostraba en el display el número de caracteres ingresados.
De manera adjunta a este informe se envía el código del 7 segmentos modificado.

4. Discusiones :
Los objetivos del laboratorio fueron logrados satisfactoriamente, sin embargo en el proceso se
tuvieron algunos problemas ligados al poco conocimiento del lenguaje de programación (Python)
y al pequeño error del código del 7 segmentos que fue solventado exitosamente.

5. Referencias :
Manual de usuario de la tarjeta. XLINX: Spartan-3 FPGA Starter Kit Board User Guide (v1.2)
2008.
Digital Design and Computer Architecture (Second Edition). David Money Harris & Sarah L.
Harris. 2013.

Anda mungkin juga menyukai