Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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;
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;
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;
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;
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;
1 LIBRARY IEEE;
2 USE IEEE.STD_LOGIC_1164.ALL;
3 ENTITY comparador IS
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;
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)
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;
1 LIBRARY ieee ;
2 USE ieee.std_logic_1164.ALL ;
3 USE ieee.std_logic_arith.ALL ;
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 ;
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 ;
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;
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
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;
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;
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
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;
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.