Capítulo 25 Unidad de recepción serie asíncrona.pdf

download Capítulo 25 Unidad de recepción serie asíncrona.pdf

of 17

Transcript of Capítulo 25 Unidad de recepción serie asíncrona.pdf

  • 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