Está en la página 1de 5

Autor: Patricio Villacs Guilln 2011

EJEMPLOS DE VHDL
En los ejercicios de vhdl con Flip-Flop y contador, van utilizar una nueva instraccin: Process.

Dentro de esta ustedes pueden utilizar las instrucciones condificionales if-else, if-elsif, case, entre
otras. Pero ojo solo dentro de este bloque.

Existen dos formas de implementarlo.

Forma 1 Forma 2
PROCESS PROCESS(lista_sensibilidad)
BEGIN BEGIN
WAIT UNTIL __clk_signal = ---instrucciones
'1'; end process;
---instrucciones.
END PROCESS;

En la segunda forma, la lista de sensibilidad no es nada ms que las variables las cuales van a
producir que se ejecute lo que esta dentro del bloque Process.

A continuacin les dejo ejemplos de la utilizacin de los mismos, en contadores y Flip-Flop.

PROBLEMA1.
Autor: Patricio Villacs Guilln 2011

Escribimos la librera y componentes de la misma que vamos a utilizar. Adems codficamos la


entidad total y como nos indica las especificaciones del ejercicio.
library ieee;
use ieee.std_logic_1164.all;

ENTITY contador IS
PORT(
clk, clr, inicio: IN std_logic;
Q: buffer std_logic_vector(3 downto 0);
Diez: out std_logic);
END contador;

Luego escrbimos la arquitectura del contador, de acuerdo a todas las especificaciones del ejercicio.
ARCHITECTURE a OF contador IS
BEGIN
PROCESS(clr, clk)
BEGIN
%Realizamos la accin del reset, es decir ponemos a ceros la salida %
%Esta seal es asincronica por eso va antes de preguntar por el flanco de reloj %
if clr='0' then Q<="0000";
%A continuacin indicamos que el contador funciona con flancos de reloj y son positivos%
elsif (clk'event and clk='1') then
if inicio='1' then
case Q is
when "0000" => Q<="1001";
when "1001" => Q<="1000";
when "1000" => Q<="0111";
when "0111" => Q<="0110";
when "0110" => Q<="0101";
when "0101" => Q<="0100";
when "0100" => Q<="0011";
when "0011" => Q<="0010";
when "0010" => Q<="0001";
when others => Q<="0000";
end case;
end if;
end if;
end process;
Diez<='1' when Q="0001";
END a;

Nota: No se olviden de cerrar todo los bloques abiertos con su respectivo end. Adems tengan
encuenta que las sentencias if y case fueron usadas dentro del bloque process.

A continuacin les dejo el diagrama de tiempos del contador realizado.


Autor: Patricio Villacs Guilln 2011

PROBLEMA2.

En este problema deben recordar que si ustedes no modifican el valor de Q (salida), este
mantendr su valor anterior.
library ieee;
use ieee.std_logic_1164.all;

ENTITY contador IS
PORT(
clk, clr: in std_logic;
en, ld: in std_logic;
Q: buffer std_logic_vector(2 downto 0));
END contador;

ARCHITECTURE a OF contador IS
BEGIN
PROCESS(clr, clk)
BEGIN
if clr='0' then Q<="000";
elsif (clk'event and clk='1') then
if en='1' then
if Ld='1' then Q<="111"; else
case Q is
when "111" => Q<="110";
when "110" => Q<="101";
when "101" => Q<="100";
when "100" => Q<="011";
when "011" => Q<="010";
when "010" => Q<="001";
when "001" => Q<="000";
when others => Q<="111";
end case;
end if;
end if;
end if;
end process;
Autor: Patricio Villacs Guilln 2011
END a;
Fjense que yo no hago el caso contrario del if de la seal enable. A continuacin el diagrama de
tiempo.

Noten que el efecto de la seal reset, es arbitraria as recibimos un flanco de reloj.

PROBLEMA3.

library ieee;
use ieee.std_logic_1164.all;

ENTITY FF_TR IS
PORT(
clk, clr: in std_logic;
T, R: in std_logic;
Q, Qn: buffer std_logic);
END FF_TR;

ARCHITECTURE a OF FF_TR IS
BEGIN
PROCESS(clr, clk)
BEGIN
if clr='0' then Q<='0';
elsif (clk'event and clk='0') then
case T&R is
when "00" => Q<=not(Q);
%En la siguiente lnea pueden poner los siguiente tambin when "01" => %
when "01" => Q<=Q
when "10" => Q<='0';
when others => Q<=not(Q);
end case;
end if;
end process;
Autor: Patricio Villacs Guilln 2011
Qn<=not(Q);
END a;

También podría gustarte