3.2 Diseño
En esta sección se describe el diseño de la etapa de transmisión, que se implementará en VHDL.
Los puertos de este módulo son los siguientes:
Puerto |
Modo |
PIN |
Propósito |
|---|---|---|---|
CLK |
in |
W5 |
Señal de reloj (100 MHz) |
RST |
in |
U18 |
Señal de reset asíncrono activo en alto |
SW(7:0) |
in |
V17… |
Carácter ASCII a transmitir |
BTND |
in |
U17 |
Orden de envío del carácter |
TX |
out |
A18 |
Línea de transmisión serie (19200 bps) |
Para ayudar a conceptualizar el hardware necesario para este diseño, se muestra su diagrama de bloques:
Descripción de los bloques:
Registro Desplazamiento:
Registro de desplazamiento de 10 bits con carga en paralelo. El registro se inicializa a \(\textsf{"0000000001"}\) cuando \(\textsf{RST='1'}\).
Función: Realiza la transformación paralelo-serie del carácter a transmitir (8 bits), añadiendo el bit de start (\(\textsf{'0'}\), LSB) y el bit de stop (\(\textsf{'1'}\), MSB). El registro carga en paralelo los 10 bits de la trama completa (\(\textsf{'1'\& SW(7:0) \&'0'}\)), y posteriormente desplaza su contenido una posición a la derecha en cada tiempo de bit, transmitiendo secuencialmente desde el LSB (bit de start) hasta el MSB (bit de stop).
Configuración: La tabla muestra el comportamiento del registro en función de
cargaydesplaza.cargadesplazaacción
\(\textsf{'1'}\)
\(\textsf{'0'}\)
Carga en paralelo el valor \(\textsf{'1'\& SW(7:0) \&'0'}\) en el registro
\(\textsf{'-'}\)
\(\textsf{'1'}\)
Desplaza el contenido del registro una posición a la derecha.
\(\textsf{'0'}\)
\(\textsf{'0'}\)
mantiene el valor del registro.
Señales:
tx: Bit menos significativo del registro de desplazamiento.idle_stopbit: Señal que indica que el registro se encuentra en estado de reposo o transmitiendo el bit de stop. en estas dos situaciones el registro contiene el valor: \(\textsf{"0000000001"}\)).
Detector de flanco up:
Activa la señal
validcuando detecta un flanco de subida en la entrada BTND, utiliza el circuito que muestra la figura:Este circuito está formado por 3 etapas:
sincronizador: Formado por dos registros FF1 y FF2, sincroniza la señal de entrada BTND con el reloj del sistema (100MHz), evitando problemas de metastabilidad.
muestreo 5ms: muestrea la salida del sincronizador cada aproximadamente 5 ms.
La placa utiliza un pulsador mecanico Omron B3F-1000 con tiempo de rebote maximo de 5 ms, por lo que un muestreo con periodo >= 5 ms elimina los efectos de los rebotes (debouncing).
Para contar el tiempo de 5 ms, se utiliza un contador de 19 bits (\(\lceil\log2(100\textsf{MHz} \times 5\textsf{ms} )\rceil\)) y módulo \(2^{19}\). El contador se incrementa a 100 MHz y al alcanzar el valor máximo (
0x7FFFF), se genera un pulso de un ciclo de relojtick_5ms(periodo \(\frac{2^{19}}{100\textsf{MHz}} = 5.24288 ms\)). Al activarse ese pulso, el registro FF3 captura la salida del sincronizador.detector de flanco: Genera un pulso sincrono de un ciclo de reloj (100 MHz) cuando detecta un flanco de subida en la salida del muestreador (FF3). Para ello, el registro FF4 memoriza el estado previo de FF3 y se compara con el estado actual. Si la salida de FF3 es “1” y la de FF4 es “0”, se activa
validdurante un ciclo de reloj.
tbit_timer:
Contador de 13 bits (\(\lceil\log2(100\textsf{MHz} / 19200 )\rceil\)) y módulo 5208 (\(round(\frac{100 \textsf{MHz}}{19200}\))) . Se inicializa al valor de cuenta máximo (
5207) cuando \(\textsf{RST='1'}\) .Función: Se utiliza para contar el tiempo de bit. Está activo mientras dura el proceso de transmisión, al finalizar la transmisión debe detenerse.
Configuración: La señal
btimer_inccontrola el contador, incrementándose módulo-5208 sibtimer_incestá activa Y manteniendo su valor en caso contrario.Señales:
btimer_end: Señal que se activa cuando el contador ha alcanzado el valor de cuenta máximo, indicando que ha transcurrido el tiempo de bit.
Bloques de lógica combinacional, lc1 y lc2:
Obtienen las señales que controlan los bloques secuenciales (registro de desplazamiento y tbit_timer), en función de la señal de validación de pulsación (
valid) y el estado del sistema. El estado del sistema está definido por las señalesidle_stopbitybtimer_end:idle_stopbtimer_endestado
\(\textsf{'0'}\)
\(\textsf{'-'}\)
TB: Procesando un bit
\(\textsf{'1'}\)
\(\textsf{'0'}\)
TS: Procesando el bit de stop
\(\textsf{'1'}\)
\(\textsf{'1'}\)
RE: Fin de procesado del carácter, el sistema en reposo
lc1:
Genera las señales de control
cargaydesplazadel registro de desplazamiento en función de la señalvalidy el estado del sistema.carga: se activa cuando se detecta una pulsación en BTND (valid='1') y el sistema está en reposo (RE).desplaza: se activa durante el proceso de transmisión (TB) cada vez que termina el tiempo de bit (btimer_end='1').
lc2:
Genera la señal de control
btimer_incen función de la señalvalidy el estado del sistema.btimer_inc: Está activa mientras el sistema se encuentra en proceso de transmisión (TB o TS) o si se detecta una pulsación en BTND (valid='1').
Modela este diseño en VHDL.
Comienza dibujando el diagrama del circuito que, mediante biestables y bloques de lógica combinacional, implemente tanto el registro de desplazamiento como el contador del tiempo de bit.
A continuación, describe en VHDL la implementación de estos bloques y del detector de flancos asociado a BTND.
- Sigue el procedimiento visto en el lab1:
Descarga el archivo de recursos de lab3 y descomprímelo.
Arranca vivado y crea el proyecto utilizando el script
scripts/lab.tcl.Edita
rtl/uart_tx.vhdpara modelar la funcionalidad descrita.
en Vivado: Sources→Design Sources→Syntax Error Files→uart_tx.vhd.
Advertencia
En el modelo VHDL del sistema debe describirse separando claramente la lógica secuencial de la combinacional, utilizando procesos para la lógica secuencial (biestables) y asignaciones concurrentes para la lógica combinacional.
Para codificar los nodos intermedios del transmisor, debes utilizar los mismos nombres con los que aparecen en los diagramas. Esto facilitará la depuración y el análisis de resultados. Es especialmente importante para los registros del sincronizador,
btnd_metaybtnd_sync, que deben ser reconocidos por las herramientas de síntesis e implementación como registros de sincronización, para maximizar el MTBF (tiempo entre fallos).