Você está na página 1de 19

EJEMPLOS BASICOS VHDL

Ejemplo 1:
Disear en VHDL, una puerta NOREX.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y ej empl o01 i s
por t
( a, b: i n st d_l ogi c; F: out st d_l ogi c) ;
end ej empl o01;

ar chi t ect ur e r t l of ej empl o01 i s
begi n
F<= a xnor b;
end r t l ;


Ejemplo 2:
Disear en VHDL, un sistema que cumpla con F=A'B'+B'C+AC'
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y ej empl o02 i s
por t
( A, B, C: i n st d_l ogi c; F: out
st d_l ogi c) ;
end ej empl o02;

ar chi t ect ur e r t l of ej empl o02 i s
begi n
F<= ( not A AND not B) OR( not B AND
C) OR( A AND not C) ;
end r t l ;







Ejemplo 3:
Disear en VHDL, un multiplexor de 4 entradas (E3,E2,E1,E0) y una salida F. Con 2 variables de
seleccion S1,S0.
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y ej empl o03 i s
por t
( E: i n st d_l ogi c_vect or ( 3 DOWNTO 0) ;
F: out st d_l ogi c; S: i n
st d_l ogi c_vect or ( 1 DOWNTO 0)
end ej empl o03;

ar chi t ect ur e r t l of ej empl o03 i s
begi n
wi t h S sel ect
F<= E( 0) when " 00" ,
E( 1) when " 01" ,
E( 2) when " 10" ,
E( 3) when ot her s;
end r t l ;

Ejemplo 4:
Disear en VHDL, un decodificador completo de 3 entradas (I2,I1,I0)y 8 salidas
(S7,S5,S4,...,S0)
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y ej empl o04 i s
por t
( I : i n st d_l ogi c_vect or ( 3 DOWNTO 0) ;
S: out st d_l ogi c_vect or ( 7 DOWNTO 0) ) ;
end ej empl o04;

ar chi t ect ur e r t l of ej empl o04 i s
begi n
wi t h E sel ect
S<= " 00000001" when " 000" ,
" 00000010" when " 001" ,
" 00000100" when " 010" ,
" 00001000" when " 011" ,
" 00010000" when " 100" ,
" 00100000" when " 101" ,
" 01000000" when " 110" ,
" 10000000" when ot her s;
end r t l ;


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
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y ej empl o05 i s
por t
( I : i n st d_l ogi c_vect or ( 3 DOWNTO 0) ;
S: out st d_l ogi c_vect or ( 7 DOWNTO 0) ;
ENABLE: i n st d_l ogi c) ;
end ej empl o05;

ar chi t ect ur e r t l of ej empl o05 i s
si gnal sAUX: st d_l ogi c_vect or ( 7 DOWNTO
0) ;
begi n
wi t h E sel ect
sAUX<= " 00000001" when " 000" ,
" 00000010" when " 001" ,
" 00000100" when " 010" ,
" 00001000" when " 011" ,
" 00010000" when " 100" ,
" 00100000" when " 101" ,
" 01000000" when " 110" ,
" 10000000" when ot her s;
S<= sAUX when ENABLE=' 1' ELSE
" 00000000" ;
end r t l ;
Ejemplo 6:
Disear en VHDL, un codificador de 4:2 con prioridad
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - Codi f i cador de pr i or i dad
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y codi f i cador i s
por t ( w: i n st d_l ogi c_vect or ( 3 downt o 0) ;
y: out st d_l ogi c_vect or ( 1 downt o 0) ;
z: out st d_l ogi c) ;
end codi f i cador ;

ar chi t ect ur e behai vor of codi f i cador i s
begi n
wi t h w sel ect
y<= " 00" when " 0001" ,
" 01" when " 0010" ,
" 01" when " 0011" ,
" 10" when " 0100" ,
" 10" when " 0101" ,
" 10" when " 0110" ,
" 10" when " 0111" ,
" 11" when ot her s;
wi t h w sel ect
z<= ' 0' when " 0000" ,
' 1' when ot her s;
end behai vor ;


Ejemplo 7:
Disear en VHDL, un codificador 4:2 (como el ejemplo anterior), sin tanto codigo. realizarlo mas
eficientemente
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - Codi f i cador de pr i or i dad + ef i ci ent e
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y codef i ci ent e i s
por t ( w: i n st d_l ogi c_vect or ( 3 downt o 0) ;
y: out st d_l ogi c_vect or ( 1 downt o 0) ;
z: out st d_l ogi c) ;
end codef i ci ent e;

ar chi t ect ur e behai vor of codi f i cador i s
begi n
wi t h w sel ect
y<= " 11" when w( 3) H ' 1' el se
" 10" when w( 2) H ' 1' el se
" 01" when w( 1) H ' 1' el se
" 00" ;
z<= ' 0' when w = " 0000" , el se ' 1' ;
end codef i ci ent e;







Ejemplo 8:
Disear en VHDL, un comparador de 4 bits , que a la salida te de informacion de A mayor que
B, A menor que B y A Igual que B.
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - APLI CACI ON DE MULTI PLEXORES
- - COMPARACI ON
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY I EEE;
USE I EEE. STD_LOGI C_1164. ALL;

ENTI TY compar ador I S
PORT
( BCD1, BCD2: I N st d_l ogi c_vect or ( 3
DOWNTO 0) ;
I gual , Mayor , Menor : OUT st d_l ogi c) ;
END compar ador ;

ARCHI TECTURE RTL OF compar ador I S
BEGI N

Compar a: PROCESS( BCD1, BCD2)
BEGI N
- - Compar aci n de I gual dad.
I F ( BCD1 = BCD2)
THEN I gual <= ' 1' ;
ELSE I gual <= ' 0' ;
END I F;
- - Compar aci n de Mayor ( svE1>svE2) .
I F ( BCD1 > BCD2)
THEN Mayor <= ' 1' ;
ELSE Mayor <= ' 0' ;
END I F;
- - Compar aci n de Menor ( svE1
I F ( BCD1 < BCD2)
THEN Menor <= ' 1' ;
ELSE Menor <= ' 0' ;
END I F;
END PROCESS Compar a;
END RTL;









Ejemplo 9:
Disear en VHDL, un comparador de 4 bits, que a la salida te de informacion de A mayor que
B, A menor que B y A Igual que B. METODO 2 (ojo: hay varios mas)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY i eee;
USE i eee. st d_l ogi c_1l 64. al l ;
USE i eee. st d_l ogi c_unsi gned. al l ;

ENTI TY ej empl o09 I S
PORT ( A, B: I N STD_LOGI C_VECTOR( 3
DOWNTO 0) ;
i gual , mayor , menor : OUT STD_LOGI C) ;
END ej empl o09;

ARCHI TECTURE r t l OF ej empl o09 I S
BEGI N
i gual <= ' l ' WHEN A = B ELSE ' 0' ;
mayor <= ' 1' WHEN A > B ELSE ' 0' ;
menor <=' l ' WHEN A < B ELSE' 0' ;
END r t l ;

Ejemplo 10:
Disear en VHDL, un comparador de 4 bits CON SIGNO, que a la salida te de informacion de
A mayor que B, A menor que B y A Igual que B
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY i eee;
USE i eee. st d_l ogi c_1164. al l ;
USE i eee. st d_l ogi c_ar i t h. al l ;
- - aqui en l a l i br er i a ar i t h r adi ca l a
- - di f er enci a, a compar aci on del
- - ant er i or ci r cui t o


ENTI TY ej empl o10 I S
PORT ( A, B: I N si gned( 3 DOWNTO 0) ;
i gual , mayor , menor : OUT STD_LOGI C) ;
END ej empl o10;

ARCHI TECTURE behavi or OF ej empl o10 I S
BEGI N
i gual <= ' l ' WHEN A = B ELSE ' 0' ;
mayor <= ' 1' WHEN A > B ELSE ' 0' ;
menor <=' l ' WHEN A < B ELSE' 0' ;
END behavi or ;



Ejemplo 11:
Disear en VHDL, un multiplexor de 16 a 1 con 4 variables de seleccion. USANDO multiplexores
de 4 a 1

Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY i eee;
USE i eee. st d_l ogi c_1l 64. al l ;
LI BRARY wor k;
USE wor k. mux4t o1_package. al l ;

ENTI TY ej empl o11 I S
PORT( w : I N STD_LOGI C_VECTOR( 0 TO 15) ;
s : I N STD_LOGTC_VECTOR( 3 DOWNTO 0) ;
f : OUT STD_LOGI C ) ;
END ej empl o11;

ARCHI TECTURE St r uct ur e OF ej empl o1l I S
SI GNAL m: STD_LOGI C_VECTOR( O TO 3) ;
BEGI N
Mux1: mux4r o1 PORT MAP
( w( 0) , w( 1) , w( 2) , w( 3) , s( 1 DOWNTO 0) , m( 0) ) ;
Mux2: mux4t o1 PORT MAP
( w( 4) , w( 5) , w( 6) , w( 7) , s( 1 DOWNTO 0) , m( 1) ) ;
Mux3: mux4t o1 PORT MAP
( w( 8) , w( 9) , w( 10) , w( 11) , s( l DOWNTO 0) , m( 2) ) ;
Mux4: mux4t o1 PORT MAP
( w( 12) , w( 13) , w( 14) , w( 15) , s( l DOWNTO 0) , m( 3) ) ;
Mux5: mux4t o1 PORT MAP
( m( 0) , m( l ) , m( 2) , m( 3) , s( 3 DOWNTO 2) , f ) ;
END St r uct ur e;







Ejemplo 12:
Disear en VHDL, un transcodificador,del codigo 84-2-1 al jhonson de 5bits
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - t r anscodi f i cador de del codi go 84- 2- 1 al
- - j honson de 5 bi t s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y t r anscodi f i cador i s
por t
( cod: i n st d_l ogi c_vect or ( 3 downt o 0) ;
J honson5bi t s: out st d_l ogi c_vect or ( 4 downt o
0) ) ;
end t r anscodi f i cador ;

ar chi t ect ur e r t l of t r anscodi f i cador i s
begi n
PROCESS( cod)
BEGI N
CASE cod I S
WHEN " 0000" => J honson5bi t s <= " 00000" ;
WHEN " 0111" => J honson5bi t s <= " 00001" ;
WHEN " 0110" => J honson5bi t s <= " 00011" ;
WHEN " 0101" => J honson5bi t s <= " 00111" ;
WHEN " 0100" => J honson5bi t s <= " 01111" ;
WHEN " 1011" => J honson5bi t s <= " 11111" ;
WHEN " 1010" => J honson5bi t s <= " 11110" ;
WHEN " 1001" => J honson5bi t s <= " 11100" ;
WHEN " 1000" => J honson5bi t s <= " 11000" ;
WHEN " 1111" => J honson5bi t s <= " 10000" ;
WHEN OTHERS => J honson5bi t s <= " 00000" ;
END CASE;
END PROCESS;
END r t l ;



Ejemplo 13:
Disear en VHDL, generador de bits para la coreccion de errores de un Bcd aiken
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - det ecci on y cor r ecci on de er r or es
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l i br ar y i eee;
use i eee. st d_l ogi c_1164. al l ;

ent i t y DyCdeEr r or i s
por t
( I : i n st d_l ogi c_vect or ( 3 downt o 0) ;
bi t s: out st d_l ogi c_vect or ( 7 downt o 1) ) ;
end DyCdeEr r or ;

ar chi t ect ur e r t l of DyCdeEr r or i s
begi n
PROCESS( I )
BEGI N
CASE I I S
WHEN " 0000" => bi t s <= " 0000000" ;
WHEN " 0001" => bi t s <= " 0000111" ;
WHEN " 0010" => bi t s <= " 0011001" ;
WHEN " 0011" => bi t s <= " 0011110" ;
WHEN " 0100" => bi t s <= " 0101010" ;
WHEN " 1011" => bi t s <= " 1010101" ;
WHEN " 1100" => bi t s <= " 1100001" ;
WHEN " 1101" => bi t s <= " 1100110" ;
WHEN " 1110" => bi t s <= " 1111000" ;
WHEN " 1111" => bi t s <= " 1111111" ;
WHEN OTHERS => bi t s <= " 0000000" ;
END CASE;
END PROCESS;
END r t l ;




Ejemplo 14:
Disear en VHDL, disee un sumador simple, sin acarreo
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - APLI CACI ON DE MULTI PLEXORES
- - suumador
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY i eee ;
USE i eee. st d_l ogi c_1164. ALL ;
USE i eee. st d_l ogi c_ar i t h. ALL ; - - def i ne
1: si gned 2: unsi gned 3: i nt eger

ENTI TY sumsen I S
PORT
( A, B: I N si gned ( 4 downt o 0) ;
S: out si gned ( 4 downt o 0) ) ;
END sumsen ;

ARCHI TECTURE r t l OF sumsen I S
BEGI N
S <= A + B ;
END r t l ;

Ejemplo 15:
Disear en VHDL, disee un sumador simple, con acarreo
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY i eee ;
USE i eee. st d_l ogi c_1164. ALL ;
USE i eee. st d_l ogi c_unsi gned. ALL ;

ENTI TY sumaca I S
PORT
( A, B: I N st d_l ogi c_vect or ( 3
downt o 0) ;
ci : i n st d_l ogi c;
S: out st d_l ogi c_vect or ( 3
downt o 0) ;
co: out st d_l ogi c) ;
END sumaca ;

ARCHI TECTURE ent er a OF sumaca I S
si gnal suma: st d_l ogi c_vect or ( 4 downt o
0) ;
BEGI N
suma <= ( ' 0' & A) + B + ci ; S
<= suma( 3 downt o 0) ;
co <= suma( 4) ;
END ent er a ;


Ejemplo 16:
Disear en VHDL, un sumdor de 8 bits con signo
Solucion:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i i cos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LI BRARY i eee ;
USE i eee. st d_l ogi c_1164. ALL ;
USE i eee. st d_l ogi c_ar i t h. ALL ;

ENTI TY sumador 8bi t s I S
PORT
( A, B: I N unsi gned ( 7 downt o 0)
;
C: I N si gned ( 7 downt o 0) ;
D: i n st d_l ogi c_vect or ( 7
downt o 0) ;
S: out unsi gned ( 8 downt o 0) ;
T: out si gned ( 8 downt o 0) ;
U: out si gned ( 7 downt o 0) ;
v: out st d_l ogi c_vect or ( 8
downt o 0) ) ;
END sumador 8bi t s ;

ARCHI TECTURE r t l OF sumador 8bi t s I S
BEGI N
S <= ( ' 0' & A) + ( ' 0' & B) ;
T <= A + C ;
U <= C + SI GNED( D) ;
V <= C - UNSI GNED( D) ;
END r t l ;

Ejemplo 16:
Disear en VHDL, un sumador completo que sume 2 numeros de 4 bits cada uno. Utilizar para
este proposito 4 full adders de 2 bits.

Solucion:
a) Full adder.- a la entrada de este sumador tenemos 2 bits y carry de entrada. A la salida
tenemos la suma y el carry de salida.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - DESCRI PCI ON ESTRUCTURAL
- - El ement o basi co par a el sumador pedi do
- - Sumador compl et o 2 bi t s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 numeros de 4 bits .- si ponemos en cascada los sumadores, podemos obtener un
sumador de numeros de 4 bits. El programa siguiente utiliza la rutina anterior(FULLADDER),
hace llamado de este sumador completo de 2 bits, para utilizarlo en la implementacion de un
sumador pedido en el problema.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - el ect r oni co- et n. bl ogspot . com
- - ej empl os pr act i cos
- - Descr i pci on est r uct ur al
- - sumar numer os de 4 bi t s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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), b(0), Cin, sum(0), c(1));
FA1: FULLADDER
port map (a(1), b(1), C(1), sum(1), c(2));
FA2: FULLADDER
port map (a(2), b(2), C(2), sum(2), c(3));
FA3: FULLADDER
port map (a(3), b(3), C(3), sum(3), c(4));
V <= c(3) xor c(4);
Cout <= c(4);
end RTL;


Notas de la descripcion anterior: EN la arquitectura aadimos un SIGNAL que es una seal
interna del componente que hara las veces de variable local.
Recordar que cuando creen su propyecto ahi deben de hacer el llamado del sumador de 2 bits,
asi lo compilara, sino no podra hacerlo y les dara error.

Ejemplo 17:
Disear en VHDL, un reloj de 1hz (1 segundo), que luego utilizaremos para realizar un reloj
digital.

Solucion:
La DE2 board incluye 2 osciladores que producen seales de reloj de 27 MHz y 50 MHz . La
tarjeta tambien incluye un conector SMA que se utiliza para conectar un reloj externo a la
tarjeta


Utilizaremos el clock interno de 50Mhz de la tarjeta para poder obtener mediante VHDL una
frecuencia a la salida de 1Hz

---------------------------------------------------
-- electronico-etn.blogspot.com
---------------------------------------------------
-- Autor: Americo Alvarez S.
-- Descripcion: Reloj de 1Hz, utilizando reloj in-
-- terno de 50Mhz del fpga Cyclone2.
---------------------------------------------------
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;
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 ocasion 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, osea flanco.
---------------------------------------------------
-- electronico-etn.blogspot.com
---------------------------------------------------
-- Autor: Americo Alvarez S.
-- Descripcion: Reloj de 10Hz, utilizando reloj in-
-- interno de 27Mhz del fpga Cyclone2.
---------------------------------------------------
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. Tambien se aadio un reset, para detener el
clock cuando nos apetesca.
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" osea 25Mhz osea que cuando pasan los primeros 25
000 000 25 000 000 ciclos de reloj esta en estado '0' la salida, para los siguientes
25 000 000 25 000 000 esta en estado 1 la salida. asi 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. osea que en 27 Mhz se tendria que dividir entre 20, 10 ciclos '0'
y 10 ciclos '1', que darian los 10 hz.

Ejemplo 19:
Disear en VHDL, un contador de 4 bits. Flanco descendente.

Solucion:
Como es flanco descendente clock'EVENT AND clock='0' (podemos tb utilizar rising edge). .
Tambien por comodidad y para que observen, se utilizo el tipo de dato integer (osea entero)
para la salida, osea si ponemos 0 to 15 entonces vhdl generara automaticamente una salida de
4 bits que representan en binario los numeros de 0 a 15. ahora si ponemos Integer range 0 a
26 por decir algun valor
, pues el programa generara automaticamente 5 bits de salida para representar estos numeros.

---------------------------------------------------
-- electronico-etn.blogspot.com
-- Contador binario ascendente de 4 bits.
---------------------------------------------------
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.
Solucion:

---------------------------------------------------
-- electronico-etn.blogspot.com
-- Contador binario ascendente descendente de --
4 bits.
---------------------------------------------------
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;









Ejemplo 21:
Disear en VHDL, un contador ascendente de 8 bits.
Solucion:
En este codigo, pues variamos el tipo de variable de la salida, en los anteriores ejemplos era
integer, pero veamos que pasa cuando se lo representa como un vector de 7 downto 0. Pues
les dire desde ya no pasa nada el tratamiento es el mismo se suma 1 (o se puede restar si
fuera tambien descendente). se utilizo un rising edge para el flanco descendente, ademas para
hacerlo mas interesante se puso un habilitador (enable) para iniciar o no la cuenta.

---------------------------------------------------
-- electronico-etn.blogspot.com
-- Contador binario ascendente descendente de --
4 bits.
---------------------------------------------------
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.
Solucion:
ejemplo publicado en http://www.todopic.com.ar
------------------------------------------------------------------------------------
-- Contador ascendente 4 bit con 1 Hz de reloj
-- Autor: Americo Alvarez S.
-- Fecha: 05 de marzo de 2011
-- Nombre de modulo: counter_4b_1hz
-- Descripcion:
-- Una vez visto el gran inconveniente por el reloj que
-- presentaban los contadores al momento de implementarlos
-- en la tarjeta fpga. Se vio la necesidad de implementar
-- un contador con f=1Hz de frecuencia.
-- La salida se la observara en binario, en leds.
-- Abstract:
--
-- Vercion: vercion 0
------------------------------------------------------------------------------------
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
-- generando seal clock de 1Hz de frecuencia
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;

--contador 4 bits ascendente
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 numero hexadecimal en display de 7 segmentos
Solucion:
------------------------------------------------------------------------------------------
-- Contador ascendente 4 bit con 1 Hz de reloj,
-- con salida hexadecimal en display de 7 segmentos
-- Autor: Americo Alvarez S.
-- Fecha: 25 de marzo de 2011
-- Nombre de modulo: counter_4b_7seg
-- Descripcion:
-- Una vez visto el gran inconveniente por el reloj que
-- presentaban los contadores al momento de implementarlos
-- en la tarjeta fpga. Se vio la necesidad de implementar
-- un contador con f=1Hz de frecuencia.
-- La salida se la observara en hexadecimal en display de 7seg.
-- Abstract:
--
-- Vercion: vercion 0.1
------------------------------------------------------------------------------------------
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
-- generando seal clock de 1Hz de frecuencia
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;

--contador 4 bits ascendente
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;

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;

Você também pode gostar