You are on page 1of 36

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

FACULTAD DE INGENIERIA ELECTRONICA Y ELECTRICA

CURSO: DISEÑO DIGITAL

MÓDULO FPGA + CPLD + SRAM + DRAM + FLASH

Profesor: Ing. Alfredo Granados Ly


MANEJO DEL CPLD DE ALTERA

1.- ETAPA DE ALIMENTACIÓN:

2.- OSCILADORES DEL MÓDULO

FIEE- UNMSM (Diseño Digital) 1


3.- CPLD: EPM240T100C5N

Este CPLD pertenece a la familia de MAX II de Altera, cuenta con 240 elementos lógicos
(LEs) y se pueden llegar a utilizar hasta 80 pines de entrada/salida. Tiene un retardo típico
de 4.7ns de pin a pin en el peor de los casos, pudiendo llegar a trabajar a la frecuencia de
300MHz.

También posee un bloque de memoria Flash de usuario (UFM) de 8Kbit y un sistema


mejorado de programabilidad por sistema (ISP).En condición de reposo (standby) el
consumo de energía puede llegar a 25uA.

Los voltajes de alimentación del dispositivo (core) puede ir de 3.3v /2.5v o 1.8v. Los pines
de entrada/salida (I/O) soporta una variedad de voltajes: 3.3v, 2.5v, 1.8v y 1.5v

En resumen, este CPLD de Altera es de bajo costo y bajo consumo de energía dando
soluciones programables tales como circuitos digitales de baja a mediana complejidad,
puentes de buses, puertos de expansión de I/O, circuitos controladores de secuencias, etc.

FIEE- UNMSM (Diseño Digital) 2


En el módulo de entrenamiento contamos con Leds, pulsadores, switch, display a 7
segementos, conector para LCD, salida VGA, puerto de comunicación RS232, etc. A
continuación se muestra la disposición de los pines del CPLD con los componentes antes
mencionados.

FIEE- UNMSM (Diseño Digital) 3


4.- Manejo de los leds:

Nota: La activación se realiza colocando un 0 lógico en los pines del CPLD.

Ejemplo No1: Activar los leds 6,4,2,0 y apagar los leds 7,5,3,1, también apagar el
buzzer(bell).

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity LEDS is
port(Y: out std_logic_vector(7 downto 0);
bell: out std_logic);
end LEDS;

architecture SOLUCION of LEDS is


begin

Y <= "10101010";
bell <= '1';

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 4


5.- Manejo de los SWITCH Y LEDS.

Ejemplo No2: Reflejar el estado de los switch en los Leds..

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity LEDS is
port(SW: in std_logic_vector(7 downto 0);
Y: out std_logic_vector(7 downto 0);
bell: out std_logic);
end LEDS;
architecture SOLUCION of LEDS is
begin
Y <= SW;
bell <= '1';
end SOLUCION;

FIEE- UNMSM (Diseño Digital) 5


6.- DISPLAY A 7 SEGMENTOS Y SWITCH

Ejemplo No3: Implementar un decodificador a 7 segmentos en el CPLD. Las entradas del


decodificador serán los switch.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

FIEE- UNMSM (Diseño Digital) 6


entity LEDS is
port(SW: in std_logic_vector(3 downto 0);
DISPLAY: out std_logic_vector(7 downto 0);
ENA_DISPLAY: out std_logic_vector(7 downto 0);
bell: out std_logic);
end LEDS;
architecture SOLUCION of LEDS is
begin
bell <= '1';

-- Se activa el Display 8 y el Display-1


ENA_DISPLAY <= "01111110";
--ABCDEFGP
with SW select DISPLAY <= "00000011" when "0000",
"10011111" when "0001",
"00100101" when "0010",
"00001101" when "0011",
"10011001" when "0100",
"01001001" when "0101",
"11000001" when "0110",
"00011111" when "0111",
"00000001" when "1000",
"00011001" when "1001",
"11111111" when others;
end SOLUCION;

7.- PULSADORES Y LEDS

FIEE- UNMSM (Diseño Digital) 7


Ejemplo No4: Reflejar en los leds el estado de los pulsadores.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LEDS is
port(BUTTONS: in std_logic_vector(4 downto 0);
Y: out std_logic_vector(4 downto 0);
bell: out std_logic);
end LEDS;
architecture SOLUCION of LEDS is
begin

bell <= '1';


Y <= BUTTONS;

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 8


8.- MATRIZ DE LEDS 8X8

Ejemplo No5: Activar una línea diagonal en la matriz de leds.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity LEDS is
port(FILA: out std_logic_vector(7 downto 0);
COLUMNA: out std_logic_vector(7 downto 0);
CLK: in std_logic;
bell: out std_logic);
end LEDS;

FIEE- UNMSM (Diseño Digital) 9


-- Generamos una línea vertical de arriba hacia abajo y de
-- izquierda a derecha,

architecture SOLUCION of LEDS is


signal CUENTA: std_logic_vector(17 downto 0);
signal ESTADO: std_logic_vector(2 downto 0);
begin
bell <= '1';

process(clk)
begin
if rising_edge(clk) then
CUENTA <= CUENTA+1;
if CUENTA = 250000 then
CUENTA <= (others=>'0');
ESTADO <= ESTADO+1;
end if;
end if;
end process;

process(ESTADO)
begin
case ESTADO is
when "000"=> FILA <= "11111110"; COLUMNA <= "11111110";
when "001"=> FILA <= "11111101"; COLUMNA <= "11111101";
when "010"=> FILA <= "11111011"; COLUMNA <= "11111011";
when "011"=> FILA <= "11110111"; COLUMNA <= "11110111";
when "100"=> FILA <= "11101111"; COLUMNA <= "11101111";
when "101"=> FILA <= "11011111"; COLUMNA <= "11011111";
when "110"=> FILA <= "10111111"; COLUMNA <= "10111111";
when others=> FILA <= "01111111"; COLUMNA <= "01111111";
end case;
end process;

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 10


9.- INTERCONEXIÓN DEL FPGA Y CPLD

El FPGA y el CPLD también comparten pines en común como se muestra en la siguiente


figura:

A continuación se muestra el listado de los 19 pines en común entre el CPLD y el FPGA.

FIEE- UNMSM (Diseño Digital) 11


Ejemplo No6: Implementación de un contador en el FPGA con las siguientes características:

● UP/DN (1: cuenta ascendente / 0: cuenta descendente).


● RESET (entrada asíncrona),
● ENABLE (1: habilitado / 0: deshabilitado).
● RELOJ de 1Hz.

En primer lugar implementamos los puentes en el CPLD. La señal ENA_D del gráfico es el
habilitador del display que tiene el módulo. Esta señal será reemplazada por la señal
ENABLE_DIS de 8 bits, donde se habilitará sólo al display 1 y los otros estarán apagados.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity PUENTES1 is
port( reset_in,updn_in,enable_in: in std_logic;
reset_out,updn_out,enable_out: out std_logic;
display_out: out std_logic_vector(7 downto 0);
display_in: in std_logic_vector(7 downto 0);
enable_dis: out std_ulogic_vector(7 downto 0);
bell: out std_logic);
end PUENTES1;
architecture SOLUCION of PUENTES1 is
begin
bell <= '1';
reset_out <= reset_in;
updn_out <= updn_in;
enable_out <= enable_in;
display_out <= display_in;
enable_dis <= "11111110";
end SOLUCION;

FIEE- UNMSM (Diseño Digital) 12


Ahora realizamos la implementación del contador binario de 4 bits en el FPGA:

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity CONTADOR is
port(reset, enable, updn, clk: in std_logic;
display: out std_logic_vector(7 downto 0));
end CONTADOR;

architecture SOLUCION of CONTADOR is


signal CUENTA: std_logic_vector (24 downto 0);
signal CUENTA_BIN: std_logic_vector(3 downto 0);
signal X: std_logic;
begin

process(clk)
begin
if rising_edge(clk) then
CUENTA <= CUENTA+1;
if CUENTA = 25000000 then
X <= not X;
CUENTA <= (others=>'0');
end if;
end if;
end process;

FIEE- UNMSM (Diseño Digital) 13


process(X,reset)
begin
if reset='0' then
CUENTA_BIN <= "0000";
elsif rising_edge(X) then
if enable='1' then
if updn='0' then
CUENTA_BIN <= CUENTA_BIN+1;
else
CUENTA_BIN <= CUENTA_BIN-1;
end if;
end if;
end if;
end process;

--pgfedcba
with CUENTA_BIN select display <= "11000000" when "0000",
"11111001" when "0001",
"10100100" when "0010",
"10110000" when "0011",
"10011001" when "0100",
"10010010" when "0101",
"10000010" when "0110",
"11111000" when "0111",
"10000000" when "1000",
"10011000" when "1001",
"10001000" when "1010",
"10000011" when "1011",
"11000110" when "1100",
"10100001" when "1101",
"10000110" when "1110",
"10001110" when others;
end SOLUCION;

FIEE- UNMSM (Diseño Digital) 14


Ejemplo No7: Implementación de un contador de:

● Horas.
● Minutos
● Segundos
● Centésimas de segundos

Utilizando los 8 display a 7 segmentos que tiene el módulo.A continuación se muestra un


diagrama del circuito a implementar..

UC y DC. son los contadores de las centésimas de segundos (00-99)


US y DS: son los contadores de los segundos (00-59)
UM y DM: son los contadores de los minutos (00-59)
UH y DH: son los contadores de las horas (00-23)

FIEE- UNMSM (Diseño Digital) 15


Iniciamos con el código VHDL del decodificador a 7 segmentos y el decodificador de 3 a 8 a
implementar en el CPLD del módulo.

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity DISPLAY8 is
port(DATA: in std_logic_vector(3 downto 0);
IN_DEC3A8: in std_logic_vector(2 downto 0);
DISPLAY: out std_logic_vector(7 downto 0);
ENABLE_DISP: out std_logic_vector(7 downto 0);
bell: out std_logic);
end DISPLAY8;

architecture SOLUCION of DISPLAY8 is


begin
bell <= '1';
with DATA select
display <= "11000000" when "0000",
"11111001" when "0001",
"10100100" when "0010",
"10110000" when "0011",
"10011001" when "0100",
"10010010" when "0101",
"10000010" when "0110",
"11111000" when "0111",
"10000000" when "1000",
"10011000" when "1001",
"10001000" when "1010",
"10000011" when "1011",
"11000110" when "1100",
"10100001" when "1101",
"10000110" when "1110",
"10001110" when others;
with IN_DEC3A8 select
ENABLE_DISP <= "11111110" when "000",
"11111101" when "001",
"11111011" when "010",
"11110111" when "011",
"11101111" when "100",
"11011111" when "101",
"10111111" when "110",
"01111111" when others;

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 16


Los pines utilizados en el CPLD son:

Ahora procederemos a implementar el código VHDL del reloj, así como los temporizadores
y el multiplexor, estos circuitos se implEmentaran en el FPGA.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity RELOJ is
port(clk: in std_logic;
data_out: out std_logic_vector(3 downto 0);
out_deco3a8: buffer std_logic_vector(2 downto 0));
end RELOJ;

architecture SOLUCION of RELOJ is


signal DH,UH,DM,UM,DS,US,DC,UC: std_logic_vector(3 downto 0);
signal CONTADOR: std_logic_vector(17 downto 0);
signal TIMER: std_logic_vector(15 downto 0);
signal X: std_logic;
begin
-- generamos el reloj a 0.01seg
process(clk)
begin
if rising_edge(clk) then
CONTADOR <= CONTADOR+1;
if CONTADOR=250000 then
CONTADOR <= (others=>'0');
X <= NOT X;
end if;
end if;
end process;

FIEE- UNMSM (Diseño Digital) 17


-- realizamos la cuenta de las centésimas,
-- segundos, minutos y horas

process(X)
begin
if rising_edge(X) then
UC <= UC+1;
if UC = 9 then
DC <= DC+1;
UC <= "0000";
if DC=9 then
US <= US+1;
DC <= "0000";
if US=9 then
DS <= DS+1;
US <= "0000";
if DS = 5 then
UM <= UM+1;
DS <= "0000";
if UM = 9 then
DM <= DM+1;
UM <= "0000";
if DM = 5 then
UH <= UH+1;
DM <= "0000";
if UH = 9 then
DH <= DH+1;
UH <= "0000";
elsif UH = 3 then
if (DH = 2) then
DH <= "0000";
UH <= "0000";
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end process;

FIEE- UNMSM (Diseño Digital) 18


-- realizamos la multiplexación cada 1 ms
process(clk)
begin
if rising_edge(clk) then
TIMER <= TIMER+1;
if TIMER = 50000 then
TIMER <= (others=>'0');
out_deco3a8 <= out_deco3a8+1;
end if;
end if;
end process;

with out_deco3a8 select


data_out <= UC when "000",
DC when "001",
US when "010",
DS when "011",
UM when "100",
DM when "101",
UH when "110",
DH when others;

end SOLUCION;

La asignación de los pines en el FPGA son:

FIEE- UNMSM (Diseño Digital) 19


Ejemplo No8: Implementar un cronómetro de minutos y segundos (MM:SS), el circuito
también debe tener 4 entradas para las siguientes funciones:

● Reset (entrada): Detiene el funcionamiento del cronómetro en cualquier momento y


lo coloca en el estado inicial 00:00
● Start/Stop (entrada): Se utiliza para dar por inicio al conteo decreciente de los
MM:SS y para detener en cualquier momento el conteo (no borra la cuenta).
● Minutos (entrada): Se utiliza para incrementar el valor de los minutos del cronómetro
antes de que inicie el conteo decreciente.
● Segundos (entrada): Se utiliza para incrementar el valor de los segundos del
cronómetro antes de que inicie el conteo decreciente.

Una vez que se inicia el conteo decreciente (presionando el pulsador de Start/Stop) ya no


se puede modificar los minutos y segundos.

El conteo se debe mostrar sólo en 4 display a 7 segmentos que tiene el módulo


FPGA+CPLD. Se propone la implementación del siguiente circuito:

FIEE- UNMSM (Diseño Digital) 20


El CPLD se utilizará para la habilitación del display respectivo (ENABLE_DISP) de acuerdo
al valor recibido por el FPGA (IN_DEC3A8), en otras palabras se debe implementar un
decodificador de 3 a 8 activo en nivel bajo.

Además, el CPLD realizará la decodificación a 7 segmentos del valor binario recibido por el
puerto DATA y será mostrado en el puerto DISPLAY para mostrar el número codificado en
el display a 7 segmento habilitado.

Finalmente, tendrá implementado cuatro puentes para dejar pasar las señales de los 4
botones: RESET, START_STOP, MIN y SEG al FPGA.

Por otro lado en el FPGA se implementará un componente divisor de frecuencia de 50MHz


a 1Hz, ya que requerimos de esta señal para llevar la cuenta del tiempo en minutos y
segundos.

Además, debemos implementar 02 contadores (uno para los minutos y otro para los
segundos) que en un momento funcionen de forma independiente cada uno con su propio
reloj, uno para contar los pulsos que provienen del botón de minutos (MIN) y el otro para
contar los pulsos que provienen del botón de segundos (SEG). Pero cuando se inicie el
conteo, ambos contadores deben trabajar de forma unida realizando un conteo descendente
desde el valor en minutos y segundos ingresado previamente..

También debemos implementar una máquina de estado para controlar el funcionamiento del
cronómetro, desde que se pulsa RESET, luego cuando se realiza el incremento de los
minutos y segundos, y finalmente controlar el arranque (START) y parada del conteo
descendente (STOP).

También debemos implementar un circuito para atenuar y/o eliminar los posibles rebotes o
señales aleatorias que se generen de los botones MIN y SEG.

En resumen, los circuitos que serán implementados en el CPLD son:

● Un decodificador de binario a 7 segmentos.


● Un decodificador de 3 a 8 activo en nivel bajo.
● Cuatro puentes para dejar pasar la señal de los pulsadores..

Y los circuitos que serán implementados en el FPGA son:

● Divisor de 50MHz a 1Hz.


● Contadores para los minutos y segundos, con control de cuenta
ascendente/descendente, señal de reset y habilitador.
● Máquina de estado para el control de los contadores.
● Máquina de estado para eliminar los rebotes de los pulsadores.
● Circuito visor para enviar la cuenta de minutos y segundos al CPLD.

FIEE- UNMSM (Diseño Digital) 21


Iniciamos con el código VHDL de los circuitos a implementar en el CPLD.

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity VISOR_CPLD is
port( RESET_IN,START_STOP_IN,MIN_IN,SEG_IN: in std_logic;
DATA: in std_logic_vector(3 downto 0);
IN_DEC3A8: in std_logic_vector(2 downto 0);

RESET_OUT,START_STOP_OUT,MIN_OUT,SEG_OUT: out std_logic;


DISPLAY: out std_logic_vector(7 downto 0);
ENABLE_DISP: out std_logic_vector(7 downto 0);
bell: out std_logic);
end VISOR_CPLD;

architecture SOLUCION of VISOR_CPLD is


begin
RESET_OUT <= NOT RESET_IN;
START_STOP_OUT <= NOT START_STOP_IN;
MIN_OUT <= NOT MIN_IN;
SEG_OUT <= NOT SEG_IN;
bell <= '1';

with DATA select


display <= "11000000" when "0000",
"11111001" when "0001",
"10100100" when "0010",
"10110000" when "0011",
"10011001" when "0100",
"10010010" when "0101",
"10000010" when "0110",
"11111000" when "0111",
"10000000" when "1000",
"10011000" when "1001",
"10001000" when "1010",
"10000011" when "1011",
"11000110" when "1100",
"10100001" when "1101",
"10000110" when "1110",
"10001110" when others;

with IN_DEC3A8 select


ENABLE_DISP <= "11111110" when "000",
"11111101" when "001",

FIEE- UNMSM (Diseño Digital) 22


"11111011" when "010",
"11110111" when "011",
"11101111" when "100",
"11011111" when "101",
"10111111" when "110",
"01111111" when others;

end SOLUCION;

La asignación de los pines es la siguiente:

Las cuatro señales (​RESET_IN,START_STOP_IN,MIN_IN,SEG_IN ​) se


están invirtiendo para que sean activas en nivel alto y no en nivel bajo,
debido a que el estado de los pulsadores es como se muestra en el
siguiente gráfico. Cuando no están presionados los pulsadores ingresa un
uno lógico al CPLD, y cuando se presiona ingresa un cero lógico.

Hay que tener en cuenta la ocurrencia de los rebotes cuando se presione los pulsadores.

FIEE- UNMSM (Diseño Digital) 23


Ahora continuamos con la implementación de cada uno de los circuitos en el FPGA.

● Implementación del divisor de frecuencia. Sabemos que la frecuencia del oscilador


del FPGA es de 50MHz, lo que hacemos es contar 25’000,000 de pulsos de reloj
(que en tiempo será 0.5 segundo) y conmutar la salida cuando llegue a este valor.
De esta manera generamos una señal con un periodo de 1 segundo.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity DIV_1HZ is
port(clk: in std_logic;
X: buffer std_logic);
end DIV_1HZ;

architecture SOLUCION of DIV_1HZ is


signal CUENTA: std_logic_vector(24 downto 0);
begin

process (clk)
begin
if rising_edge(clk) then
CUENTA <= CUENTA+1;
if CUENTA=25000000 then
CUENTA<=(others=>'0');
X <= not X;
end if;
end if;
end process;

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 24


● Implementación de los contadores de segundos y minutos. Para la implementación
de estos contadores debemos tener en cuenta que inicialmente tienen entradas de
reloj independiente, ya que se pueden incrementar los minutos y segundos de
acuerdo al tiempo a contar. Por ejemplo se puede establecer el cronómetro en 3
minutos y 20 segundos con las entradas: MIN (para los minutos) y SEG (para los
segundos):

Luego estos contadores deben ir en conteo decreciente cuando se pulse la señal de


START_STOP.

La idea del circuito a implementar se muestra en el siguiente gráfico:

Donde:
➔ CLK: es la señal de 1Hz.
➔ Y es una señal para iniciar (START) o detener (STOP) la cuenta del
cronómetro (cuando Z = 1).
➔ SEG es la señal que proviene de un pulsador y servirá como entrada de reloj
para los segundos (cuando Z = 0)
➔ MIN es la señal que proviene de un pulsador y servirá como entrada de reloj
para los minutos (cuando Z = 0)
➔ US y DS son señales que contienen la cuenta en BCD de los segundos
(00-59).
➔ UM y DM son señales que contienen la cuenta en BCD de los minutos
(00-59).
➔ CLK3 es la señal de reloj que incrementará los minutos cuando haya ocurrido
un desbordamiento en el contador de los segundos (cuando Z=1).
➔ RESET es la señal que fuerza a que los contadores de minutos y segundos
inicien en 00:00
➔ X es una señal de control de cuenta ascendente (cuando X=0) o
descendente (cuando X=1),.

El programa en VHDL es el siguiente:

library ieee;
use ieee.std_logic_1164.all;

FIEE- UNMSM (Diseño Digital) 25


use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity contadores_MS is
port(clk,min,seg,x,y,z,reset: in std_logic;
US,DS,UM,DM: buffer std_logic_vector(3 downto
0));
end contadores_MS;

architecture solucion of contadores_MS is


signal CLK1,CLK2,CLK3,CLK4: std_logic;
begin
CLK1 <= clk and y;
CLK2 <= CLK1 when z='1' else seg;
CLK4 <= CLK3 when z='1' else min;

process(CLK2,reset)
begin
if reset='1' then
US <= "0000";
DS <= "0000";
elsif rising_edge(CLK2) then
if x='0' then
US <= US+1;
if US = 9 then
US <= "0000";
DS <= DS+1;
if DS=5 then
DS <= "0000";
end if;
end if;
else
US <= US-1;
if US = 0 then
US <= "1001";
DS <= DS - 1;
if DS=0 then
DS <= "0101";
clk3 <='1';
else
clk3 <='0';
end if;
end if;
end if;
end if;
end process;

FIEE- UNMSM (Diseño Digital) 26


process(CLK4,reset)
begin
if reset='1' then
UM <= "0000";
DM <= "0000";
elsif rising_edge(CLK4) then
if x='0' then
UM <= UM+1;
if UM = 9 then
UM <= "0000";
DM <= DM+1;
if DM=9 then
DM <= "0000";
end if;
end if;
else
UM <= UM-1;
if UM = 0 then
UM <= "1001";
DM <= DM - 1;
if DM=0 then
DM <= "0101";
end if;
end if;
end if;
end if;
end process;

end solucion;

● Implementación de la unidad de control del cronómetro. Utilizaremos una máquina


de Moore para tal fin.

FIEE- UNMSM (Diseño Digital) 27


Donde:

➔ SS: es la señal del pulsador de START_STOP.


➔ RESET: es la señal del pulsador de RESET.
➔ Las tres salidas de cada estado corresponden a las señales de control para el
contador de minutos y segundos: X,Y,Z respectivamente.

X: define si el conteo es ascendente (X=0) o descendente (X=1),


Y: Habilitador de señal de reloj de 1Hz.(Y=0 contadores OFF/ Y=1 contadores ON)
Z: Selector del multiplexor (Z=1 conteo descendente de segundos y minutos, Z=0
conteo ascendente con pulsador de minutos y con pulsador de segundos).

El código VHDL para el diseño de la unidad de control es:

library ieee;
use ieee.std_logic_1164.all;

entity mef_crono is
port(clk,reset,ss: in std_logic;
x,y,z: out std_logic);
end mef_crono;

architecture solucion of mef_crono is


type estados is (S0,S1,S2,S3,S4);

FIEE- UNMSM (Diseño Digital) 28


signal ep,es: estados;
begin

process(clk,reset)
begin
if reset='1' then
ep <= S0;
elsif rising_edge(clk) then
ep <= es;
end if;
end process;
process(ep,ss)
begin
es <= ep;
case ep is
when S0=> x <= '0'; y <='0'; z <='0';
if ss='1' then es<=S1;
else es <= S0; end if;

when S1=> x <= '1'; y <='1'; z <='1';


if ss='1' then es<=S1;
else es <= S2; end if;

when S2=> x <= '1'; y <='1'; z <='1';


if ss='1' then es<=S3;
else es <= S2; end if;

when S3=> x <= '1'; y <='0'; z <='1';


if ss='1' then es<=S3;
else es <= S4; end if;

when S4=> x <= '1'; y <='0'; z <='1';


if ss='1' then es<=S1;
else es <= S4; end if;
end case;
end process;

end solucion;

● Implementación del circuito antirebote: Si conectamos directamente los pulsadores a


las entradas MIN y SEG, es muy probable que cuando presionemos uno de los
botones la cuenta no se incremente de uno en uno. Esto es debido a los rebotes que
generan los dispositivos electromecánico como los pulsadores:

FIEE- UNMSM (Diseño Digital) 29


Por esa razón debemos implementar un circuito que pueda atenuar esas dos
entradas (MIN y SEG) que provienen de los pulsadores. Por lo tanto construimos
una máquina de estado que permita determinar si la entrada es estable por varios
ms (al rededor de los 50ms). Así tenemos el siguiente diagrama de estado:

Para generar la señal de reloj interna con un periodo de 50ms aproximadamente


para la máquina de estado, utilizamos un contador de 21 bits, donde el bit de mayor
peso (bit 20 del contador) será la que se comporte como señal de reloj de la
máquina de estado.

El código VHDL para el circuito antirebote es el siguiente:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity anti_rebote is

FIEE- UNMSM (Diseño Digital) 30


port(clk,entrada: in std_logic;
salida: out std_logic);
end anti_rebote;

architecture solucion of anti_rebote is


type estados is (S0,S1,S2,S3);
signal EA: estados;
signal contador: std_logic_vector(20 downto 0);
signal clk_2: std_logic;
begin

process(clk)
begin
if rising_edge(clk) then
contador <= contador+1;
end if;

end process;

clk_2 <= contador(20);

process(clk_2)
begin
if rising_edge(clk_2) then
case EA is
when S0=> salida <= '0';
if entrada='0' then EA <= S0;
else EA <= S1; end if;
when S1=> salida <= '0';
if entrada='0' then EA <= S0;
else EA <= S2; end if;
when S2=> salida <= '1';
if entrada='0' then EA <= S3;
else EA <= S2; end if;
when S3=> salida <= '1';
if entrada='0' then EA <= S0;
else EA <= S2; end if;
end case;
end if;
end process;
end solucion;

● Implementación del circuito visor: Este circuito permite multiplexar las señales de los
contadores: US,DS,UM,DM y enviarlos al CPLD, para que éste a su vez los muestre
en los display a 7 segmentos.

FIEE- UNMSM (Diseño Digital) 31


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity VISOR_FPGA is
port(clk: in std_logic;
A,B,C,D,E,F,G,H: in std_logic_vector(3 downto 0);
data_out: out std_logic_vector(3 downto 0);
out_deco3a8: buffer std_logic_vector(2 downto 0));
end VISOR_FPGA;

architecture SOLUCION of VISOR_FPGA is


signal TIMER: std_logic_vector(15 downto 0);
begin
-- realizamos la multiplexación cada 1 ms
process(clk)
begin
if rising_edge(clk) then
TIMER <= TIMER+1;
if TIMER = 50000 then --50000
TIMER <= (others=>'0');
out_deco3a8 <= out_deco3a8+1;
end if;
end if;
end process;

with out_deco3a8 select


data_out <= A when "000",
B when "001",
C when "010",
D when "011",
E when "100",
F when "101",
G when "110",
H when others;

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 32


Implementación del circuito final, utilizando los componentes previamente diseñados.

FIEE- UNMSM (Diseño Digital) 33


El código VHDL del circuito final es el siguiente:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity cronometro is
port(clk,reset,min,seg,start_stop: in std_logic;
data_out: out std_logic_vector(3 downto 0);
out_deco3a8: out std_logic_vector(2 downto 0));
end cronometro;

architecture SOLUCION of cronometro is


component DIV_1HZ
port(clk: in std_logic;
X: buffer std_logic);
end component;

component mef_crono
port(clk,reset,ss: in std_logic;
x,y,z: out std_logic);
end component;

component contadores_MS
port(clk,min,seg,x,y,z,reset: in std_logic;
US,DS,UM,DM: buffer std_logic_vector(3 downto 0));
end component;

component VISOR_FPGA
port(clk: in std_logic;
A,B,C,D,E,F,G,H: in std_logic_vector(3 downto 0);
data_out: out std_logic_vector(3 downto 0);
out_deco3a8: buffer std_logic_vector(2 downto 0));
end component;

component anti_rebote
port(clk,entrada: in std_logic;
salida: out std_logic);
end component;

signal CLK_1,X,Y,Z: std_logic;


signal A,B,C,D,E: std_logic_vector(3 downto 0);
signal MIN_AR,SEG_AR: std_logic;

FIEE- UNMSM (Diseño Digital) 34


begin

E <= "0000";
U0: DIV_1HZ port map (CLK,CLK_1);
U1: mef_crono port map (CLK_1,reset,start_stop,x,y,z);
U2: contadores_MS port map(CLK_1,MIN_AR,SEG_AR,x,y,
z,reset,A,B,C,D);
U3: VISOR_FPGA port map(CLK,A,B,C,D,E,E,E,E,data_out,
out_deco3a8);
U4: anti_rebote port map(CLK,min,min_AR);
U5: anti_rebote port map(CLK,seg,seg_AR);

end SOLUCION;

FIEE- UNMSM (Diseño Digital) 35

You might also like