Post on 06-Jul-2018
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
1/17
Inicio (EN)
Capítulos
0 You are leaving the privative
sector (EN)
1 ¡Hola mundo! (EN)
2 De un bit a datos (EN)
3 Puerta NOT (EN)
4 Contador de 26 bits (EN)
5 Prescaler de N bits (EN)
6 Múltiples prescalers
7 Contador de 4 bits con prescaler
8 Registro de 4 bits
9 Inicializador
10Registro de desplazamiento
11Multiplexor de 2 a 1
12Multiplexor de M a 1
13 Inicializando registros
14Registro de N bits con reset
síncrono
15Divisor de frecuencias
16Contador de segundos
17Generando tonos audibles
18Tocando notas
19Secuenciando notas
20Comunicaciones serie
asíncronas
21Baudios y transmisión
22Reglas de diseño síncrono
23Controladores y autómatas
finitos
24Unidad de transmisión serieasíncrona
25Unidad de recepción serie
asíncrona
26Memoria ROM
27Memoria ROM genérica
28Memoria RAM
29Puertas triestado
30Hacia el microprocesador y más
allá
Clone this wiki locally
Capítulo 25: Unidad de recepción serie asíncronaTestato edited this page Feb 21, 2016 · 34 revisions
Ejemplos de este capítulo en github
Introducción
Diseñaremos una unidad de recepción serie asíncrona, que nos permita recibir datos tanto del
PC como de otro dispositivo de comunicación serie. Obtendremos el componente final, listo para
usar en nuestros diseños
Para probarla haremos dos ejemplos: uno que saca los 4 bits menos segnificativos del dato
recibido por los leds de la ICEStick. Y otro que hace eco de todos los caracteres recibidos. Los
caracteres recibidos se envían al transmisor serie para que lleguen de nuevo al PC. Esto nos
permitirá comprobar que efectivamente hemos recibido el dato correctamente.
Módulo UART-RX
La unidad de transmisión serie la encapsularemos dentro del módulo uart-rx
Descripción de la interfaz
La unidad tiene 3 entradas y 2 salidas:
13 31 15Watch Star ForkObijuan / open-fpga-verilog-tutorial
Code Issues 0 Pull requests 0 Wiki Pulse Graphs
Pages 40
https://github.com/Obijua
Clone in Desktop
Personal Open source Business Explore Pric ing Blog Support This repository Search Sign upSign upSign inSign in
converted by Web2PDFConvert.com
https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-25%3A-Unidad-de-recepci%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30%3A-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://github.com/Obijuan/open-fpga-verilog-tutorial/tree/master/tutorial/ICESTICK/T25-uart-rxhttps://windows.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30%3A-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-29%3A-Puertas-triestadohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-28%3A-Memoria-RAMhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-27%3A-Memoria-ROM-gen%C3%A9ricahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-26%3A-Memoria-ROMhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-25%3A-Unidad-de-recepci%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-24%3A-Unidad-de-transmisi%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-23%3A-Controladores-y-aut%C3%B3matas-finitoshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-22%3A-Reglas-de-dise%C3%B1o-s%C3%ADncronohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-21%3A-Baudios-y-transmisi%C3%B3nhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-20%3A-Comunicaciones-serie-as%C3%ADncronashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-19%3A-Secuenciando-notashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-18%3A-Tocando-notashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-17%3A-Generando-tonos-audibleshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-16%3A-Contador-de-segundoshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-15%3A-Divisor-de-frecuenciashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-14%3A-Registro-de-N-bits-con-reset-s%C3%ADncronohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-13%3A-Inicializando-registroshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-12%3A-Multiplexor-de-M-a-1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-11%3A-Multiplexor-de-2-a-1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-10%3A-Registro-de-desplazamientohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-9%3A-Inicializadorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-8%3A-registro-de-4-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-7%3A-Contador-de-4-bits-con-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-6%3A-Multiples-prescalershttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-5%3A-N-bit-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-5%3A-Prescaler-de-N-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-4%3A-26-bit-counterhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-4%3A-Contador-de-26-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-3%3A-NOT-Gate.-Invhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-3%3A-Puerta-NOT.-Invhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-2%3A-From-bit-to-data.-Fporthttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-2%3A-De-un-bit-a-datos.-Fporthttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-1%3A-%C2%A1Hello-world%21-Setbithttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-1%3A-%C2%A1Hola-mundo%21-Setbithttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-0%3A-you-are-leaving-the-privative-sectorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-0%3A-you-are-leaving-the-privative-sectorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Home_ENhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Homehttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-25:-Unidad-de-recepci%C3%B3n-serie-as%C3%ADncrona/_historyhttps://github.com/Obijuan/open-fpga-verilog-tutorial/graphshttps://github.com/Obijuan/open-fpga-verilog-tutorial/pulsehttps://github.com/Obijuan/open-fpga-verilog-tutorial/wikihttps://github.com/Obijuan/open-fpga-verilog-tutorial/pullshttps://github.com/Obijuan/open-fpga-verilog-tutorial/issueshttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuanhttps://github.com/Obijuan/open-fpga-verilog-tutorial/networkhttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/stargazershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/watchershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://help.github.com/https://github.com/bloghttps://github.com/pricinghttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorial%2Fwiki%2FCap%25c3%25adtulo-25%3A-Unidad-de-recepci%25c3%25b3n-serie-as%25c3%25adncronahttps://github.com/join?source=header-repohttps://github.com/explorehttps://github.com/businesshttps://github.com/open-sourcehttps://github.com/personalhttps://github.com/
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
2/17
Entradas:
clk: Reloj del sistema (12MHz en la ICEstick)rstn: Reset negado. Cuando rstn es 0, se hace un reset síncrono de la unidad de
transmisión
rx: Linea de recepción serie. Por donde llegan los datos en serie
Salidas:
rcv: Notificación de carácter recibido. Es un pulso de 1 ciclo de ancho
data: Dato de recibido (8 bits)
Cronograma
Inicialmente, cuando la línea está en reposo y no se ha recibido nada, la señal rcv está a 0. Al
recibirse el bit de start por rx, el receptor comienza a funcionar, leyendo los siguientes bi ts y
almacenándolos internamente en su registro de desplazamiento. En el instante t1, cuando se ha
recibido el bit de stop, el dato se captura y se saca por la salida data. En el siguiente ciclo de
reloj, instante t2 (en el cronograma el tiempo se ha exagerado para que se aprecie), aparece un
pulso de un ciclo de reloj de anchura (exagerado también en el dibujo) que permita capturar el dato
en un registro externo.
Esta interfaz es muy cómoda. Para usar uart-rx en nuestros diseños, sólo hay que conectar la
salida data a la entrada de datos de un registro y la señal rcv usarla como habilitación. El dato
recibido se capturará automáticamente. Esta señal rcv también la podemos usar en los
controladores para saber cuándo se ha recibido un dato nuevo.
Diagrama de bloques
El diagrama de bloques completo del receptor se muestra en la siguiente figura:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
3/17
Ruta de datos
La señal rx se registra, para cumplir con las normas de diseño síncrono, y se introduce por el bit
más significativo de un registro de desplazamiento de 10 bits. El desplazamiento se realiza
cuando llega un pulso por la señal clk_baud, proveniente del generador de baudios. Este
generador sólo funciona cuando la miroorden bauden está activada.
Un contador de 4 bits realiza la cuenta de los bits recibidos (cuenta cada pulso de clk_baud). Se
pone a 0 con la microórden clear
Por último tenemos el controlador , que genera las microórdenes baudgen, load, clear y la señal
de interfaz rcv. La señal load se activa para que el dato recibido se almacene en el registro de
datos de 8 bits, de manera que se mantenga estable durante la recepción del siguiente carácter
baudgen_rx: Generador de baudios para recepción
El receptor tiene su propio generador de baudios que es diferente al del transmisor . En el
transmisor, al activar su generador con la microorden bauden, emite inmediatamente un pulso. Sin
embargo, en el receptor, se emite en la mitad del periodo. De esta forma se garantiza que el dato
se lee en la mitad del periodo, donde es mucho más estable (y la probabilidad de error es mejor)
En el cronograma se puede ver cómo al recebir el flanco de bajada del bit de start bauden seactiva, para que comience a funcionar el reloj del receptor. Sin embargo, hasta que no ha
alcanzado la mitad del periodo de bit no se pone a 1. A partir de entonces, los pulsos coinciden
con la mitad de los periodos de los bi ts recibidos
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
4/17
Controlador
El controlador está modelado como una máquina de 4 estados:
Los estados son:
IDLE: Estado de reposo. Esperando a recibir el bit de start por rx. En cuanto se recibe se pasa
al siguiente estado
RCV: Recibiendo datos. Se activa el temporizador de bits mediante la microorden baudgen y
se van recibiendo todos los bits, que se almacenan enel registro de desplazamiento. Cuando
se han recibido 10 bits (1 de start + 8 de datos + 1 de stop) la salida del contador (bitc) estará
a 10 y se pasa al siguiente estado
LOAD: Almacenamiento del dato recibido. Se activa la microorden load para guardar el dato
recibido (8 bits) en el registro de datos
DAV: (Data AVailable). Señalización de que existe un dato disponible. Se pone a uno la señal
rcv para que los circuitos externos puedan capturar el dato
Descripción en verilog
La unidad de recepción se compone de dos ficheros: el generador de baudios de recepción
(baudgen_rx.v ) y el propio receptor (uart_rx.v )
baudgen_rx.v
Este componente es similar al generador de baudios del transmisor, pero una vez habilitado el pulso
se envía transcurrida la mitad del periodo
El código verilog es el siguiente:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
5/17
//-- Fichero: baudgen_rx.v
`include "baudgen.vh"
//-- ENTRADAS:
//-- -clk: Senal de reloj del sistema (12 MHZ en la iceStick)
//-- -clk_ena: Habilitacion.
//-- 1. funcionamiento normal. Emitiendo pulsos
//-- 0: Inicializado y parado. No se emiten pulsos
//
//-- SALIDAS:
//-- - clk_out. Señal de salida para lograr la velocidad en baudios indicada
//-- Anchura de 1 periodo de clk. SALIDA NO REGISTRADA
module baudgen_rx(input wire clk,
input wire clk_ena,
output wire clk_out);
//-- Valor por defecto de la velocidad en baudios
parameter M = `B115200;
//-- Numero de bits para almacenar el divisor de baudios
localparam N = $clog2(M);
//-- Valor para llegar a la mitad del periodo
localparam M2 = (M >> 1);
//-- Registro para implementar el contador modulo M
reg [N-1:0] divcounter = 0;
//-- Contador módulo M
always @(posedge clk)
if (clk_ena)
//-- Funcionamiento normal
divcounter
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
6/17
reg rx_r;
//-- Microordenes
reg bauden; //-- Activar señal de reloj de datos
reg clear; //-- Poner a cero contador de bits
reg load; //-- Cargar dato recibido
//-------------------------------------------------------------------
//-- RUTA DE DATOS
//-------------------------------------------------------------------
//-- Registrar la señal de recepcion de datos
//-- Para cumplir con las normas de diseño sincrono
always @(posedge clk)
rx_r
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
7/17
IDLE :
//-- Al llegar el bit de start se pasa al estado siguiente
if (rx_r == 0)
state
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
8/17
Simplemente se instancia la unidad de recepción y se colocan un inicializador para hacer el
reset y un registro para capturar el dato recibido. Este registro tiene un enable para capturar
cuando se reciba el dato (indicándose por la señal rcv)
Descripción del código en verilog:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
9/17
`default_nettype none
`include "baudgen.vh"
//-- Top design
module rxleds(input wire clk, //-- Reloj del sistema
input wire rx, //-- Linea de recepcion serie
output reg [3:0] leds, //-- 4 leds rojos
output wire act); //-- Led de actividad (verde)
//-- Parametro: Velocidad de transmision
localparam BAUD = `B115200;
//-- Señal de dato recibido
wire rcv;
//-- Datos recibidos
wire [7:0] data;
//-- Señal de reset
reg rstn = 0;
//-- Inicializador
always @(posedge clk) rstn
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
10/17
task send_car;
input [7:0] car;
begin
rx
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
11/17
//-- Cables para las pruebas
reg rx = 1;
wire act;
wire [3:0] leds;
//-- Instanciar el modulo rxleds
rxleds #(BAUD)
dut(
.clk(clk),
.rx(rx),
.act(act), .leds(leds)
);
//-- Generador de reloj. Periodo 2 unidades
always
# 1 clk
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
12/17
Síntesis y pruebas
Hacemos la síntesis con el siguiente comando:
$ make sint
Los recursos empleados son:
Recurso ocupación
PIOs 7 / 96
PLBs 18 / 160
BRAMs 0 / 16
y lo cargamos en la FPGA con:
$ sudo iceprog rxleds.bin
Abrimos el gtkterm y lo configuramos a 115200 baudios. Si pulsamos teclas, veremos cómo
cambian los leds de la ICEstick. Por ejemplo, si pulsamos el 7, se envía el número 0x37, cuyos 4 bi ts
menos significativos coinciden con el número 7 (el código ASCII se diseño adrede para cumplir con
esta propiedad). En binario es 0111. Veremos cómo se encienden los leds 0, 1 y 3.
Si ahora pulsamos la tecla 0, todos los leds estarán apagados
En este vídeo de youtube se puede ver el ejemplo en acción:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
13/17
Ejemplo 2: eco
Este segundo ejemplo es el clásico programa de "eco": que transmite todo lo que recibe. Es unamanera de comprobar que los caracteres se están recibiendo correctamente
Descripción
El diagrama de bloques se muestra a continuación:
Sólo se instancian la unidad de transmisión y recepción, y se conectan de manera que lo recibido por
una llegue a la otra
El código verilog es el siguiente:
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://www.youtube.com/watch?v=G9gO11ggUPg
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
14/17
`default_nettype none
`include "baudgen.vh"
//-- Top design
module echo(input wire clk, //-- Reloj del sistema
input wire rx, //-- Linea de recepcion serie
output wire tx //-- Linea de transmision serie
);
//-- Parametro: Velocidad de transmision
localparam BAUD = `B115200;
//-- Señal de dato recibido
wire rcv;
//-- Datos recibidos
wire [7:0] data;
//-- Señal de reset
reg rstn = 0;
//-- Señal de transmisor listo
wire ready;
//-- Inicializador
always @(posedge clk)
rstn
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
15/17
//-- Tiempo entre dos bits enviados
localparam FRAME_WAIT = (BITRATE * 4);
//----------------------------------------
//-- Tarea para enviar caracteres serie
//----------------------------------------
task send_car;
input [7:0] car;
begin rx
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
16/17
El resultado en gtkwave es:
Se observa cómo en cuanto llega un caracter se vuelve a enviar de vuelta
Síntesis y pruebas
Hacemos la síntesis con el siguiente comando:
$ make sint2
Los recursos empleados son:
Recurso ocupación
PIOs 10 / 96
PLBs 44 / 160
BRAMs 0 / 16
y lo cargamos en la FPGA con:
$ sudo iceprog echo.bin
Abrimos el gtkterm y lo configuramos a 115200 baudios. Todo lo que escribamos se enviará a la
FPGA y se mostrará de vuelta en la pantalla
Ejercicios propuestos
TODO
Conclusiones
converted by Web2PDFConvert.com
http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF
8/17/2019 Capítulo 25 Unidad de recepción serie asíncrona.pdf
17/17
TODO
FPGA Libres: [Wiki] [Repo]
Status API Training Shop Blog About© 2016 GitHub, Inc. Terms Privacy Security Contact Help
http://www.web2pdfconvert.com/?ref=PDFhttps://help.github.com/https://github.com/contacthttps://github.com/securityhttps://github.com/site/privacyhttps://github.com/site/termshttps://github.com/abouthttps://github.com/bloghttps://shop.github.com/https://training.github.com/https://developer.github.com/https://status.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki