Sei sulla pagina 1di 5

Universidad Nacional De Colombia

Facultad de Ingeniería
Manuel Octavio Acevedo Iles; Cristian Camilo López Melo; Jose Esteban Rodriguez Quintero
moacevedoi@unal.edu.co; criclopezmel@unal.edu.co; jerodriguezq@unal.edu.co

Informe 3:​ Circuitos Síncronos y Contadores

Resumen:
El siguiente informe de laboratorio presenta los resultados obtenidos del desarrollo de un contador de 0 a
9999 programado en una placa FPGA Nexys 2, presentando el funcionamiento del programa, su
diagrama de bloques junto con las diferentes características del diseño y de su implementación.

Palabras clave:
FPGA, Contador, Multiplexor, Divisor de Frecuencia, Clock, Reset, Flip Flop, Registro.

Introducción:
En la electrónica digital es necesario implementar circuitos que trabajen a un tiempo determinado con
distintas frecuencias; para esto, en la FPGA se trabaja con un oscilador interno de 50 Mhz que se
manipula para obtener unas frecuencias precisas determinadas, con las cuales se logran realizar
distintas operaciones que permiten el desarrollo de esta práctica. Es así, que utilizando los
conocimientos adquiridos en el lenguaje de programación de hardware Verilog, se realizan distintos
divisores de frecuencia para poder realizar el contador, para poder manejar el encendido de los display
de la FPGA y para poder, en última instancia, demostrar el avance en lo aprendido al integrar todo lo
usado en prácticas anteriores (codificadores, manejo de buses, multiplexores, entre otros) junto con lo
nuevo.

Resultados y análisis de resultados:

Los resultados a presentar se centran primordialmente en la explicación del código desarrollado para la
programación del contador, para esto se adjuntará el archivo ‘.v’, así como un diagrama de bloques que
representa la implementación de este código. A partir de este último se desglosa la explicación de cada
una de las partes del programa; correspondiendo lo anteriormente dicho a la presentación de los
resultados obtenidos durante la práctica.
Fig 1. Diagrama de Bloques Contador total

Contador total (contador_t):

El módulo del contador total (contador_t) corresponde al módulo principal del programa desarrollado.
A este ingresan un bus de 2 bits para los interruptores (IN), el reset (rst) y el oscilador de 50Mhz de la
FPGA (clk). El bus de los interruptores sirve como variable de control para poder multiplexar los divisores
de frecuencia del contador para que, como pide la práctica, cuente en intervalos de 1s, 100ms o 10ms.
Las salidas de este módulo son dos buses, uno de 7 bits (DI) destinado a los segmentos del display para
mostrar los diferentes números; y un bus de 4 bits (K) para los cátodos de los display que, al
multiplexarlo con una frecuencia determinada hace que, a los ojos del usuario, se muestre los cuatro
displays encendidos.
Dentro del contador total, se encuentren los diferentes submódulos que realizan las operaciones para
que el contador funcione; las variables utilizadas en estos submódulos se crean como ​wire​s en el
contador total.
En total hay cuatro submódulos los cuales se presentan a continuación:

Divisor de frecuencia:
El primer módulo que presentamos es el divisor de frecuencia (freqdiv).
Las entradas que se tienen a este módulo son el oscilador de la FPGA (clk), el reset (rst) y la salida es la
señal con la frecuencia determinada (clkout).
Para realizar la división de la frecuencia es necesario, primero, declarar tres parámetros, uno global
(divfactor) y dos locales (maxCount y counterWidth).
El primer parámetro ​divfactor asigna el valor al cual se dividirá la frecuencia, en el módulo del contador
total este valor se asigna con un # seguido factor de división.
El parámetro local ​maxCount ​divide el ​divfactor​ en dos para así, marcar el punto de cambio de estado.
El otro parámetro local ​counterWidth es igual al logaritmo en base 2 del ​Maxcount, ​resultado con el cual
se puede determinar el número de bits que debe tener un registro llamado Q.
El funcionamiento del divisor de frecuencia es de tipo condicional así, primero, se mira el estado del reset
y, si es 1, empieza a aumentar el valor de Q hasta que sea igual al valor de ​maxCount punto en el que el
clock cambia de estado, generando la frecuencia, y el Q vuelve a 0 para empezar de nuevo el ciclo; si el
valor de reset cambia a 0 inmediatamente el valor de Q y del ​clkOut​ se hacen 0.

En el contador total, se usaron seis módulos ​freqdiv, ​tres de ellos para variar las frecuencias de conteo
(1s, 100ms o 10ms) utilizando parámetros de division de frecuencia (​divfactor)​ de 50000000 (llamada
fre1)​, 5000000 (​fre5) y 500000 (​fre3)​; y los otros tres para los multiplexores de los cátodos de los display
para mostrarlo de manera continua al ojo humano, para estos se usó un ​divfactor​ de 125000.

Contador_0:

El módulo “contador_0” es el centro del funcionamiento del contador completo.


El funcionamiento de este es bastante sencillo y se centra en que cada flanco de subida de una señal
de reloj que se ingrese y mientras el valor de rst sea diferente de 0, se ejecutarán una serie de
operaciones que generan los números del 0 al 9999.
Las entradas de este módulo corresponden únicamente a una señal de reloj y de la señal de rst,
mientras que las salidas corresponden a 4 registros de 4 bits de longitud, donde cada uno de estos
almacenará el número que se debe mostrar en cada uno de los displays, donde Q corresponde al primer
display y Q3 al último display.
Para generar los números hasta el 9999, como ya se dijo se generan una serie de operaciones cada vez
que se tenga un flanco de subida de la señal de clock:
Si el valor de rst es 0 se asignan a todas las Qn el valor de 4’d0, si no se cumple esta condición se entra
a preguntar por el estado de cada una de las Qn. Si el valor de Q (display 1) es diferente de 9 ( se
representa por 4’d9) se aumentará en 1 el valor de Q, en caso contrario, se inicializa el valor de Q y se
preguntará por el estado de Q1. Si Q1 tiene un valor diferente de 9 se aumentará en 1 su valor, en caso
contrario se reinicializar el valor de Q1 y se preguntará por el estado del siguiente valor de Qn (es decir
por Q2).
Este proceso se desarrolla para los 4 valores de Qn, donde cuando se llegue a la condición de que Q3
(el valor del último display) sea 9 se reinicializan todas las Qn.

Cabe aclarar que la frecuencia de la señal de reloj que controla estas operaciones dependerá de la
velocidad con la que se desea contar, para nuestro caso se tiene la posibilidad de contar cada segundo
(señal de cont_1) cada 10ms (señal de cont_10) y cada 100ms (señal de cont_100).

Multiplexor:

El módulo del multiplexor es usado para la multiplexión de los cátodos de los displays (a una velocidad
determinada por la frecuencia de la señal mul) así como del número que se mostrará en cada display.
Su funcionamiento se centra en una señal dada (mul) la cual se configuró con una frecuencia de 400Hz a
partir de la cual se comienza a variar el valor de un registro de 2 bits entre sus diferentes posibilidades
cada vez que se tenga un flanco de bajada de la señal (mul). Con esto se obtendrá a la salida un registro
de 2 bits que varía su valor cada 2,5 ms, velocidad suficiente a la que se no se observan parpadeos
entre la multiplexión de los diferentes displays.
El registro (mux) es al que se le varía el valor, inicianizandolo este en (2’b11) con lo que al primer flanco
de bajada se tendrá la condición para la cual se encenderá el primer display, y cada vez que se tenga un
flanco de bajada se variará su valor cambiando el display que se enciende.
La frecuencia de la señal de reloj que entra a este módulo es obtenida del divisor de frecuencias descrito
anteriormente

Decodificador:

Para el módulo del decodificador (decodificador) la entrada es un bus de 4 bits (B) y la salida es un bus
de 7 bits (A).
Se realizó la tabla de verdad para formar los números desde el 0 hasta el 9 en el display 7 segmentos,
con esta se obtuvieron las ecuaciones y después se minimizaron utilizando el software Electronic
Workbench; una vez se tienen las ecuaciones, se puede asignar los valores a esa ecuación y así,
transformar los bits de entrada en números visibles en el display.

Dentro del módulo principal se ingresa un bus de 4bits que corresponderá al bus obtenido al multiplexar
4 buses que representan cada uno el número que se desea mostrar en cada uno de los display, de este
se obtiene un bus de 7 bits que será conectado a cada uno de los segmentos de los displays generando
así el número deseado en el display deseado.

Conclusiones:

Cuando se tienen problemas complejos, se hace necesario la simplificación de este haciendo uso de
funciones que desglosen el problema, para el caso de la programación desarrollada usando Verilog, se
desarrolla a través de módulos donde cada uno de estos representará uno de las funciones que
componen el problema, posteriormente se genera una función general que controle los tiempos y la
forma como se llaman a los módulos secundarios.
El proceso de programación de compuertas lógicas se hace mucho más sencillo al aplicar convenciones
de programa, tales como la or (|), la xor (^) y la and (&), simplificando muchísimo la escritura de
programas extensos; adicionalmente el uso y definición de buses ahorran mucho espacio en los
programas ya que facilitan y a cortan la forma en la que se definen las diferentes variables, generando
mayor orden en la escritura del programa.
Adicionalmente se ha integrado al repertorio de herramientas el uso de señales de reloj, por medio de las
cuales se pueden desarrollar aplicaciones que requieran de circuitos síncronos, principalmente el uso de
flip-flops, los cuales son simulados usando principios basicos de logica (operaciones if y de asignación).
Siguiendo con lo anterior se ha observado que es posible simplificar la implementación de diversos
circuitos (multiplexores, divisores de frecuencia, entre otros) usando operaciones básicas de lógica, por
medio de las cuales es posible simular el comportamiento de cada uno de estos elementos pero
simplifica su implementación así como facilitan su escritura y análisis.

Bibliografía:
● Xilinx​,XST User Guide.​ [online]. URL:​ ​https://www.xilinx.com/itp/xilinx10/books/docs/xst/xst.pdf
● Electronics Workbench v5.12.
● Floyd, Thomas,​ Fundamentos de sistemas digitales.​9 ed. Ed: Pearson. 2006.

Potrebbero piacerti anche