/tpf-team-6

tpf-team-6 created by GitHub Classroom

Primary LanguageVerilog



TP FINAL

ELECTRONICA III

CRONÓMETRO EN FPGA + VGA


Placa de desarrollo Cyclone IV

¿De qué se trata?

El tp final de Electronica III se basa en desarrollar un cronómetro utilizando un lenguaje de descripción de hardware, HDL por sus siglas en ingles. En nuestro caso empleamos Verilog.
El cronómetro opera sobre una FPGA Cyclone IV. Con el fin de poder visualizar el mismo en acción se empleo un monitor con conexión VGA. Para poder mostrar los digitos en pantalla se realizo una interfaz opera mediante el protocolo VGA y una serie de modulos especialmente diseñados para mostrar dibujar los digitos sobre la pantalla.

Aquí debajo podran encontrar el esquema del programa.
Recuerden que aquí se esta empleando un lenguaje funcional y su naturaleza implica que la ejecución de sus diferente modulos se realizan en simultaneo.

Esquema de funcionamiento


¿Comó se hace?

Para llevarlo a cabo es sumamente necesario poder identificar las partes que componen al diseño.

Clock

Volcar nuestro codigo escrito en Verilog sobre un dispositivo fisíco implica que no podemos valernos de las facilidades que nos brinda el lenguaje para especificar timesteps dado que estos existen para poder realizar simulaciones y validaciones de diseño. Es por esto que debemos recurrir al clock interno de la FPGA. No poder traducir los retrasos (denotados con #) en Verilog nos fuerza a realizar modulos que dependan unicamente de contadores. Dada las caracteristicas de la resolución de trabajo 640x480 a 60Hz, escogimos utilizar un clock que opere a 25.175 MHz. La elección de esta frecuencia viene condicionada por la resolución. Si desean obtener la respectiva frecuencia de clock para otra resolución pueden dirijirse a epanorama.net para obtener el calculo de manera automatica. Para obtener esta frecuencia se hace uso de los divisores de clock que provee nativamente el entorno de Quartus. Este entorno provisto por Intel nos permite cargar nuestro diseño a la FPGA.

Contadores

Nuestro objetivo es poder contar el tiempo haciendo uso de un unico clock maestro. Para poder contar tanto en segundos como minutos y horas debemos poder contar cuantos pulsos de clock son equivalentes a dichas unidades de tiempo. De esta manera estamos diviendo el clock provisto por la FPGA en subclocks que atienden a nuestras necesidades.

Separador de digitos

Si bien ya podemos contar el tiempo nos hace falta un elemento fundamental para poder ver el cronómetro en acción, los digitos. Sería muy ineficiente en terminos de memoria alojar cada posibilidad tiempo que pudiese ocurrir. Por lo tanto debemos saber qué digitos representan el tiempo. Cada contador tiene como salida su correspondiente medida de tiempo representada como un entero (un arreglo de bits siendo más tecnico). Un modulo decodificador se encarga de separarlo en decenas y unidades para luego ser procesados y comenzar su viaje hacia el monitor.

Modulo VGA

Para poder comunicarle al monitor cual sera la resolución de trabajo debemos respetar un cierto protocolo que involucra dos señales de sincronismo.
Aquí debajo se pueden apreciar ambas señales al mismo tiempo. Notese que la zona verde indica la zona visible.

¡Hora de graficar!

Dadas las señales de sincronización, el monitor comenzara su barrido a través de la pantalla. Para esto, el modulo VGA nos provee de la coordenadas actuales sobre las que esta el cursor del monitor. Es decir, al avanzar dos señales indicaran en que posición relativa al extremo superior izquierdo esta actualmente el cursor.
Una vez obtenido dicho dato, se debe poder discernir qué graficar (qué número) y dondé.

Seleccionando el número

Para poder seleccionar el número adecuado a graficar debemos poder leer la data enviada por el modulo separador de digito. Este actualizara su información una vez por barrido completo de la pantalla. De esta forma evitamos imprevistos durante el proceso de dibujo. Por ejemplo, el digito de los segundo podría cambiar durante el barrido causando que la imagen no se vea correctamente.

Graficando

Para poder graficar se diseño a cada número como un conjunto de cuadrados que ilustran el digito.

Ahora, con el fin de poder mostrar el número en pantalla se diseñaron modulos que permiten graficar los digitos individualmente. Cada uno de esos modulos tiene toda la información necesaria como para poder saber su ubicación relativa en la pantalla.


Al poder leer los pares x,y es posible determinar si deben emitir un pulso de dibujo o no deben hacerlo.

¡Funciona!

Pueden verlo en acción haciendo click aquí.

Recursos de gran ayuda