Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejemplos Practicos VHDL
Ejemplos Practicos VHDL
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
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 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
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;
=> => => => => => => => => => =>
<= <= <= <= <= <= <= <= <= <= <=
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;
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
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
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;