You are on page 1of 18

EJEMPLOS PRACTICOS EN VHDL

Elaborado por: Amrico lvarez Surci


Con el fin de ayudar a la comunidad estudiantil de nivel bsico, en la comprensin de la descripcin circuital mediante VHDL, se presenta esta recopilacin de ejemplos publicados en el blog http://electronico-etn.blogspot.com Todos estos ejemplos fueron probados en las tarjetas FPGA de la facultad de ingeniera de la UMSA. Se incluye la descripcin de un circuito mas grande como lo es un reloj digital a manera de ejemplo.

LISTA DE EJEMPLOS
Ejemplo 01: disear en VHDL, una compuerta norex Ejemplo 02: Disear en VHDL, un sistema que cumpla con F=A'B'+B'C+AC' Ejemplo 03: Disear en VHDL, un multiplexor de 4 entradas (E3,E2,E1,E0) y una salida F. Con 2 variables de seleccin S1,S0 Ejemplo 04: Disear en VHDL, un decodificador completo de 3 entradas (I2,I1,I0)y 8 salidas (S7,S5,S4,...,S0) Ejemplo 05: Disear en VHDL, un decodificador completo de 3 entradas (I2,I1,I0)y 8 salidas (S7,S5,S4,...,S0). Con seal enable/disable Ejemplo 06: Disear en VHDL, un codificador de 4:2 con prioridad Ejemplo 07: Disear en VHDL, un codificador 4:2 (como el ejemplo anterior), sin tanto cdigo. realizarlo ms eficientemente Ejemplo 08: Disear en VHDL, un comparador de 4 bits , que a la salida te de informacin de A mayor que B, A menor que B y A Igual que B. Ejemplo 09: Disear en VHDL, un comparador de 4 bits, que a la salida te de informacin de A mayor que B, A menor que B y A Igual que B. METODO 2 Ejemplo 10: Disear en VHDL, un comparador de 4 bits CON SIGNO, que a la salida te de informacin de A mayor que B, A menor que B y A Igual que B Ejemplo 11: Disear en VHDL, un multiplexor de 16 a 1 con 4 variables de seleccin. USANDO multiplexores de 4 a 1 Ejemplo 12: Disear en VHDL, un transcodificador, del cdigo 84-2-1 al Johnson de 5bits Ejemplo 13: Disear en VHDL, generador de bits para la coreccion de errores de un Bcd aiken Ejemplo 14: Disear en VHDL, disee un sumador simple, sin acarreo Ejemplo 15: Disear en VHDL, disee un sumador simple, con acarreo Ejemplo 16: Disear en VHDL, un sumador de 8 bits con signo Ejemplo 17: Disear en VHDL, un reloj de 1hz (1 segundo), que luego utilizaremos para realizar un reloj digital. Ejemplo 18: Disear en VHDL, un reloj de 10hz, Que tenga un reset, que reinicie el clock. que luego utilizaremos para un cronometro Ejemplo 19: Disear en VHDL, un contador de 4 bits. Flanco descendente. Ejemplo 20: Disear en VHDL, un contador ascendente descendente de 4 bits Ejemplo 21: Disear en VHDL, un contador ascendente de 8 bits. Ejemplo 22: Disear en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz.
EJEMPLOS PRACTICOS EN VHDL Pgina 1 de 18

Ejemplo 23: Disear en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz, y que muestre su salida en nmero hexadecimal en display de 7 segmentos Ejemplo 24: proyecto reloj digital

Ejemplo 1: Disear 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: Disear 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: Disear en VHDL, un multiplexor de 4 entradas (E3,E2,E1,E0) y una salida F. Con 2 variables de seleccin 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 Pgina 2 de 18

Ejemplo 4: Disear 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: Disear en VHDL, un decodificador completo de 3 entradas (I2, I1, I0) y 8 salidas (S7, S5, S4,..., S0). Con seal enable/disable. Solucin:
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 Pgina 3 de 18

Ejemplo 6: Disear 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: Disear en VHDL, un codificador 4:2 (como el ejemplo anterior), sin tanto cdigo. Realizarlo ms 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: Disear en VHDL, un comparador de 4 bits , que a la salida te de informacin 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 Pgina 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 --Comparacin de Igualdad. IF (BCD1 = BCD2) THEN Igual <= '1'; ELSE Igual <= '0'; END IF; --Comparacin de Mayor (svE1>svE2). IF (BCD1 > BCD2) THEN Mayor <= '1'; ELSE Mayor <= '0'; END IF; --Comparacin de Menor (svE1 IF (BCD1 < BCD2) THEN Menor <= '1'; ELSE Menor <= '0'; END IF; END PROCESS Compara; END RTL;

Ejemplo 9: Disear en VHDL, un comparador de 4 bits, que a la salida te de informacin de A mayor que B, A menor que B y A Igual que B. METODO 2 (ojo: hay varios ms)
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: Disear en VHDL, un comparador de 4 bits CON SIGNO, que a la salida te de informacin 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 Pgina 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: Disear en VHDL, un multiplexor de 16 a 1 con 4 variables de seleccin. 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: Disear en VHDL, un transcodificador, del cdigo 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 Pgina 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: Disear en VHDL, generador de bits para la correccin 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: Disear en VHDL, disee 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 Pgina 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: Disear en VHDL, disee 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: Disear 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 Pgina 8 de 18

Ejemplo 16: Disear en VHDL, un sumador completo que sume 2 nmeros de 4 bits cada uno. Utilizar para este propsito 4 full adders de 2 bits. Solucin: 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 nmeros de 4 bits.- si ponemos en cascada los sumadores, podemos obtener un sumador de nmeros de 4 bits. El programa siguiente utiliza la rutina anterior (FULLADDER), hace llamado de este sumador completo de 2 bits, para utilizarlo en la implementacin 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 Pgina 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 descripcin anterior: En la arquitectura aadimos un SIGNAL que es una seal 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: Disear en VHDL, un reloj de 1hz (1 segundo), que luego utilizaremos para realizar un reloj digital. Solucin: La DE2 board incluye 2 osciladores que producen seales de reloj de 27 MHz y 50 MHz . La tarjeta tambin incluye un conector SMA que se utiliza para conectar una seal 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 Pgina 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: Disear en VHDL, un reloj de 10hz, Que tenga un reset, que reinicie el clock. Solucion: Utilizando en esta ocasin 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. Tambin se aadi 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 Pgina 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 tendra que dividir entre 20, 10 ciclos '0' y 10 ciclos '1', que daran los 10 hz.

Ejemplo 19: Disear 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: Disear 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 Pgina 12 de 18

Ejemplo 21: Disear en VHDL, un contador ascendente de 8 bits. Solucion: En este cdigo, 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, adems para hacerlo ms 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: Disear 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 Pgina 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: Disear en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz, y que muestre su salida en nmero 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 Pgina 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 descripcin de hardware se proceder a describir el reloj digital, con la siguiente especificacin: Un bloque segundero contador modulo-60, utilizamos una seal de este para habilitar el bloque minutero cada 60 segundos. Un bloque minutero contador modulo-60, utilizamos una seal de este para habilitar el bloque horero cada 60 minutos. Un bloque de horas contador modulo-24. Adems de mostrar la hora esta se debe modificar en cualquier momento que el usuario requiera mediante 2 botones para modificar horas y minutos. Se aadir un selector que cuando este en 1 se pueda modificar la hora y cuando este en 0 no se pueda. Adems de un Reset para reiniciar nuestro sistema.
EJEMPLOS PRACTICOS EN VHDL Pgina 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: Amrico 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 Pgina 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 -- seal 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; -- seal 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 Pgina 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; -- seal 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 Pgina 18 de 18

You might also like