You are on page 1of 36

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

FACULTAD DE INGENIERIA ELECTRONICA Y ELECTRICA

CURSO: DISEO DIGITAL

MDULO FPGA + CPLD + SRAM + DRAM + FLASH

Profesor: Ing. Alfredo Granados Ly


MANEJO DEL CPLD DE ALTERA

1.- ETAPA DE ALIMENTACIN:

2.- OSCILADORES DEL MDULO

FIEE- UNMSM (Diseo Digital) 1


3.- CPLD: EPM240T100C5N

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

Tambin posee un bloque de memoria Flash de usuario (UFM) de 8Kbit y un sistema


mejorado de programabilidad por sistema (ISP).En condicin de reposo (standby) el
consumo de energa puede llegar a 25uA.

Los voltajes de alimentacin 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 energa dando
soluciones programables tales como circuitos digitales de baja a mediana complejidad,
puentes de buses, puertos de expansin de I/O, circuitos controladores de secuencias, etc.

FIEE- UNMSM (Diseo Digital) 2


En el mdulo de entrenamiento contamos con Leds, pulsadores, switch, display a 7
segementos, conector para LCD, salida VGA, puerto de comunicacin RS232, etc. A
continuacin se muestra la disposicin de los pines del CPLD con los componentes antes
mencionados.

FIEE- UNMSM (Diseo Digital) 3


4.- Manejo de los leds:

Nota: La activacin se realiza colocando un 0 lgico en los pines del CPLD.

Ejemplo No1: Activar los leds 6,4,2,0 y apagar los leds 7,5,3,1, tambin 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 (Diseo 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 (Diseo Digital) 5


6.- DISPLAY A 7 SEGMENTOS Y SWITCH

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


decodificador sern los switch.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

FIEE- UNMSM (Diseo 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 (Diseo 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 (Diseo Digital) 8


8.- MATRIZ DE LEDS 8X8

Ejemplo No5: Activar una lnea 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 (Diseo Digital) 9


-- Generamos una lnea 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 (Diseo Digital) 10


9.- INTERCONEXIN DEL FPGA Y CPLD

El FPGA y el CPLD tambin comparten pines en comn como se muestra en la siguiente


figura:

A continuacin se muestra el listado de los 19 pines en comn entre el CPLD y el FPGA.

FIEE- UNMSM (Diseo Digital) 11


Ejemplo No6: Implementacin de un contador en el FPGA con las siguientes caractersticas:

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


RESET (entrada asncrona),
ENABLE (1: habilitado / 0: deshabilitado).
RELOJ de 1Hz.

En primer lugar implementamos los puentes en el CPLD. La seal ENA_D del grfico es el
habilitador del display que tiene el mdulo. Esta seal ser reemplazada por la seal
ENABLE_DIS de 8 bits, donde se habilitar slo al display 1 y los otros estarn 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 (Diseo Digital) 12


Ahora realizamos la implementacin 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 (Diseo 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 (Diseo Digital) 14


Ejemplo No7: Implementacin de un contador de:

Horas.
Minutos
Segundos
Centsimas de segundos

Utilizando los 8 display a 7 segmentos que tiene el mdulo.A continuacin se muestra un


diagrama del circuito a implementar..

UC y DC. son los contadores de las centsimas 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 (Diseo Digital) 15


Iniciamos con el cdigo VHDL del decodificador a 7 segmentos y el decodificador de 3 a 8 a
implementar en el CPLD del mdulo.

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 (Diseo Digital) 16


Los pines utilizados en el CPLD son:

Ahora procederemos a implementar el cdigo 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 (Diseo Digital) 17


-- realizamos la cuenta de las centsimas,
-- 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 (Diseo Digital) 18


-- realizamos la multiplexacin 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 asignacin de los pines en el FPGA son:

FIEE- UNMSM (Diseo Digital) 19


Ejemplo No8: Implementar un cronmetro de minutos y segundos (MM:SS), el circuito
tambin debe tener 4 entradas para las siguientes funciones:

Reset (entrada): Detiene el funcionamiento del cronmetro 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 cronmetro
antes de que inicie el conteo decreciente.
Segundos (entrada): Se utiliza para incrementar el valor de los segundos del
cronmetro 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 slo en 4 display a 7 segmentos que tiene el mdulo


FPGA+CPLD. Se propone la implementacin del siguiente circuito:

FIEE- UNMSM (Diseo Digital) 20


El CPLD se utilizar para la habilitacin 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.

Adems, el CPLD realizar la decodificacin a 7 segmentos del valor binario recibido por el
puerto DATA y ser mostrado en el puerto DISPLAY para mostrar el nmero codificado en
el display a 7 segmento habilitado.

Finalmente, tendr implementado cuatro puentes para dejar pasar las seales 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 seal para llevar la cuenta del tiempo en minutos y
segundos.

Adems, 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 botn de minutos (MIN) y el otro para
contar los pulsos que provienen del botn 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..

Tambin debemos implementar una mquina de estado para controlar el funcionamiento del
cronmetro, 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).

Tambin debemos implementar un circuito para atenuar y/o eliminar los posibles rebotes o
seales aleatorias que se generen de los botones MIN y SEG.

En resumen, los circuitos que sern 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 seal de los pulsadores..

Y los circuitos que sern implementados en el FPGA son:

Divisor de 50MHz a 1Hz.


Contadores para los minutos y segundos, con control de cuenta
ascendente/descendente, seal de reset y habilitador.
Mquina de estado para el control de los contadores.
Mquina de estado para eliminar los rebotes de los pulsadores.
Circuito visor para enviar la cuenta de minutos y segundos al CPLD.

FIEE- UNMSM (Diseo Digital) 21


Iniciamos con el cdigo 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 (Diseo Digital) 22


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

end SOLUCION;

La asignacin de los pines es la siguiente:

Las cuatro seales (RESET_IN,START_STOP_IN,MIN_IN,SEG_IN ) se


estn 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 grfico. Cuando no estn presionados los pulsadores ingresa un
uno lgico al CPLD, y cuando se presiona ingresa un cero lgico.

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

FIEE- UNMSM (Diseo Digital) 23


Ahora continuamos con la implementacin de cada uno de los circuitos en el FPGA.

Implementacin del divisor de frecuencia. Sabemos que la frecuencia del oscilador


del FPGA es de 50MHz, lo que hacemos es contar 25000,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 seal 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 (Diseo Digital) 24


Implementacin de los contadores de segundos y minutos. Para la implementacin
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 cronmetro 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 seal de


START_STOP.

La idea del circuito a implementar se muestra en el siguiente grfico:

Donde:
CLK: es la seal de 1Hz.
Y es una seal para iniciar (START) o detener (STOP) la cuenta del
cronmetro (cuando Z = 1).
SEG es la seal que proviene de un pulsador y servir como entrada de reloj
para los segundos (cuando Z = 0)
MIN es la seal que proviene de un pulsador y servir como entrada de reloj
para los minutos (cuando Z = 0)
US y DS son seales que contienen la cuenta en BCD de los segundos
(00-59).
UM y DM son seales que contienen la cuenta en BCD de los minutos
(00-59).
CLK3 es la seal de reloj que incrementar los minutos cuando haya ocurrido
un desbordamiento en el contador de los segundos (cuando Z=1).
RESET es la seal que fuerza a que los contadores de minutos y segundos
inicien en 00:00
X es una seal 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 (Diseo 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 (Diseo 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;

Implementacin de la unidad de control del cronmetro. Utilizaremos una mquina


de Moore para tal fin.

FIEE- UNMSM (Diseo Digital) 27


Donde:

SS: es la seal del pulsador de START_STOP.


RESET: es la seal del pulsador de RESET.
Las tres salidas de cada estado corresponden a las seales 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 seal 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 cdigo VHDL para el diseo 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 (Diseo 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;

Implementacin 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 electromecnico como los pulsadores:

FIEE- UNMSM (Diseo Digital) 29


Por esa razn debemos implementar un circuito que pueda atenuar esas dos
entradas (MIN y SEG) que provienen de los pulsadores. Por lo tanto construimos
una mquina 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 seal de reloj interna con un periodo de 50ms aproximadamente


para la mquina de estado, utilizamos un contador de 21 bits, donde el bit de mayor
peso (bit 20 del contador) ser la que se comporte como seal de reloj de la
mquina de estado.

El cdigo 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 (Diseo 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;

Implementacin del circuito visor: Este circuito permite multiplexar las seales 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 (Diseo 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 multiplexacin 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 (Diseo Digital) 32


Implementacin del circuito final, utilizando los componentes previamente diseados.

FIEE- UNMSM (Diseo Digital) 33


El cdigo 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 (Diseo 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 (Diseo Digital) 35

You might also like