Cronometro en VHDL
-
Upload
alejandro-gutierrez-marquez -
Category
Documents
-
view
1.628 -
download
38
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