Está en la página 1de 19

EJEMPLOS PRACTICOS EN VHDL

Elaborado por: Américo Álvarez Surci


Con el fin de ayudar a la comunidad estudiantil de nivel básico, en la comprensión
de la descripción circuital mediante VHDL, se presenta esta recopilación de
ejemplos publicados en el blog http://electronico-etn.blogspot.com Todos estos
ejemplos fueron probados en las tarjetas FPGA de la facultad de ingeniería de la
UMSA. Se incluye la descripción de un circuito mas grande como lo es un reloj
digital a manera de ejemplo.

LISTA DE EJEMPLOS
 Ejemplo 01: diseñar en VHDL, una compuerta norex  Ejemplo 02: Diseñar en VHDL,
un sistema que cumpla con F=A'B'+B'C+AC'  Ejemplo 03: Diseñar en VHDL, un
multiplexor de 4 entradas (E3,E2,E1,E0) y una salida F. Con 2 variables de
selección S1,S0  Ejemplo 04: Diseñar en VHDL, un decodificador completo de 3
entradas (I2,I1,I0)y 8 salidas (S7,S5,S4,...,S0)  Ejemplo 05: Diseñar en VHDL, un
decodificador completo de 3 entradas (I2,I1,I0)y 8 salidas (S7,S5,S4,...,S0). Con
señal enable/disable  Ejemplo 06: Diseñar en VHDL, un codificador de 4:2 con
prioridad  Ejemplo 07: Diseñar en VHDL, un codificador 4:2 (como el ejemplo
anterior), sin tanto código. realizarlo más eficientemente  Ejemplo 08: Diseñar en
VHDL, un comparador de 4 bits , que a la salida te de información de A mayor que B,
A menor que B y A Igual que B.  Ejemplo 09: Diseñar en VHDL, un comparador de 4
bits, que a la salida te de información de A mayor que B, A menor que B y A Igual
que B. METODO 2  Ejemplo 10: Diseñar en VHDL, un comparador de 4 bits CON SIGNO,
que a la salida te de información de A mayor que B, A menor que B y A Igual que B 
Ejemplo 11: Diseñar en VHDL, un multiplexor de 16 a 1 con 4 variables de selección.
USANDO multiplexores de 4 a 1  Ejemplo 12: Diseñar en VHDL, un transcodificador,
del código 84-2-1 al Johnson de 5bits  Ejemplo 13: Diseñar en VHDL, generador de
bits para la coreccion de errores de un Bcd aiken  Ejemplo 14: Diseñar en VHDL,
diseñe un sumador simple, sin acarreo  Ejemplo 15: Diseñar en VHDL, diseñe un
sumador simple, con acarreo  Ejemplo 16: Diseñar en VHDL, un sumador de 8 bits con
signo  Ejemplo 17: Diseñar en VHDL, un reloj de 1hz (1 segundo), que luego
utilizaremos para realizar un reloj digital.  Ejemplo 18: Diseñar en VHDL, un
reloj de 10hz, Que tenga un reset, que reinicie el clock. que luego utilizaremos
para un cronometro  Ejemplo 19: Diseñar en VHDL, un contador de 4 bits. Flanco
descendente.  Ejemplo 20: Diseñar en VHDL, un contador ascendente descendente de 4
bits  Ejemplo 21: Diseñar en VHDL, un contador ascendente de 8 bits.  Ejemplo 22:
Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz.
EJEMPLOS PRACTICOS EN VHDL Página 1 de 18
 Ejemplo 23: Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz,
y que muestre su salida en número hexadecimal en display de 7 segmentos  Ejemplo
24: proyecto reloj digital

Ejemplo 1: Diseñar en VHDL, una puerta NOREX.


1 2 3 4 5 6 7 8 9 10 library ieee; use ieee.std_logic_1164.all; entity ejemplo01 is
port (a,b: in std_logic; F: out std_logic); end ejemplo01; architecture rtl of
ejemplo01 is begin F<= a xnor b; end rtl;

Ejemplo 2: Diseñar en VHDL, un sistema que cumpla con F=A'B'+B'C+AC'


1 2 3 4 5 6 7 8 9 10 library ieee; use ieee.std_logic_1164.all; entity ejemplo02 is
port (A,B,C: in std_logic; F: out std_logic); end ejemplo02; architecture rtl of
ejemplo02 is begin F<= (not A AND not B)OR(not B AND C)OR(A AND not C); end rtl;

Ejemplo 3: Diseñar en VHDL, un multiplexor de 4 entradas (E3,E2,E1,E0) y una salida


F. Con 2 variables de selección S1, S0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 library ieee; use ieee.std_logic_1164.all;
entity ejemplo03 is port (E: in std_logic_vector(3 DOWNTO 0); F: out std_logic; S:
in std_logic_vector(1 DOWNTO 0)); end ejemplo03; architecture rtl of ejemplo03 is
begin with S select F<= E(0) when "00", E(1) when "01", E(2) when "10", E(3) when
others; end rtl;

EJEMPLOS PRACTICOS EN VHDL Página 2 de 18


Ejemplo 4: Diseñar en VHDL, un decodificador completo de 3 entradas (I2,I1,I0)y 8
salidas (S7,S5,S4,...,S0)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 library ieee; use
ieee.std_logic_1164.all; entity ejemplo04 is port (I: in std_logic_vector(3 DOWNTO
0); S: out std_logic_vector(7 DOWNTO 0)); end ejemplo04; architecture rtl of
ejemplo04 is begin with E select S<= "00000001" when "000", "00000010" when "001",
"00000100" when "010", "00001000" when "011", "00010000" when "100", "00100000"
when "101", "01000000" when "110", "10000000" when others; end rtl;

Ejemplo 5: Diseñar en VHDL, un decodificador completo de 3 entradas (I2, I1, I0) y


8 salidas (S7, S5, S4,..., S0). Con señal enable/disable. Solución:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 library ieee; use
ieee.std_logic_1164.all; entity ejemplo05 is port (I: in std_logic_vector(3 DOWNTO
0); S: out std_logic_vector(7 DOWNTO 0); ENABLE: in std_logic); end ejemplo05;
architecture rtl of ejemplo05 is signal sAUX: std_logic_vector(7 DOWNTO 0); begin
with E select sAUX<= "00000001" when "000", "00000010" when "001", "00000100" when
"010", "00001000" when "011", "00010000" when "100", "00100000" when "101",
"01000000" when "110", "10000000" when others; S<= sAUX when ENABLE='1' ELSE
"00000000"; end rtl; EJEMPLOS PRACTICOS EN VHDL Página 3 de 18
Ejemplo 6: Diseñar en VHDL, un codificador de 4:2 con prioridad
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 library ieee; use
ieee.std_logic_1164.all; entity codificador is port (w:in std_logic_vector (3
downto 0); y: out std_logic_vector (1 downto 0); z: out std_logic); end
codificador; architecture behaivor of codificador is begin with w select y<= "00"
when "0001", "01" when "0010", "01" when "0011", "10" when "0100", "10" when
"0101", "10" when "0110", "10" when "0111", "11" when others; with w select z<= '0'
when "0000", '1' when others; end behaivor;

Ejemplo 7: Diseñar en VHDL, un codificador 4:2 (como el ejemplo anterior), sin


tanto código. Realizarlo más eficientemente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 library ieee; use ieee.std_logic_1164.all;
entity codeficiente is port (w:in std_logic_vector (3 downto 0); y: out
std_logic_vector (1 downto 0); z: out std_logic); end codeficiente; architecture
behaivor of codificador is begin with w select y<= "11" when w(3) H '1' else "10"
when w(2) H '1' else "01" when w(1) H '1' else "00"; z<= '0' when w = "0000", else
'1'; end codeficiente;

Ejemplo 8: Diseñar en VHDL, un comparador de 4 bits , que a la salida te de


información de A mayor que B, A menor que B y A Igual que B.
1 2 3 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY comparador IS EJEMPLOS
PRACTICOS EN VHDL Página 4 de 18
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

PORT (BCD1, BCD2: IN std_logic_vector(3 DOWNTO 0); Igual, Mayor, Menor: OUT
std_logic); END comparador; ARCHITECTURE RTL OF comparador IS BEGIN
Compara:PROCESS(BCD1, BCD2) BEGIN --Comparación de Igualdad. IF (BCD1 = BCD2) THEN
Igual <= '1'; ELSE Igual <= '0'; END IF; --Comparación de Mayor (svE1>svE2). IF
(BCD1 > BCD2) THEN Mayor <= '1'; ELSE Mayor <= '0'; END IF; --Comparación de Menor
(svE1 IF (BCD1 < BCD2) THEN Menor <= '1'; ELSE Menor <= '0'; END IF; END PROCESS
Compara; END RTL;

Ejemplo 9: Diseñar en VHDL, un comparador de 4 bits, que a la salida te de


información de A mayor que B, A menor que B y A Igual que B. METODO 2 (ojo: hay
varios más)
1 2 3 4 5 6 7 8 9 10 11 12 13 LIBRARY ieee; USE ieee.std_logic_1l64.all; USE
ieee.std_logic_unsigned.all ; ENTITY ejemplo09 IS PORT ( A,B: IN STD_LOGIC_VECTOR(3
DOWNTO 0); igual,mayor,menor: OUT STD_LOGIC); END ejemplo09; ARCHITECTURE rtl OF
ejemplo09 IS BEGIN igual <= 'l' WHEN A = B ELSE '0'; mayor <= '1' WHEN A > B ELSE
'0'; menor <='l' WHEN A < B ELSE'0'; END rtl;

Ejemplo 10: Diseñar en VHDL, un comparador de 4 bits CON SIGNO, que a la salida te
de información de A mayor que B, A menor que B y A Igual que B
1 2 3 4 5 LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all;
-- aqui en la libreria arith radica la -- diferencia, a comparacion del EJEMPLOS
PRACTICOS EN VHDL Página 5 de 18
6 7 8 9 10 11 12 13 14 15 16

-- anterior circuito ENTITY ejemplo10 IS PORT ( A,B: IN signed(3 DOWNTO 0);


igual,mayor,menor: OUT STD_LOGIC); END ejemplo10; ARCHITECTURE behavior OF
ejemplo10 IS BEGIN igual <= 'l' WHEN A = B ELSE '0'; mayor <= '1' WHEN A > B ELSE
'0'; menor <='l' WHEN A < B ELSE'0'; END behavior;

Ejemplo 11: Diseñar en VHDL, un multiplexor de 16 a 1 con 4 variables de selección.


USANDO multiplexores de 4 a 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 LIBRARY ieee; USE
ieee.std_logic_1l64.all; LIBRARY work; USE work.mux4to1_package.all; ENTITY
ejemplo11 IS PORT(w :IN STD_LOGIC_VECTOR(0 TO 15); s :IN STD_LOGTC_VECTOR(3 DOWNTO
0); f :OUT STD_LOGIC ); END ejemplo11; ARCHITECTURE Structure OF ejemplo1l IS
SIGNAL m:STD_LOGIC_VECTOR(O TO 3) ; BEGIN Mux1: mux4ro1 PORT MAP
(w(0),w(1),w(2),w(3),s(1 DOWNTO 0),m(0)); Mux2: mux4to1 PORT MAP
(w(4),w(5),w(6),w(7),s(1 DOWNTO 0),m(1)); Mux3: mux4to1 PORT MAP
(w(8),w(9),w(10),w(11),s(l DOWNTO 0),m(2)); Mux4: mux4to1 PORT MAP
(w(12),w(13),w(14),w(15),s(l DOWNTO 0),m(3)); Mux5: mux4to1 PORT MAP
(m(0),m(l),m(2),m(3),s(3 DOWNTO 2),f ); END Structure;

Ejemplo 12: Diseñar en VHDL, un transcodificador, del código 84-2-1 al Johnson de


5bits
1 2 3 4 5 6 7 8 9 10 library ieee; use ieee.std_logic_1164.all; entity
transcodificador is port (cod: in std_logic_vector (3 downto 0); Jhonson5bits: out
std_logic_vector (4 downto 0)); end transcodificador; architecture rtl of
transcodificador is begin PROCESS(cod) EJEMPLOS PRACTICOS EN VHDL Página 6 de 18
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

BEGIN CASE cod IS WHEN "0000" WHEN "0111" WHEN "0110" WHEN "0101" WHEN "0100" WHEN
"1011" WHEN "1010" WHEN "1001" WHEN "1000" WHEN "1111" WHEN OTHERS END CASE; END
PROCESS; END rtl;

=> => => => => => => => => => =>

Jhonson5bits Jhonson5bits Jhonson5bits Jhonson5bits Jhonson5bits Jhonson5bits


Jhonson5bits Jhonson5bits Jhonson5bits Jhonson5bits Jhonson5bits

<= <= <= <= <= <= <= <= <= <= <=

"00000"; "00001"; "00011"; "00111"; "01111"; "11111"; "11110"; "11100"; "11000";


"10000"; "00000";

Ejemplo 13: Diseñar en VHDL, generador de bits para la corrección de errores de un


Bcd aiken
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 library ieee;
use ieee.std_logic_1164.all; entity DyCdeError is port (I: in std_logic_vector (3
bits: out std_logic_vector end DyCdeError; architecture rtl of DyCdeError begin
PROCESS(I) BEGIN CASE I IS WHEN "0000" => bits <= WHEN "0001" => bits <= WHEN
"0010" => bits <= WHEN "0011" => bits <= WHEN "0100" => bits <= WHEN "1011" => bits
<= WHEN "1100" => bits <= WHEN "1101" => bits <= WHEN "1110" => bits <= WHEN "1111"
=> bits <= WHEN OTHERS => bits <= END CASE; END PROCESS; END rtl;

downto 0); (7 downto 1)); is

"0000000"; "0000111"; "0011001"; "0011110"; "0101010"; "1010101"; "1100001";


"1100110"; "1111000"; "1111111"; "0000000";

Ejemplo 14: Diseñar en VHDL, diseñe un sumador simple, sin acarreo


1 2 3 LIBRARY ieee ; USE ieee.std_logic_1164.ALL ; USE ieee.std_logic_arith.ALL ;
EJEMPLOS PRACTICOS EN VHDL Página 7 de 18
4 5 6 7 8 9 10 11 12

ENTITY sumsen IS PORT (A,B: IN signed (4 downto 0) ; S: out signed (4 downto 0) );


END sumsen ; ARCHITECTURE rtl OF sumsen IS BEGIN S <= A + B ; END rtl ;

Ejemplo 15: Diseñar en VHDL, diseñe un sumador simple, con acarreo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 LIBRARY ieee ; USE ieee.std_logic_1164.ALL ;
USE ieee.std_logic_unsigned.ALL ; ENTITY sumaca IS PORT (A,B: IN std_logic_vector
(3 downto 0); ci: in std_logic; S: out std_logic_vector (3 downto 0); co: out
std_logic); END sumaca ; ARCHITECTURE entera OF sumaca IS signal suma:
std_logic_vector(4 downto 0); BEGIN suma <= ('0'& A) + B + ci ; S <= suma(3 downto
0); co <= suma(4); END entera ;

Ejemplo 16: Diseñar en VHDL, un sumador de 8 bits con signo


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 LIBRARY ieee ; USE
ieee.std_logic_1164.ALL ; USE ieee.std_logic_arith.ALL ; ENTITY sumador8bits IS
PORT (A,B: IN unsigned (7 downto 0) ; C: IN signed (7 downto 0) ; D: in
std_logic_vector (7 downto 0) ; S: out unsigned (8 downto 0) ; T: out signed (8
downto 0) ; U: out signed (7 downto 0) ; v: out std_logic_vector (8 downto 0) );
END sumador8bits ; ARCHITECTURE rtl OF sumador8bits IS BEGIN S <= ('0' & A) + ('0'
& B) ; T <= A + C ; U <= C + SIGNED(D) ; V <= C - UNSIGNED(D) ; END rtl ; EJEMPLOS
PRACTICOS EN VHDL Página 8 de 18
Ejemplo 16: Diseñar en VHDL, un sumador completo que sume 2 números de 4 bits cada
uno. Utilizar para este propósito 4 full adders de 2 bits. Solución: a) Full adder
de 2 bits.- a la entrada de este sumador tenemos 2 bits y carry de entrada. A la
salida tenemos la suma y el carry de salida.
1 2 3 4 5 6 7 8 9 10 11 library ieee; use ieee.std_logic_1164.all; entity FULLADDER
is port (a, b, c: in std_logic; sum, carry: out std_logic); end FULLADDER;
architecture RTL of FULLADDER is begin sum <= (a xor b) xor c ; carry <= (a and b)
or (c and (a xor b)); end RTL;

b) Sumador 2 números de 4 bits.- si ponemos en cascada los sumadores, podemos


obtener un sumador de números de 4 bits. El programa siguiente utiliza la rutina
anterior (FULLADDER), hace llamado de este sumador completo de 2 bits, para
utilizarlo en la implementación de un sumador pedido en el problema.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 library
ieee; use ieee.std_logic_1164.all; entity FOURBITADD is port (a, b: in
std_logic_vector(3 downto 0); Cin : in std_logic; sum: out std_logic_vector (3
downto 0); Cout, V: out std_logic); end FOURBITADD; architecture RTL of FOURBITADD
is signal c: std_logic_vector (4 downto 0); component FULLADDER port(a, b, c: in
std_logic; sum, carry: out std_logic); end component; begin FA0: FULLADDER port map
(a(0), FA1: FULLADDER port map (a(1), FA2: FULLADDER port map (a(2), FA3: FULLADDER
port map (a(3), V <= c(3) xor c(4); Cout <= c(4); end RTL; EJEMPLOS PRACTICOS EN
VHDL Página 9 de 18 b(0), Cin, sum(0), c(1)); b(1), C(1), sum(1), c(2)); b(2),
C(2), sum(2), c(3)); b(3), C(3), sum(3), c(4));
Notas de la descripción anterior: En la arquitectura añadimos un SIGNAL que es una
señal interna del componente que hará las veces de variable local. Recordar que
cuando creen su proyecto ahí deben de hacer el llamado del sumador de 2 bits, así
lo compilara, sino no podrá hacerlo y les dará error. Ejemplo 17: Diseñar en VHDL,
un reloj de 1hz (1 segundo), que luego utilizaremos para realizar un reloj digital.
Solución: La DE2 board incluye 2 osciladores que producen señales de reloj de 27
MHz y 50 MHz . La tarjeta también incluye un conector SMA que se utiliza para
conectar una señal externa.

Utilizaremos el clock interno de 50Mhz de la tarjeta para poder obtener mediante


VHDL una frecuencia a la salida de 1Hz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 LIBRARY IEEE; USE
IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY delay_clock IS PORT (
Clk50Mhz: IN STD_LOGIC; Clk: OUT STD_LOGIC ); END delay_clock; ARCHITECTURE rtl OF
delay_clock IS CONSTANT max: INTEGER := 50000000; CONSTANT half: INTEGER := max/2;
SIGNAL count: INTEGER RANGE 0 TO max; BEGIN PROCESS BEGIN WAIT UNTIL Clk50Mhz'EVENT
and Clk50Mhz = '1'; IF count < max THEN count <= count + 1; EJEMPLOS PRACTICOS EN
VHDL Página 10 de 18
20 21 22 23 24 25 26 27 28

ELSE count <= 0; END IF; IF count < half THEN Clk <= '0'; ELSE Clk <= '1'; END IF;
END PROCESS; END rtl;

Ejemplo 18: Diseñar en VHDL, un reloj de 10hz, Que tenga un reset, que reinicie el
clock. Solucion: Utilizando en esta ocasión el reloj interno de la fpga de 27Mhz,
sacaremos una frecuencia a la salida de 10Hz, utilizaremos la sentencia rising edge
que como vimos anteriormente, es lo mismo que clock'event, ósea flanco.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 LIBRARY
IEEE; USE IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; ENTITY ck_10hz IS
PORT ( reset : IN STD_LOGIC; clock_in : IN STD_LOGIC; clock_out : OUT STD_LOGIC);
END ck_10hz; ARCHITECTURE rtl OF ck_10hz IS signal ck_cnt : unsigned(20 downto 0);
signal ck_bit : std_logic; begin gen_clock: process (clock_in, reset) is begin if
(reset = '0') then ck_cnt <= "000000000000000000000"; ck_bit <= '0'; elsif
rising_edge(clock_in) then if (ck_cnt = 1349999) then ck_cnt <=
"000000000000000000000"; ck_bit <= not ck_bit; else ck_cnt <= ck_cnt + 1; end if;
end if; end process; clock_out <= ck_bit; end rtl;

Vemos en los anteriores ejemplos 2 maneras de realizar el divisor de frecuencias,


utilizando tanto el clock interno de 50 Mhz y el de 27Mhz. También se añadió un
reset, para detener el clock cuando nos apetezca. La idea que se utilizo para los
codigos de arriba, fue el de contar paquetes de ciclos de reloj, por ejemplo para
50Mhz se conto los "half" ósea 25Mhz ósea que cuando pasan los primeros 25 000 000
EJEMPLOS PRACTICOS EN VHDL Página 11 de 18
ciclos de reloj está en estado '0' la salida, para los siguientes 25 000 000 está
en estado 1 la salida. Así que tenemos 1 segundo exacto. Para realizar el divisor a
10 Hz se utilizo la misma idea contar paquetes de ciclos de reloj, teniendo como
limite el 27Mhz. ósea que en 27 Mhz se tendría que dividir entre 20, 10 ciclos '0'
y 10 ciclos '1', que darían los 10 hz.

Ejemplo 19: Diseñar en VHDL, un contador de 4 bits. Flanco descendente.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ENTITY contador_4bits IS PORT( clock,
reset: IN BIT; salida : OUT INTEGER RANGE 0 TO 15); END conta_rs; ARCHITECTURE rtl
OF contador_4bits IS BEGIN PROCESS (clock, reset) VARIABLE cuenta :INTEGER RANGE 0
TO 15; BEGIN IF (reset='1') THEN cuenta:=0; ELSIF (clock'EVENT AND clock='0') THEN
cuenta:=cuenta+1; END IF; salida <= cuenta; END PROCESS; END rtl;

Ejemplo 20: Diseñar en VHDL, un contador ascendente descendente de 4 bits.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ENTITY Contador_asc_desc IS
PORT( clock, enable, asc_des : IN BIT; salida : OUT INTEGER RANGE 0 TO 15); END
Contador_asc_desc; ARCHITECTURE rtl OF Contador_asc_desc IS BEGIN PROCESS (clock)
VARIABLE cuenta :INTEGER RANGE 0 TO 15; BEGIN IF (clock'EVENT AND clock='0') THEN
IF (enable = '1' AND asc_des = '1') THEN cuenta:=cuenta+1; ELSIF (enable = '1' AND
asc_des = '0') THEN cuenta:=cuenta-1; END IF; END IF; salida <= cuenta; END
PROCESS; END rtl;

EJEMPLOS PRACTICOS EN VHDL Página 12 de 18


Ejemplo 21: Diseñar en VHDL, un contador ascendente de 8 bits. Solucion: En este
código, pues variamos el tipo de variable de la salida, en los anteriores ejemplos
era integer, pero veamos qué pasa cuando se lo representa como un vector de 7
downto 0. Se utilizo un rising edge para el flanco descendente, además para hacerlo
más interesante se puso un habilitador (enable) para iniciar o no la cuenta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 library ieee; use
ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity contador8bits is
port ( cout :out std_logic_vector (7 downto 0); enable :in std_logic; clk :in
std_logic; reset :in std_logic ); end contador8bits; architecture rtl of
contador8bits is signal count :std_logic_vector (7 downto 0); begin process (clk,
reset) begin if (reset = '1') then count <= (others=>'0'); elsif (rising_edge(clk))
then if (enable = '1') then count <= count + 1; end if; end if; end process; cout
<= count; end rtl;

Ejemplo 22: Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use
IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter_4b_1hz is
Port (clock_50Mhz : in STD_LOGIC; reset: in bit; F: OUT INTEGER RANGE 0 TO 15); END
counter_4b_1Hz; ARCHITECTURE rtl OF counter_4b_1hz IS SIGNAL clkout: std_logic;
CONSTANT max: INTEGER := 50000000; CONSTANT half: INTEGER := max/2; SIGNAL count:
INTEGER RANGE 0 TO max; BEGIN PROCESS EJEMPLOS PRACTICOS EN VHDL Página 13 de 18
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

BEGIN WAIT UNTIL clock_50Mhz'EVENT and clock_50Mhz = '1'; IF count < max THEN count
<= count + 1; ELSE count <= 0; END IF; IF count < half THEN clkout <= '0'; ELSE
clkout <= '1'; END IF; END PROCESS; PROCESS(clkout,reset) VARIABLE cuenta: INTEGER
RANGE 0 TO 15; BEGIN IF (reset='1') THEN cuenta:=0; ELSIF (clkout'EVENT AND
clkout='0') THEN cuenta:=cuenta+1; END IF; F <= cuenta; END PROCESS; END rtl;

Ejemplo 23: Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz, y
que muestre su salida en número hexadecimal en display de 7 segmentos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 library
IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use
IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY counter_4b_7seg is Port (clock_50Mhz : in
STD_LOGIC; reset: in bit; 7SEG: OUT STD_LOGIC_VECTOR (7 downto 0); END
counter_4b_7seg; ARCHITECTURE rtl OF counter_4b_1hz IS SIGNAL clkout: std_logic;
CONSTANT max: INTEGER := 50000000; CONSTANT half: INTEGER := max/2; SIGNAL count:
INTEGER RANGE 0 TO max; SIGNAL F: INTEGER RANGE 0 to 15 BEGIN PROCESS BEGIN WAIT
UNTIL clock_50Mhz'EVENT and clock_50Mhz = '1'; IF count < max THEN count <= count +
1; ELSE count <= 0; END IF; IF count < half THEN clkout <= '0'; ELSE clkout <= '1';
END IF; END PROCESS; PROCESS(clkout,reset) VARIABLE cuenta: INTEGER RANGE 0 TO 15;
EJEMPLOS PRACTICOS EN VHDL Página 14 de 18
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
56

BEGIN IF (reset='1') THEN cuenta:=0; ELSIF (clkout'EVENT AND clkout='0') THEN


cuenta:=cuenta+1; END IF; F <= cuenta; BEGIN case F is when 0 => 7SEG :="10000001";
when 1 => 7SEG :="11001111"; when 2 => 7SEG :="10010010"; when 3 => 7SEG
:="10000110"; when 4 => 7SEG :="11001100"; when 5 => 7SEG :="10100100"; when 6 =>
7SEG :="11100000"; when 7 => 7SEG :="10001111"; when 8 => 7SEG :="10000000"; when 9
=> 7SEG :="10000100"; when 10 => 7SEG :="11100010"; when 11 => 7SEG :="11100000";
when 12 => 7SEG :="11110010"; when 13 => 7SEG :="11000010"; when 14 => 7SEG
:="10110000"; when 15 => 7SEG :="10111000"; when others => null; end case END
PROCESS; END rtl;

Ejemplo 24: PROYECTO RELOJ DIGITAL El documento completo de este proyecto fue
publicado en el enlace: http://electronicoetn.blogspot.com/2011/07/proyecto-reloj-
digital.html. Mediante el uso de lenguaje de descripción de hardware se procederá a
describir el reloj digital, con la siguiente especificación:  Un bloque segundero
contador modulo-60, utilizamos una señal de este para habilitar el bloque minutero
cada 60 segundos.  Un bloque minutero contador modulo-60, utilizamos una señal de
este para habilitar el bloque horero cada 60 minutos.  Un bloque de horas contador
modulo-24. Además de mostrar la hora esta se debe modificar en cualquier momento
que el usuario requiera mediante 2 botones para modificar horas y minutos. Se
añadirá un selector que cuando este en “1” se pueda modificar la hora y cuando este
en “0” no se pueda. Además de un Reset para reiniciar nuestro sistema.
EJEMPLOS PRACTICOS EN VHDL Página 15 de 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

------------------------------------------------------------------ Reloj Digital --


Autor: Américo Álvarez S.
----------------------------------------------------------------library ieee; use
ieee.std_logic_1164.all; entity reloj_v3 is port(clk_50Mhz:in std_logic;
reset,ajuste:in std_logic; ajuste_hh,ajuste_mm:in std_logic;
hex0,hex1,hex2,hex3,hex4,hex5:out std_logic_vector(0 to 6) ); end reloj_v3;
architecture rtl of reloj_v3 is signal clk0,clk1,clk2,clk3,clk4,clk5:
std_logic:='0'; signal clk_a1,clk_a2:std_logic:='0'; signal ajuste_sync:std_logic;
constant max: integer := 2;--50000000; constant half: integer := max/2; signal
count: integer range 0 to max; function numero(digito:integer) return
std_logic_vector is Variable hex:std_logic_vector(0 to 6); begin case digito is
when 0 => hex := "0000001"; when 1 => hex := "1001111"; when 2 => hex := "0010010";
when 3 => hex := "0000110"; when 4 => hex := "1001100"; when 5 => hex := "0100100";
when 6 => hex := "1100000"; when 7 => hex := "0001111"; when 8 => hex := "0000000";
when 9 => hex := "0000100"; when others => null; end case; return(hex); end numero;
begin -- definimos el clock de 1 hz process (clk_50Mhz) begin if (clk_50Mhz'event
and clk_50Mhz='1') then if (count < max) then count <=count + 1; else count <=0;
end if; if (count <= half) then clk0 <='0'; else clk0 <='1'; end if; EJEMPLOS
PRACTICOS EN VHDL Página 16 de 18
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

end if; end process; -- definimos el reloj como tal process


(clk0,reset,ajuste,ajuste_hh,ajuste_mm) variable uu_s: integer range 0 to 10;
variable dd_s: integer range 0 to 6; variable uu_m: integer range 0 to 10; variable
dd_m: integer range 0 to 6; variable uu_h: integer range 0 to 10; variable dd_h:
integer range 0 to 3; begin -- señal asincrona de reset if (reset='1') then
uu_s:=0; dd_s:=0; uu_m:=0; dd_m:=0; uu_h:=0; dd_h:=0; else -- definimos segundos
contador mod 60 if (clk0'event and clk0='1') then uu_s:= uu_s+1; clk1 <= '0'; if
(uu_s=10) then uu_s := 0; clk1 <= '1'; end if; end if; if (clk1'event and clk1='1')
then dd_s:= dd_s+1; clk2 <= '0'; if (dd_s=6) then dd_s := 0; clk2 <= '1'; end if;
end if; -- señal de ajuste minutos -- sincronizamos a los segundos if (clk0'event
and clk0='0') then ajuste_sync<=ajuste; end if; clk_a1<=(clk2 and not ajuste_sync)
or (ajuste_mm and ajuste_sync); -- definimos minutos contador mod 60 if
(clk_a1'event and clk_a1='1') then uu_m:= uu_m+1; clk3 <= '0'; if (uu_m=10) then
uu_m := 0; clk3 <= '1'; end if; EJEMPLOS PRACTICOS EN VHDL Página 17 de 18
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

end if; if (clk3'event and clk3='1') then dd_m:= dd_m+1; clk4 <= '0'; if (dd_m=6)
then dd_m := 0; clk4 <= '1'; end if; end if; -- señal de ajuste minutos
clk_a2<=(clk4 and not ajuste_sync) or (ajuste_hh and ajuste_sync); -- definimos
horas contador mod 24 if (clk_a2'event and clk_a2='1') then uu_h:= uu_h+1; clk5 <=
'0'; if (uu_h=10) then uu_h := 0; clk5 <= '1'; end if; end if; if (clk5'event and
clk5='1') then dd_h:= dd_h+1; end if; if (dd_h=2 and uu_h=4) then uu_h:= 0; dd_h:=
0; end if; end if; -- definimos la alarma -- mostramos en displays hex0 <=
numero(uu_s); hex1 <= numero(dd_s); hex2 <= numero(uu_m); hex3 <= numero(dd_m);
hex4 <= numero(uu_h); hex5 <= numero(dd_h); end process; end rtl;

EJEMPLOS PRACTICOS EN VHDL Página 18 de 18

También podría gustarte