Cronometro en VHDL

November 21, 2017 | Author: Alejandro Gutierrez Márquez | Category: Electronic Engineering, Electronic Design, Electronics, Electrical Engineering, Digital & Social Media
Share Embed Donate


Short Description

Descripción: Se construye un cronometro utilizando lenguaje VHDL e implementando en la FPGA Nexys 2...

Description

Informe practica 4 Sistema Secuencial – Contadores

Juan Esteban Velásquez Franco c.c. 1020448036 Alejandro Gutierrez Márquez c.c.1020459010

A: Ricardo Andres Velasquez Velez

Departamento de Ingeniería Electrónica Facultad de Ingeniería Universidad de Antioquia 2016

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 otra metodologí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, sino tambié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 programados son: 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.

• 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 de segundo. 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

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 reducir la 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 (100 Hercios) tenemos: 𝐸𝑠𝑐𝑎𝑙𝑎 =

50𝑀ℎ𝑧 = 500000 100𝐻𝑧

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. Dado que comenzamos a contar desde cero, el límite superior es 250000-1.

Luego hicimos cuentas del número de modulo:

contadores necesarios y de que

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 cual mandaremos 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

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 que haya 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() para convertir 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 10 normal 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í:

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 como contador 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 un conversor. 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 de el 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:

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í:

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 que conforman 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.

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.

_ 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

_ Contador módulo 6:

Timing report

_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.

Timing Report

_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.

_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.

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:

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:

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:

Timing Report

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 la frecuencia 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.

Bibliografía  http://stackoverflow.com/questions/15205202/clkevent-vs-risingedge  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-fcuadruple-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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF