Está en la página 1de 18

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

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

1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity ejemplo02 is
4 port
5 (A,B,C: in std_logic; F: out std_logic);
6 end ejemplo02;
7 architecture rtl of ejemplo02 is
8 begin
9 F<= (not A AND not B)OR(not B AND C)OR(A AND not C);
10 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity ejemplo03 is
4 port
5 (E: in std_logic_vector(3 DOWNTO 0);
6 F: out std_logic; S: in std_logic_vector(1 DOWNTO 0));
7 end ejemplo03;
8 architecture rtl of ejemplo03 is
9 begin
10 with S select
11 F<= E(0) when "00",
12 E(1) when "01",
13 E(2) when "10",
14 E(3) when others;
15 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity ejemplo04 is
4 port
5 (I: in std_logic_vector(3 DOWNTO 0);
6 S: out std_logic_vector(7 DOWNTO 0));
7 end ejemplo04;
8 architecture rtl of ejemplo04 is
9 begin
10 with E select
11 S<= "00000001" when "000",
12 "00000010" when "001",
13 "00000100" when "010",
14 "00001000" when "011",
15 "00010000" when "100",
16 "00100000" when "101",
17 "01000000" when "110",
18 "10000000" when others;
19 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity ejemplo05 is
4 port
5 (I: in std_logic_vector(3 DOWNTO 0);
6 S: out std_logic_vector(7 DOWNTO 0);
7 ENABLE: in std_logic);
8 end ejemplo05;
9 architecture rtl of ejemplo05 is
10 signal sAUX: std_logic_vector(7 DOWNTO 0);
11 begin
12 with E select
13 sAUX<= "00000001" when "000",
14 "00000010" when "001",
15 "00000100" when "010",
16 "00001000" when "011",
17 "00010000" when "100",
18 "00100000" when "101",
19 "01000000" when "110",
20 "10000000" when others;
21 S<= sAUX when ENABLE='1' ELSE "00000000";
22 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity codificador is
4 port (w:in std_logic_vector (3 downto 0);
5 y: out std_logic_vector (1 downto 0);
6 z: out std_logic);
7 end codificador;
8 architecture behaivor of codificador is
9 begin
10 with w select
11 y<= "00" when "0001",
12 "01" when "0010",
13 "01" when "0011",
14 "10" when "0100",
15 "10" when "0101",
16 "10" when "0110",
17 "10" when "0111",
18 "11" when others;
19 with w select
20 z<= '0' when "0000",
21 '1' when others;
22 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity codeficiente is
4 port (w:in std_logic_vector (3 downto 0);
5 y: out std_logic_vector (1 downto 0);
6 z: out std_logic);
7 end codeficiente;
8 architecture behaivor of codificador is
9 begin
10 with w select
11 y<= "11" when w(3) H '1' else
12 "10" when w(2) H '1' else
13 "01" when w(1) H '1' else
14 "00";
15 z<= '0' when w = "0000", else '1';
16 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 LIBRARY IEEE;
2 USE IEEE.STD_LOGIC_1164.ALL;
3 ENTITY comparador IS

EJEMPLOS PRACTICOS EN VHDL Página 4 de 18


4 PORT
5 (BCD1, BCD2: IN std_logic_vector(3 DOWNTO 0);
6 Igual, Mayor, Menor: OUT std_logic);
7 END comparador;
8 ARCHITECTURE RTL OF comparador IS
9 BEGIN
10 Compara:PROCESS(BCD1, BCD2)
11 BEGIN
12 --Comparación de Igualdad.
13 IF (BCD1 = BCD2)
14 THEN Igual <= '1';
15 ELSE Igual <= '0';
16 END IF;
17 --Comparación de Mayor (svE1>svE2).
18 IF (BCD1 > BCD2)
19 THEN Mayor <= '1';
20 ELSE Mayor <= '0';
21 END IF;
22 --Comparación de Menor (svE1
23 IF (BCD1 < BCD2)
24 THEN Menor <= '1';
25 ELSE Menor <= '0';
26 END IF;
27 END PROCESS Compara;
28 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 LIBRARY ieee;
2 USE ieee.std_logic_1l64.all;
3 USE ieee.std_logic_unsigned.all ;
4 ENTITY ejemplo09 IS
5 PORT ( A,B: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
6 igual,mayor,menor: OUT STD_LOGIC);
7 END ejemplo09;
8 ARCHITECTURE rtl OF ejemplo09 IS
9 BEGIN
10 igual <= 'l' WHEN A = B ELSE '0';
11 mayor <= '1' WHEN A > B ELSE '0';
12 menor <='l' WHEN A < B ELSE'0';
13 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 LIBRARY ieee;
2 USE ieee.std_logic_1164.all;
3 USE ieee.std_logic_arith.all;
4 -- aqui en la libreria arith radica la
5 -- diferencia, a comparacion del
EJEMPLOS PRACTICOS EN VHDL Página 5 de 18
6 -- anterior circuito
7 ENTITY ejemplo10 IS
8 PORT ( A,B: IN signed(3 DOWNTO 0);
9 igual,mayor,menor: OUT STD_LOGIC);
10 END ejemplo10;
11 ARCHITECTURE behavior OF ejemplo10 IS
12 BEGIN
13 igual <= 'l' WHEN A = B ELSE '0';
14 mayor <= '1' WHEN A > B ELSE '0';
15 menor <='l' WHEN A < B ELSE'0';
16 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 LIBRARY ieee;
2 USE ieee.std_logic_1l64.all;
3 LIBRARY work;
4 USE work.mux4to1_package.all;
5 ENTITY ejemplo11 IS
6 PORT(w :IN STD_LOGIC_VECTOR(0 TO 15);
7 s :IN STD_LOGTC_VECTOR(3 DOWNTO 0);
8 f :OUT STD_LOGIC );
9 END ejemplo11;
10 ARCHITECTURE Structure OF ejemplo1l IS
11 SIGNAL m:STD_LOGIC_VECTOR(O TO 3) ;
12 BEGIN
13 Mux1: mux4ro1 PORT MAP
14 (w(0),w(1),w(2),w(3),s(1 DOWNTO 0),m(0));
15 Mux2: mux4to1 PORT MAP
16 (w(4),w(5),w(6),w(7),s(1 DOWNTO 0),m(1));
17 Mux3: mux4to1 PORT MAP
18 (w(8),w(9),w(10),w(11),s(l DOWNTO 0),m(2));
19 Mux4: mux4to1 PORT MAP
20 (w(12),w(13),w(14),w(15),s(l DOWNTO 0),m(3));
21 Mux5: mux4to1 PORT MAP
22 (m(0),m(l),m(2),m(3),s(3 DOWNTO 2),f );
23 END Structure;

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

1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity transcodificador is
4 port
5 (cod: in std_logic_vector (3 downto 0);
6 Jhonson5bits: out std_logic_vector (4 downto 0));
7 end transcodificador;
8 architecture rtl of transcodificador is
9 begin
10 PROCESS(cod)

EJEMPLOS PRACTICOS EN VHDL Página 6 de 18


11 BEGIN
12 CASE cod IS
13 WHEN "0000" => Jhonson5bits <= "00000";
14 WHEN "0111" => Jhonson5bits <= "00001";
15 WHEN "0110" => Jhonson5bits <= "00011";
16 WHEN "0101" => Jhonson5bits <= "00111";
17 WHEN "0100" => Jhonson5bits <= "01111";
18 WHEN "1011" => Jhonson5bits <= "11111";
19 WHEN "1010" => Jhonson5bits <= "11110";
20 WHEN "1001" => Jhonson5bits <= "11100";
21 WHEN "1000" => Jhonson5bits <= "11000";
22 WHEN "1111" => Jhonson5bits <= "10000";
23 WHEN OTHERS => Jhonson5bits <= "00000";
24 END CASE;
25 END PROCESS;
26 END rtl;

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

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

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

1 LIBRARY ieee ;
2 USE ieee.std_logic_1164.ALL ;
3 USE ieee.std_logic_arith.ALL ;

EJEMPLOS PRACTICOS EN VHDL Página 7 de 18


4 ENTITY sumsen IS
5 PORT
6 (A,B: IN signed (4 downto 0) ;
7 S: out signed (4 downto 0) );
8 END sumsen ;
9 ARCHITECTURE rtl OF sumsen IS
10 BEGIN
11 S <= A + B ;
12 END rtl ;

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

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

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

1 LIBRARY ieee ;
2 USE ieee.std_logic_1164.ALL ;
3 USE ieee.std_logic_arith.ALL ;
4 ENTITY sumador8bits IS
5 PORT
6 (A,B: IN unsigned (7 downto 0) ;
7 C: IN signed (7 downto 0) ;
8 D: in std_logic_vector (7 downto 0) ;
9 S: out unsigned (8 downto 0) ;
10 T: out signed (8 downto 0) ;
11 U: out signed (7 downto 0) ;
12 v: out std_logic_vector (8 downto 0) );
13 END sumador8bits ;
14 ARCHITECTURE rtl OF sumador8bits IS
15 BEGIN
16 S <= ('0' & A) + ('0' & B) ;
17 T <= A + C ;
18 U <= C + SIGNED(D) ;
19 V <= C - UNSIGNED(D) ;
20 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity FULLADDER is
4 port (a, b, c: in std_logic;
5 sum, carry: out std_logic);
6 end FULLADDER;
7 architecture RTL of FULLADDER is
8 begin
9 sum <= (a xor b) xor c ;
10 carry <= (a and b) or (c and (a xor b));
11 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 library ieee;
2 use ieee.std_logic_1164.all;
3 entity FOURBITADD is
4 port (a, b: in std_logic_vector(3 downto 0);
5 Cin : in std_logic;
6 sum: out std_logic_vector (3 downto 0);
7 Cout, V: out std_logic);
8 end FOURBITADD;
9 architecture RTL of FOURBITADD is
10 signal c: std_logic_vector (4 downto 0);
11
12 component FULLADDER
13 port(a, b, c: in std_logic;
14 sum, carry: out std_logic);
15 end component;
16 begin
17 FA0: FULLADDER
18 port map (a(0), b(0), Cin, sum(0), c(1));
19 FA1: FULLADDER
20 port map (a(1), b(1), C(1), sum(1), c(2));
21 FA2: FULLADDER
22 port map (a(2), b(2), C(2), sum(2), c(3));
23 FA3: FULLADDER
24 port map (a(3), b(3), C(3), sum(3), c(4));
25 V <= c(3) xor c(4);
26 Cout <= c(4);
27 end RTL;
EJEMPLOS PRACTICOS EN VHDL Página 9 de 18
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 LIBRARY IEEE;
2 USE IEEE.STD_LOGIC_1164.ALL;
3 USE IEEE.STD_LOGIC_ARITH.ALL;
4 ENTITY delay_clock IS
5 PORT (
6 Clk50Mhz: IN STD_LOGIC;
7 Clk: OUT STD_LOGIC
8 );
9 END delay_clock;
10 ARCHITECTURE rtl OF delay_clock IS
11 CONSTANT max: INTEGER := 50000000;
12 CONSTANT half: INTEGER := max/2;
13 SIGNAL count: INTEGER RANGE 0 TO max;
14 BEGIN
15 PROCESS
16 BEGIN
17 WAIT UNTIL Clk50Mhz'EVENT and Clk50Mhz = '1';
18 IF
19 count < max THEN count <= count + 1;
EJEMPLOS PRACTICOS EN VHDL Página 10 de 18
20 ELSE count <= 0;
21 END IF;
22
23 IF
24 count < half THEN Clk <= '0';
25 ELSE Clk <= '1';
26 END IF;
27 END PROCESS;
28 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 LIBRARY IEEE;
2 USE IEEE.STD_LOGIC_1164.ALL;
3 use IEEE.STD_LOGIC_ARITH.ALL;
4 ENTITY ck_10hz IS
5 PORT ( reset : IN STD_LOGIC;
6 clock_in : IN STD_LOGIC;
7 clock_out : OUT STD_LOGIC);
8 END ck_10hz;
9 ARCHITECTURE rtl OF ck_10hz IS
10 signal ck_cnt : unsigned(20 downto 0);
11 signal ck_bit : std_logic;
12 begin
13 gen_clock: process (clock_in, reset) is
14 begin
15 if (reset = '0') then
16 ck_cnt <= "000000000000000000000";
17 ck_bit <= '0';
18 elsif rising_edge(clock_in) then
19 if (ck_cnt = 1349999) then
20 ck_cnt <= "000000000000000000000";
21 ck_bit <= not ck_bit;
22 else
23 ck_cnt <= ck_cnt + 1;
24 end if;
25 end if;
26 end process;
27 clock_out <= ck_bit;
28 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 ENTITY contador_4bits IS
2 PORT( clock, reset: IN BIT;
3 salida : OUT INTEGER RANGE 0 TO 15);
4 END conta_rs;
5 ARCHITECTURE rtl OF contador_4bits IS
6 BEGIN
7 PROCESS (clock, reset)
8 VARIABLE cuenta :INTEGER RANGE 0 TO 15;
9 BEGIN
10 IF (reset='1') THEN
11 cuenta:=0;
12 ELSIF (clock'EVENT AND clock='0') THEN
13 cuenta:=cuenta+1;
14 END IF;
15 salida <= cuenta;
16 END PROCESS;
17 END rtl;

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

1 ENTITY Contador_asc_desc IS
2 PORT( clock, enable, asc_des : IN BIT;
3 salida : OUT INTEGER RANGE 0 TO 15);
4 END Contador_asc_desc;
5 ARCHITECTURE rtl OF Contador_asc_desc IS
6 BEGIN
7 PROCESS (clock)
8 VARIABLE cuenta :INTEGER RANGE 0 TO 15;
9 BEGIN
10 IF (clock'EVENT AND clock='0') THEN
11 IF (enable = '1' AND asc_des = '1') THEN
12 cuenta:=cuenta+1;
13 ELSIF (enable = '1' AND asc_des = '0') THEN
14 cuenta:=cuenta-1;
15 END IF;
16 END IF;
17 salida <= cuenta;
18 END PROCESS;
19 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 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.all;
4 entity contador8bits is
5 port (
6 cout :out std_logic_vector (7 downto 0);
7 enable :in std_logic;
8 clk :in std_logic;
9 reset :in std_logic
10 );
11 end contador8bits;
12 architecture rtl of contador8bits is
13 signal count :std_logic_vector (7 downto 0);
14 begin
15 process (clk, reset) begin
16 if (reset = '1') then
17 count <= (others=>'0');
18 elsif (rising_edge(clk)) then
19 if (enable = '1') then
20 count <= count + 1;
21 end if;
22 end if;
23 end process;
24 cout <= count;
25 end rtl;

Ejemplo 22: Diseñar en VHDL, un contador de 4 bits ascendente, con reloj de 1Hz.

1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
3 use IEEE.STD_LOGIC_ARITH.ALL;
4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
5 ENTITY counter_4b_1hz is
6 Port (clock_50Mhz : in STD_LOGIC; reset: in bit;
7 F: OUT INTEGER RANGE 0 TO 15);
8 END counter_4b_1Hz;
9 ARCHITECTURE rtl OF counter_4b_1hz IS
10 SIGNAL clkout: std_logic;
11 CONSTANT max: INTEGER := 50000000;
12 CONSTANT half: INTEGER := max/2;
13 SIGNAL count: INTEGER RANGE 0 TO max;
14 BEGIN
15 PROCESS

EJEMPLOS PRACTICOS EN VHDL Página 13 de 18


16 BEGIN
17 WAIT UNTIL clock_50Mhz'EVENT and clock_50Mhz = '1';
18 IF count < max THEN count <= count + 1;
19 ELSE count <= 0;
20 END IF;
21 IF count < half THEN clkout <= '0';
22 ELSE clkout <= '1';
23 END IF;
24 END PROCESS;
25 PROCESS(clkout,reset)
26 VARIABLE cuenta: INTEGER RANGE 0 TO 15;
27 BEGIN
28 IF (reset='1') THEN
29 cuenta:=0;
30 ELSIF (clkout'EVENT AND clkout='0') THEN
31 cuenta:=cuenta+1;
32 END IF;
33 F <= cuenta;
34 END PROCESS;
35 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 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
3 use IEEE.STD_LOGIC_ARITH.ALL;
4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
5 ENTITY counter_4b_7seg is
6 Port (clock_50Mhz : in STD_LOGIC; reset: in bit;
7 7SEG: OUT STD_LOGIC_VECTOR (7 downto 0);
8 END counter_4b_7seg;
9 ARCHITECTURE rtl OF counter_4b_1hz IS
10 SIGNAL clkout: std_logic;
11 CONSTANT max: INTEGER := 50000000;
12 CONSTANT half: INTEGER := max/2;
13 SIGNAL count: INTEGER RANGE 0 TO max;
14 SIGNAL F: INTEGER RANGE 0 to 15
15 BEGIN
16 PROCESS
17 BEGIN
18 WAIT UNTIL clock_50Mhz'EVENT and clock_50Mhz = '1';
19 IF count < max THEN count <= count + 1;
20 ELSE count <= 0;
21 END IF;
22 IF count < half THEN clkout <= '0';
23 ELSE clkout <= '1';
24 END IF;
25 END PROCESS;
26 PROCESS(clkout,reset)
27 VARIABLE cuenta: INTEGER RANGE 0 TO 15;
EJEMPLOS PRACTICOS EN VHDL Página 14 de 18
28 BEGIN
29 IF (reset='1') THEN
30 cuenta:=0;
31 ELSIF (clkout'EVENT AND clkout='0') THEN
32 cuenta:=cuenta+1;
33 END IF;
34 F <= cuenta;
35 BEGIN
36 case F is
37 when 0 => 7SEG :="10000001";
38 when 1 => 7SEG :="11001111";
39 when 2 => 7SEG :="10010010";
40 when 3 => 7SEG :="10000110";
41 when 4 => 7SEG :="11001100";
42 when 5 => 7SEG :="10100100";
43 when 6 => 7SEG :="11100000";
44 when 7 => 7SEG :="10001111";
45 when 8 => 7SEG :="10000000";
46 when 9 => 7SEG :="10000100";
47 when 10 => 7SEG :="11100010";
48 when 11 => 7SEG :="11100000";
49 when 12 => 7SEG :="11110010";
50 when 13 => 7SEG :="11000010";
51 when 14 => 7SEG :="10110000";
52 when 15 => 7SEG :="10111000";
53 when others => null;
54 end case
55 END PROCESS;
56 END rtl;

Ejemplo 24: PROYECTO RELOJ DIGITAL

El documento completo de este proyecto fue publicado en el enlace: http://electronico-


etn.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 -- Reloj Digital
3 -- Autor: Américo Álvarez S.
4 -----------------------------------------------------------------
5 library ieee;
6 use ieee.std_logic_1164.all;
7
8 entity reloj_v3 is
9 port(clk_50Mhz:in std_logic;
10 reset,ajuste:in std_logic;
11 ajuste_hh,ajuste_mm:in std_logic;
12 hex0,hex1,hex2,hex3,hex4,hex5:out std_logic_vector(0 to 6)
13 );
14 end reloj_v3;
15
16 architecture rtl of reloj_v3 is
17 signal clk0,clk1,clk2,clk3,clk4,clk5: std_logic:='0';
18 signal clk_a1,clk_a2:std_logic:='0';
19 signal ajuste_sync:std_logic;
20 constant max: integer := 2;--50000000;
21 constant half: integer := max/2;
22 signal count: integer range 0 to max;
23 function numero(digito:integer) return std_logic_vector is
24 Variable hex:std_logic_vector(0 to 6);
25 begin
26 case digito is
27 when 0 => hex := "0000001";
28 when 1 => hex := "1001111";
29 when 2 => hex := "0010010";
30 when 3 => hex := "0000110";
31 when 4 => hex := "1001100";
32 when 5 => hex := "0100100";
33 when 6 => hex := "1100000";
34 when 7 => hex := "0001111";
35 when 8 => hex := "0000000";
36 when 9 => hex := "0000100";
37 when others => null;
38 end case;
39 return(hex);
40 end numero;
41 begin
42 -- definimos el clock de 1 hz
43 process (clk_50Mhz)
44 begin
45 if (clk_50Mhz'event and clk_50Mhz='1') then
46 if (count < max) then count <=count + 1;
47 else count <=0;
48 end if;
49 if (count <= half) then clk0 <='0';
50 else clk0 <='1';
51 end if;
EJEMPLOS PRACTICOS EN VHDL Página 16 de 18
52 end if;
53 end process;
54 -- definimos el reloj como tal
55 process (clk0,reset,ajuste,ajuste_hh,ajuste_mm)
56 variable uu_s: integer range 0 to 10;
57 variable dd_s: integer range 0 to 6;
58 variable uu_m: integer range 0 to 10;
59 variable dd_m: integer range 0 to 6;
60 variable uu_h: integer range 0 to 10;
61 variable dd_h: integer range 0 to 3;
62 begin
63 -- señal asincrona de reset
64 if (reset='1') then
65 uu_s:=0;
66 dd_s:=0;
67 uu_m:=0;
68 dd_m:=0;
69 uu_h:=0;
70 dd_h:=0;
71 else
72 -- definimos segundos contador mod 60
73 if (clk0'event and clk0='1') then
74 uu_s:= uu_s+1;
75 clk1 <= '0';
76 if (uu_s=10) then
77 uu_s := 0;
78 clk1 <= '1';
79 end if;
80 end if;
81 if (clk1'event and clk1='1') then
82 dd_s:= dd_s+1;
83 clk2 <= '0';
84 if (dd_s=6) then
85 dd_s := 0;
86 clk2 <= '1';
87 end if;
88 end if;
89 -- señal de ajuste minutos
90 -- sincronizamos a los segundos
91 if (clk0'event and clk0='0') then
92 ajuste_sync<=ajuste;
93 end if;
94 clk_a1<=(clk2 and not ajuste_sync) or (ajuste_mm and ajuste_sync);
95 -- definimos minutos contador mod 60
96 if (clk_a1'event and clk_a1='1') then
97 uu_m:= uu_m+1;
98 clk3 <= '0';
99 if (uu_m=10) then
100 uu_m := 0;
101 clk3 <= '1';
102 end if;
EJEMPLOS PRACTICOS EN VHDL Página 17 de 18
103 end if;
104 if (clk3'event and clk3='1') then
105 dd_m:= dd_m+1;
106 clk4 <= '0';
107 if (dd_m=6) then
108 dd_m := 0;
109 clk4 <= '1';
110 end if;
111 end if;
112 -- señal de ajuste minutos
113 clk_a2<=(clk4 and not ajuste_sync) or (ajuste_hh and ajuste_sync);
114 -- definimos horas contador mod 24
115 if (clk_a2'event and clk_a2='1') then
116 uu_h:= uu_h+1;
117 clk5 <= '0';
118 if (uu_h=10) then
119 uu_h := 0;
120 clk5 <= '1';
121 end if;
122 end if;
123 if (clk5'event and clk5='1') then
124 dd_h:= dd_h+1;
125 end if;
126 if (dd_h=2 and uu_h=4) then
127 uu_h:= 0;
128 dd_h:= 0;
129 end if;
130 end if;
131 -- definimos la alarma
132
133 -- mostramos en displays
134 hex0 <= numero(uu_s);
135 hex1 <= numero(dd_s);
136 hex2 <= numero(uu_m);
137 hex3 <= numero(dd_m);
138 hex4 <= numero(uu_h);
139 hex5 <= numero(dd_h);
140 end process;
141 end rtl;

EJEMPLOS PRACTICOS EN VHDL Página 18 de 18

También podría gustarte