Está en la página 1de 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);

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));

end RTL;
EJEMPLOS PRACTICOS EN VHDL Pgina 9 de 18

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

También podría gustarte