Cronometro en VHDL

download Cronometro en VHDL

of 29

Transcript of Cronometro en VHDL

  • 8/16/2019 Cronometro en VHDL

    1/29

    Informe practica 4

    Sistema Secuencial – Contadores

    Juan Esteban Velásquez Franco

    c.c. 1020448036

    Alejandro Gutierrez Márquezc.c.1020459010

    A:

    Ricardo Andres Velasquez Velez

    Departamento de Ingeniería Electrónica

    Facultad de Ingeniería

    Universidad de Antioquia

    2016

  • 8/16/2019 Cronometro en VHDL

    2/29

    Introducción

    En informes anteriores manejamos circuitos cuyas salidas estaban

    exclusivamente en función de sus entradas o mejor llamados circuitos

    combinacionales. Para este laboratorio es necesario utilizar otrametodología ya que las salidas no van a depender de las entradas sino que

    son cambiantes dependiendo de unas señales y estados cambiantes, para

    ello manejaremos la lógica secuencial.

    Sistemas secuenciales: 

    A diferencia de los sistemas combinacionales, en los sistemas secuenciales,

    los valores de las salidas, en un momento dado, no dependen

    exclusivamente de los valores de las entradas en dicho momento, sinotambién dependen del estado anterior o estado interno. El sistema

    secuencial más simple es el biestable, de los cuales, el de tipo D (o cerrojo)

    es el más utilizado actualmente. La mayoría de los sistemas secuenciales

    están gobernados por señales de reloj. A éstos se los denomina "síncronos"

    o "sincrónicos", a diferencia de los "asíncronos" o "asincrónicos" que son

    aquellos que no son controlados por señales de reloj.

    Los principales sistemas secuenciales los cuales podemos encontrar en

    forma de circuitos integrados o como estructuras en sistemas programadosson: Contadores y registros.

    • Poseen uno o más caminos de realimentación, es decir, una o más señales

    internas o de salida se vuelven a introducir como señales de entradas.

    Gracias a esta característica se garantiza la dependencia de la operación con

    la secuencia anterior.

    • Como es lógico, existe una dependencia explícita del tiempo. Esta

    dependencia se produce en los lazos de realimentación antes mencionados.En estos lazos es necesario distinguir entre las salidas y las entradas

    realimentadas. Esta distinción se traducirá en un retraso de ambas señales

    (en el caso más ideal), como se puede ver en la figura 1.2, el cual puede

    producirse mediante dos elementos:

    • Elementos de retraso, ya sean explícitos o implícitos debido al retraso

    de la lógica combinacional. Este retraso es fijo e independiente de

    cualquier señal.

  • 8/16/2019 Cronometro en VHDL

    3/29

    • Elementos de memoria que son dispositivos que almacena el valor de

    la entrada en un instante determinado por una señal externa y lo

    mantiene hasta que dicha señal ordene el almacenamiento de un nuevo

    valor.

    En el siguiente procedimiento veremos cómo utilizaremos esos elementos

    para hacer un cronometro, son necesarios ya que necesitamos mandar

    señales internas que conecten y sincronicen los contadores y módulos a

    realizar.

    Procedimiento

    El sistema escogido es el siguiente:

    Cronometro: Diseñar un cronometro con minutos, segundos y centésimas desegundo. El cronometro tendrá un pulsador de start, uno de stop y otro para

    el reset. Los minutos deben visualizarse en los leds de la FPGA en formato

    BCD, los segundos y las centésimas de segundo deben visualizarse en los

    displays de 7 segmentos de la FPGA.

    Diagrama de bloques del sistema:

    Modulo cabecera

  • 8/16/2019 Cronometro en VHDL

    4/29

    Modulo del controlador de los display 7 segmentos:

    Diseño:

    El primer bloque que diseñamos fue el divisor de frecuencia para convertir

    la frecuencia de 50Mhz suministrada por la señal de reloj de la FPGA a la

    deseada.

    El divisor de frecuencia es un componente simple, cuyo objetivo es reducirla frecuencia de entrada. Éste se implementa con ayuda del factor de

    escalamiento y un contador. Primeramente, el factor de escalamiento es la

    relación entre la frecuencia de entrada y la frecuencia de salida deseada:

    En nuestro caso necesitamos una frecuencia de 100 ciclos por segundo (100Hercios) tenemos:

    =50ℎ

    100  = 500000 

    Por lo tanto, el contador para el divisor de frecuencia tiene como función

    generar la señal de salida de 100Hz cada 500000 ciclos.

    Una señal de reloj se mantiene el mismo tiempo en alto que en bajo; para

    este caso en particular, 250000 ciclos en alto y 250000 ciclos en bajo. Dadoque comenzamos a contar desde cero, el límite superior es 250000-1.

  • 8/16/2019 Cronometro en VHDL

    5/29

     

    Luego hicimos cuentas del número de contadores necesarios y de que

    modulo: 

    4 contadores módulo 10 para las centésimas, unidades de segundos y

    unidades de minutos.

    2 contadores módulo 6 para las decenas de segundos y decenas de minuto.

    Creamos primero el contador módulo 10 para las unidades de centésimas

    pero será un contador diferente a los otros contadores módulo 10 ya que

    este será al que conectaremos tanto el reloj como las señales de los botones

    de stop,start y será el que controle y arranque los demás contadores.

    Para ello creamos entradas para leer los pulsadores start, stop, reset,

    también para la señal de reloj de 100Hz.Las salidas serán dos: una cadena de

    4 bits por la cual saldrán las unidades de centésimas y una salida por la cualmandaremos una señal que le avisara al contador siguiente de decenas de

    centésimas que ya las unidades llegaron a 9 y que puede contar.

    Para implementar los botones usamos un flip-flop para en el caso por

    ejemplo del botón start mantenga el estado de actividad y no tener que

    mantener presionado el botón para que funcione el cronometro. Tanto el

    flip-flop como el contador lo escribimos en un process con el reset y la señal

    de reloj en la lista de sensibilización

  • 8/16/2019 Cronometro en VHDL

    6/29

    Con el reset asíncrono todas nuestras

    señales y el contador se ponen en cero.

    Ahora dentro del if condicionado con el

    comando rising_edge(clk) ejecutamos las

    instrucciones a continuación siempre quehaya un flanco de subida de reloj. Con el

    start y el stop condicionamos la variable

    que me define cuando cuento y cuando

    dejo de contar.Por último ya que

    creamos la variable de contador como

    entera para un uso más fácil al

    incrementar y asignarle valores usamos

    el comando conv_std_logic_vector() paraconvertir este tipo integer a un vector de

    4 bits std_logic y llevarlo a la salida así:

    Explicación del comando:

    Tomado de: 

    https://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_

    vector.html 

    A continuación diseñamos los demás contadores. El contador módulo 10normal es lo mismo que el anterior explicado pero ya no tendrá, el flip-flop

    del start ni el stop y tampoco esas dos entradas, solo tendrá el reset y el clk

    como entradas y la salida que manda la señal al siguiente contador

    indicándole que ya puede incrementar. Por la entrada del clk es donde llega

    la señal que manda el contador anterior formándose una cadena para que

    asi el contador de unidades de centésimas controle todo los demás.El

    proceso de este queda así:

    https://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.html

  • 8/16/2019 Cronometro en VHDL

    7/29

     

    Para los contadores módulo 6 se diseña de la misma manera que el anterior

    que era módulo 10 pero simplemente la señal integer que creamos comocontador ya no le damos un rango de 0 a 9 sino de 0 a 5 :

    Y condicionamos el if interno ya no con contador=9 sino contador =5.

    Una vez tenemos los contadores ya pensamos en como mostrar los números

    de las centésimas y los segundos por medio de los display y los minutos por

    los leds de la FPGA, la ventaja es que al manejarlos individualmente y de a 4

    bits ya se en encuentran en formato BCD y así no debemos hacer unconversor. Para los minutos es más sencillo ya que solo es asignar en orden

    a las variables de 4 bit donde tenemos las unidades y las decenas cada grupo

    de 4 leds así:

    Para la tarea de conectar los números con los display buscamos un

    controlador el cual maneja esto y selecciona por medio de los ánodos de los

    display cual usar. El diagrama de bloques lo podemos encontrar después deel diagrama global de proyecto unas páginas atrás, consiste en un contador

    módulo 2 el cual servirá de entrada a un decodificador 2 a 4 y como selector

    a un MUX 4 a 1 al cual entraran los números en BCD dependiendo de este

    selector pasa uno de los 4 a un decodificador 4 a 8, de esta manera activara

    el display que es y le mandara el número que corresponde.

    Con el siguiente ejemplo veremos cómo funcionan los display y como

    diseñar los decodificadores que darán la salida del controlador:

  • 8/16/2019 Cronometro en VHDL

    8/29

     

    Como podemos observar debemos mandar 0 al anodo del display que

    queremos usar y lo mismo con los segmentos que queremos encender asi

    que estos decos tendrán lógica invertida

    Deco ánodos:

    Deco segmentos:

    Estas variables irán a las salidas del controlador que llamamos ánodo (4bits)

    y segmentos (7bits) y en el módulo para poder así en el módulo cabecera en

    el cual instanciaremos este controlador conectarlas directamente a los pines

    así:

  • 8/16/2019 Cronometro en VHDL

    9/29

    Todo este proceso que acabamos de explicar se debe dar en un tiempo muy

    rápido para que engañe al ojo humano al encender y apagar los ánodos que

    seleccionan cada display pero la frecuencia de encendido/apagado de los

    ánodos no debe ser tan elevada, pues a medida de que aumenta la

    frecuencia, aumenta el comportamiento capacitivo de los LEDs queconforman el display. Una frecuencia de unos cientos de Hz se considera

    adecuada para operar el display. Encontramos que una señal de reloj

    adecuada y recomendada para manejar el contador que maneja el

    controlador es de 1khz por lo cual creamos un divisor de voltaje de 50mhz a

    1khz como el creado al inicio para poder usarlo aquí.

    Simulación de cada modulo

     _Contador módulo 10 con start y stop:

    Como podemos observar el botón start inicia el conteo y el contador

    funciona bien, la salida de next_clk tiene esos tramos rojos debido a que solo

    sabemos el valor de ésta cuando se cuenta que es cero y cuando llega a 9 el

    contador que sería uno pero de resto no toma el valor de uno. Así es como

    se genera el nuevo pulso para el siguiente contador el cual tiene un flanco

    de subida cada que cuenta 9 unidades de centésima.

    En esta parte de la simulación podemos observar como paramos el conteo

    con el stop activo y reactivamos con el start, coincidencialmente paro en

    cero pero no significa que el stop este reseteando.

  • 8/16/2019 Cronometro en VHDL

    10/29

     

    Y por último probamos el reset asíncrono y efectivamente no solo detiene el

    conteo sino que pone en cero el contador y lo hace de inmediato.

  • 8/16/2019 Cronometro en VHDL

    11/29

     

  • 8/16/2019 Cronometro en VHDL

    12/29

     _ Contador módulo 10:

    Probamos de una vez el reset y funciona muy bien, esta señal de rst fue

    implementada en todos los contadores y conectadas todas a el botón que

    usaremos para el reset del cronometro.

    Timing Report

  • 8/16/2019 Cronometro en VHDL

    13/29

     

     _ Contador módulo 6:

  • 8/16/2019 Cronometro en VHDL

    14/29

    Timing report

  • 8/16/2019 Cronometro en VHDL

    15/29

     _Controlador display 7 segmentos:

    Como podemos observar funciona muy bien el controlador.Recordemos que

    los decos activan ya sea el segmento o el anodo cuando toma valor de

    cero,entonces cuando el anodo a2 esta seleccionado nos deberia mostrar

    en el display lo que hay en el bcd2 y efectivamente lo hace ,en el inicio de la

    simulacion tenemos en el anodo a2 activado y en bcd2 tenemos el 7 asi que

    se activan los segmentos abc osea que el binario sería “00011111”

    incluyendo en todos como siempre el ultimo bit que es dp en 1.

  • 8/16/2019 Cronometro en VHDL

    16/29

    Timing Report

  • 8/16/2019 Cronometro en VHDL

    17/29

     

     _Divisor de frecuencia de 50MHz a 100Hz:

    Como podemos observar funciona bien ya que hace un ciclo cada

    10ms=0,01s y 0,01s*100=1s para un total de 100Hz o 100 ciclos por segundo

    como lo queríamos.

  • 8/16/2019 Cronometro en VHDL

    18/29

     

  • 8/16/2019 Cronometro en VHDL

    19/29

     _Divisor de frecuencia de 50MHz a 1KHz:

    Aquí se cumple también ya que: 1000us=0,001s y 0,001s*1000=1s para un

    total de 1000 ciclos por segundo o 1Khz.

  • 8/16/2019 Cronometro en VHDL

    20/29

     

    Simulación sistema completo:

    Empezamos probando el botón de start, como podemos observar en la

    imagen anterior el sistema se mantiene apagado mientras no se pulse este

    botón. Una vez pulsamos start comienza a contar y a encender segmentos

    los cuales se encuentran bien y están señalando las unidades de centésima:

  • 8/16/2019 Cronometro en VHDL

    21/29

     

    Aquí observamos el aumento en las decenas de centésimas:

    Una vez accionamos el botón stop para el conteo y se mantiene el valor en

    que estaba (30 centésimas):

    Al accionar el start reanuda el conteo:

  • 8/16/2019 Cronometro en VHDL

    22/29

    Accionamos el reset , se inicializa todo y se para el sistema:

    Por ultimo mostramos el conteo un poco más adelante () para mostrar que

    se funcionan los minutos y segundos:

  • 8/16/2019 Cronometro en VHDL

    23/29

     

    Timing Report

  • 8/16/2019 Cronometro en VHDL

    24/29

     

  • 8/16/2019 Cronometro en VHDL

    25/29

     

  • 8/16/2019 Cronometro en VHDL

    26/29

     

  • 8/16/2019 Cronometro en VHDL

    27/29

     

  • 8/16/2019 Cronometro en VHDL

    28/29

     

    Conclusiones

     

    La señal de reset es una señal indispensable en cualquier sistema

    digital ya que con ella podemos darle al sistema un valor inicial en caso

    de no poseerlo o si necesitamos reutilizar o ejecutar de nuevo el

    sistema lo podemos hacer sin necesidad de apagar y encender todo.

      Cuando necesitamos conectar una señal de reloj a un sistema que

    pone a variar el encendido y el apagado de un led o como en el caso

    de los display 7 segmentos es importante tener en cuenta lafrecuencia de la señal de reloj que conectamos ya que no debe ser

    muy alta no debe ser tan elevada, pues a medida de que aumenta la

    frecuencia, aumenta el comportamiento capacitivo de los LEDs que

    conforman el display. Una frecuencia de unos cientos de Hz se

    considera adecuada para operar el display. 

      Una señal de reloj se mantiene el mismo tiempo en alto que en bajo

    por ello el contador de los divisores de frecuencia se hace a la mitad

    de la división entre frecuenciaoriginal/frecuencia deseada. 

  • 8/16/2019 Cronometro en VHDL

    29/29

    Bibliografía

      http://stackoverflow.com/questions/15205202/clkevent-vs-rising-

    edge 

     

    http://www.ics.uci.edu/~jmoorkan/vhdlref/sig_dec.html   http://www.estadofinito.com/divisor-frecuencia-vhdl/ 

      http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-

    cuadruple-en-display-7-segmentos/ 

     

    https://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std

     _logic_vector.html 

      https://es.wikipedia.org/wiki/Sistema_secuencial 

      http://www.uhu.es/raul.jimenez/DIGITAL_II/dig2_i.pdf  

    http://stackoverflow.com/questions/15205202/clkevent-vs-rising-edgehttp://stackoverflow.com/questions/15205202/clkevent-vs-rising-edgehttp://stackoverflow.com/questions/15205202/clkevent-vs-rising-edgehttp://stackoverflow.com/questions/15205202/clkevent-vs-rising-edgehttp://stackoverflow.com/questions/15205202/clkevent-vs-rising-edgehttp://www.ics.uci.edu/~jmoorkan/vhdlref/sig_dec.htmlhttp://www.ics.uci.edu/~jmoorkan/vhdlref/sig_dec.htmlhttp://www.estadofinito.com/divisor-frecuencia-vhdl/http://www.estadofinito.com/divisor-frecuencia-vhdl/http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/https://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://es.wikipedia.org/wiki/Sistema_secuencialhttps://es.wikipedia.org/wiki/Sistema_secuencialhttp://www.uhu.es/raul.jimenez/DIGITAL_II/dig2_i.pdfhttp://www.uhu.es/raul.jimenez/DIGITAL_II/dig2_i.pdfhttp://www.uhu.es/raul.jimenez/DIGITAL_II/dig2_i.pdfhttps://es.wikipedia.org/wiki/Sistema_secuencialhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttps://www.cs.sfu.ca/~ggbaker/reference/std_logic/arith/conv_std_logic_vector.htmlhttp://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/http://foro.make-a-tronik.com/fpga/(codigo-vhdl)-contador-0-f-cuadruple-en-display-7-segmentos/http://www.estadofinito.com/divisor-frecuencia-vhdl/http://www.ics.uci.edu/~jmoorkan/vhdlref/sig_dec.htmlhttp://stackoverflow.com/questions/15205202/clkevent-vs-rising-edgehttp://stackoverflow.com/questions/15205202/clkevent-vs-rising-edge