Académique Documents
Professionnel Documents
Culture Documents
declaraciones
begin
sentencias
end nombre;
Para acabar esta introduccin deberemos tener en cuenta una serie de detalles
ms de ste lenguaje:
VHDL no distingue las maysculas de las minsculas, por lo que deberemos
tener cuidado al asignar nombres a las variables, especialmente si estamos
acostumbrados a trabajar con C.
Las variables deben empezar por una letra, no deben contener ni espacios
ni smbolos como &, %, $, #, !, etc. Su longitud no est limitada, no pueden
acabar con un carcter de subrayado o tener dos subraryados seguidos.
Para representar un nmero de una sola cifra, deberemos situarlo entre
apstrofes; as: '1'
Para representar un nmero de mas de una cifra, lo representaremos as:
"10011"
Es muy probable que en cada prctica encuentres varias entidades y varias
arquitecturas. Tomando como ejemplo al multiplexor, sabemos que no todos
tienen el mismo nmero de bits o de canales, por eso cada uno tiene una
entidad distinta.
control
enable
XX
HHHH
LL
LH
HL
HH
HHHH
17
end process;
end archmul;
Finaliza el programa
18
19
20
21
22
Debemos ver lo siguiente en este ejercicio:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Recordemos que unas sentencias son concurrentes si se ejecutan
todas a la vez. De este cdigo debemos destacar estas dos
cuestiones:
library ieee;
Llamamos a la librera
use work.gatespkg.all;
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
IEEE
Llamamos a la librera
que tiene las puertas
lgicas
18
19
En este ejemplo vemos que debemos hacer para usar las libreras que
vienen predefinidas con el lenguaje VHDL y ms concretamente con
Warp 3.5 de Cypress Semiconductor. Para trabajar con libreras
debemos tener en cuenta estos puntos:
a,b
: in
control : in
enable : in
c
: out
);
end multi;
bit;
bit;
bit;
bit
end demultiplexor;
y coma.
contr enab
A
ol
le
XX
entr
b
a
LL
LH
entr
a
HL
HH
entr
d
a
entr
a
La entidad se llama
demulti
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
y es idmtica a la
entidad
anterior
Cabecera del
programa
Empieza el
programa
Cabecera de un
proceso
Empieza el proceso
Sentencia if
Sentencia elsif
Sentencia case
19
Finaliza el case
Finaliza el if y el
elsif
Finaliza el proceso
Finaliza el programa
20
21
22
23
24
25
enable: in bit;
a,b,c,d:out bit_vector(7 downto 0)
);
end demulti;
architecture archdemul of demulti is
begin
process (entra, control, enable)
begin
if enable='1' then a<="11111111";
b<="11111111";
c<=(others=>'1');
d<=(others=>'1');
elsif enable='0' then
case control is
when "00" => a <= entra;
when "01" => b <= entra;
when "10" => c <= entra;
when others => d <= entra;
end case;
end if;
end process;
end archdemul;
end process;
end archdemul;
<=
<=
<=
<=
'0';
'0';
'0';
'0';
fuera
EO
HXXXXXXX
LHXXXXXX
LLHXXXXX
LLLHXXXX
LLLLHXXX
LLLLLHXX
LLLLLLHX
LLLLLLLH
HHH
HHL
HLH
HLL
LHH
LHL
LLH
LLL
L
L
L
L
L
L
L
L
LLLLLLLL
LLL
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity coder is port(
dentro: in std_logic_vector(7 downto
0);
fuera : out std_logic_vector(2 downto
0);
eo : out bit
);
end coder;
6
7
8
9
10
11
12
13
14
15
end coder;
Como nota curiosa hay que sealar que el compilador que usamos, el
Galaxy / Warp de Cypress no admite que las lneas de la posicin de
los pines tengan varias lnea, sino slamente una para las entradas y
slamente una para las salidas. Adems entre la ltima asignacin y
las comillas debe existir un espacio.
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
interr<='1';
0);
0);
fuera<="111";
fuera<="110";
fuera<="101";
fuera<="100";
fuera<="011";
fuera<="010";
fuera<="001";
fuera<="000";
fuera<="000";
eo<='0';
eo<='0';
eo<='0';
eo<='0';
eo<='0';
eo<='0';
eo<='0';
eo<='0';
eo<='1';
end
end
end
end
end
end
end
end
end
if;
if;
if;
if;
if;
if;
if;
if;
if;
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
'1';
Los decodificadores
Elige en la lista una prctica
para empezar, sin ms que pinchar en el expuestos ser una muestra prctica de
la versatilidad de VHDL para la
botn adecuado. Para volver pulsa el
implementacin de este tipo de circuitos
botn que est al lado del ttulo
lgicos.
Decodificador 3 a 8
Decodificador 3 a 8
Entidad 1: Decodificador de 3 a 8
Para el diseo de la entidad necesitamos tener una entrada de tres
bits, dos entradas de control, y una salida de ocho bits que en este
caso sern activas por nivel bajo. El cdigo no requiere mayor
explicacin, ya que la entidad es muy sencilla:
library ieee;
use ieee.std_logic_1164.all;
La entrada de
informacin es entrada,
entity decoder is
port(
entrada: in std_logic_vector(2 downto
0);
las de control son g1 y
g1, g2: in std_logic;
g2 y la salida es salida.
salida: out std_logic_vector(7 downto 0)
);
end decoder;
Arquitectura 1: Decodficador de 3 a 8
Para crear la arquitectura de este decodificador deberemos saber que
operatividad exacta le vamos a proporcionar. En este caso usaremos
como modelo del circuito MSI 74138 y traducirla al lenguaje VHDL.
g1 g2
Entrad
a
(2 a 0)
Salida
(7 a 0)
XXX
HHHHHHHH
XXX
HHHHHHHH
LLL
LHHHHHHH
LLH
HLHHHHHH
LHL
HHLHHHHH
LHH
HHHLHHHH
HLL
HHHHLHHH
HLH
HHHHHLHH
HHL
HHHHHHLH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HHH
HHHHHHHL
Salida
(LED)
LLLL
HHHHHHL
LLLH
HHLLLLL
LLHL
HLHHLHH
LLHH
HHHLLHH
LHLL
HHLLHLH
LHLH
LHHLHHH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LHHL
LHHHHHH
LHHH
HHLLLHL
HLLL
HHHHHHH
HLLH
HHHLHHH
LLLL
LLLLLLL
Arquitectura 1: Decodficador de 3 a 8
library ieee;
use ieee.std_logic_1164.all;
entity decoder is
port(
entrada: in std_logic_vector(2 downto 0);
g1, g2: in bit;
salida: out std_logic_vector(7 downto 0)
);
end decoder;
architecture archidecoder of decoder is
begin
salida <= (others=>'1') when g2='1'
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
process (a,b)
begin
if (a(1) = b(1)) and (a(0) = b(0)) then mayor <= '0';
menor <= '0';
igual <= '1';
elsif (a(1) = '1') and (b(1) = '0') then mayor <= '1';
menor <= '0';
igual <= '0';
elsif (a(1) = '0') and (b(1) = '1') then mayor <= '0';
menor <= '1';
igual <= '0';
elsif (a(0) = '1') and (b(0) = '0') then mayor <= '1';
menor <= '0';
igual <= '0';
elsif (a(0) = '0') and (b(0) = '1') then mayor <= '0';
menor <= '1';
igual <= '0';
end if;
end process;
end archicompara;
18
19
20
21
22
end compara;
Y esta sera la arquitectura correspondiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
entrada en cascada
(antes_mayor, antes_menor
y antes_igual) y tres salidas
de un bit cada uno (mayor,
menor e igual).
16
17
18
end if;
end process;
end archicompara;
19
20
21
En esta ocasin hemos usado parte del cdigo del ejemplo anterior
para comparar cuatro bits en cascada. Esta es otra de las ventajas de
VHDL; su modularidad permite el usar otras aplicaciones ya creadas.
otro
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity compara is port(
a,b: in std_logic_vector(1 downto 0);
mayor: out std_logic;
menor: out std_logic;
igual: out std_logic
);
end compara;
architecture archicompara of compara is
begin
process (a,b)
begin
if a > b then mayor <= '1';
menor <= '0';
igual <= '0';
elsif a < b then mayor <= '0';
menor <= '1';
igual <= '0';
elsif a = b then mayor <= '0';
menor <= '0';
igual <= '1';
end if;
end process;
end archicompara;
end process;
end archicompara;
librerias que vienen por defecto con el paquete, que nos permitira
sumar restar multiplicar, etc con sencillez. Esto hara que el cuerpo del
programa sea mucho mas legible y menos engorroso, ahorrandonos
las dificultades propias de los circuuitos MSI.
1
2
3
4
5
6
7
8
9
10
11
12
A3,A2,A1,A0: IN BIT;
B3,B2,B1,B0: IN BIT;
SUM3,SUM2,SUM1,SUM0 : OUT BIT;
CO: OUT BIT);
END fcadd4;
entradas y salidas
desglosadas en bits.
19
sum3 <= (na4_o and (not no4_o)) xor
20
not((no3_o) or
21
(no2_o and na3_o) or
22
(no1_o and na3_o and na2_o) or
23
(na3_o and na2_o and na1_o and (not ci))
24
);
25
sum2 <= (na3_o and (not no3_o)) xor
26
not ((no2_o) or
27
(no1_o and na2_o) or
28
(na2_o and na1_o and (not ci))
29
);
30
sum1 <= (na2_o and (not no2_o)) xor
31
not ((no1_o) or
32
(na1_o and (not ci))
33
);
34
sum0 <= (na1_o and (not no1_o)) xor ci;
35 END archfcadd4;
Este tipo de descripcin, por flujo de datos, nos lleva a la consecucin
de un cdigo rido de leer que dificulta su comprensin y posteriores
modificaciones.
library ieee;
2
3
4
5
6
7
8
9
use ieee.std_logic_1164.all;
use work.sumador.all;
entity resta is port (
a,b: in std_logic_vector(3 downto 0);
sr: in std_logic;
c: out std_logic_vector(3 downto 0)
);
end resta;
library ieee;
use ieee.std_logic_1164.all;
use work.lpmpkg.all;
entity resta is port (
a,b:
in std_logic_vector(3 downto 0);
cin,sr: in std_logic;
c:
out std_logic_vector(3 downto 0);
cout,ov: out std_logic
);
end resta;
Restador de 4 bits
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity resta is port (
a,b: in std_logic_vector(3 downto 0);
sr: in std_logic;
c:
out std_logic_vector(3 downto 0)
);
end resta;
architecture archiresta of resta is
signal aux : std_logic_vector(3 downto 0);
begin
process (a,b,sr,aux)
begin
if sr='0' then aux<=b;
elsif sr='1' then aux<=not(b);
end if;
end process;
c<=a+aux+("000"&sr);
end archiresta;
Restador de 4 bits
library ieee;
use ieee.std_logic_1164.all;
use work.lpmpkg.all;
entity resta is port (
a,b:
in std_logic_vector(3 downto 0);
cin,sr: in std_logic;
c:
out std_logic_vector(3 downto 0);
cout,ov: out std_logic
);
end resta;
architecture archiresta of resta is
begin
restador: Madd_sub
generic map(4,lpm_unsigned,lpm_no_typ,speed)
port map(a,b,cin,sr,c,cout,ov);
end archiresta;
Debido a su amplia
utilizacin, los flip flops se han
convertido en un elemento elemental
dentro de los circuitos secuenciales y
con el paso del tiempo se han
desarrolado varios tipos: RS, JK, D y T.
Multiplicador de 3 bits
Multiplicador de 3 bits
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
4
5
6
7
Hay que destacar que la suma de las seales aux1, aux2 y aux3 se
hace FUERA del proceso, ya que de no ser as, c no se actualizara
correctamente y adoptara el valor del producto anterior.
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity multiplicador is port(
a,b:in std_logic_vector(2 downto 0);
d: in std_logic_vector(2 downto 0);
c:out std_logic_vector(5 downto 0));
end multiplicador;
c<=(a*b) + d;
end archimulti;
1
2
3
4
5
6
7
8
9
10
library ieee;
use ieee.std_logic_1164.all;
use work.lpmpkg.all;
entity multi is port(
dataA : in std_logic_vector(2 downto
0);
dataB : in std_logic_vector(2 downto
0);
sum : in std_logic_vector(5 downto
0);
result : out std_logic_vector(5 downto
0)
);
end multi;
use work.lpmpkg.all;
architecture archimulti of multi is
begin
mul: mmult
generic map (3,3,6,6)
port map(dataA,dataB,sum,result);
end archimulti;
Multiplicador de 3 bits
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity multi is port(
a,b: in
std_logic_vector(2 downto 0);
c : buffer std_logic_vector(5 downto 0)
);
end multi;
architecture archimulti of multi is
signal aux1,aux2,aux3: std_logic_vector(5 downto 0);
begin
process (a,b)
begin
if b(0)='1' then aux1 <= ('0', '0', '0', a(2), a(1), a(0));
elsif b(0)='0' then aux1<=(others => '0'); end if ;
if b(1)='1' then aux2 <= ('0', '0', a(2), a(1), a(0), '0' );
elsif b(1)='0' then aux2<=(others => '0'); end if;
if b(2)='1' then aux3 <= ('0', a(2), a(1), a(0), '0', '0' );
elsif b(2)='0' then aux3<=(others => '0'); end if;
end process;
c
<=aux1 + aux2 + aux3;
end archimulti;
biestable, que tiene dos estados estables. El flip flop es un elemento bsico de
memoria que es capaz de almacenar un nmero binario (bit), es decir, que
permanece indefinidamente en uno de sus dos estados posibles aunque haya
desaparecido la seal de excitacin que provoc su transicin al estado actual.
1
2
3
4
5
6
7
8
clk
library ieee;
use ieee.std_logic_1164.all;
entity flipfloRS is port (
r,s,clk: in std_logic;
q:
buffer std_logic;
notq:
out std_logic
);
end flipfloRS;
1
2
3
4
5
6
7
clk
library ieee;
use ieee.std_logic_1164.all;
entity flipflopd is port (
d,clk: in std_logic;
q : out std_logic
);
end flipflopd;
1
2
3
4
5
6
7
8
clk
1
2
3
4
5
6
7
8
9
10
11
notq
library ieee;
use ieee.std_logic_1164.all;
use work.rtlpkg.all;
entity ffjk is
port (
j : in std_logic;
k : in std_logic;
clk : in std_logic;
q : out std_logic
);
end ffjk;
1
2
3
4
5
6
7
clk
1
2
3
4
5
6
7
library ieee;
use ieee.std_logic_1164.all;
entity tff is port (
t, clk : in std_logic;
q
: buffer std_logic
);
end tff;
not q
1
2
3
4
5
6
Si la entrada de
control t esta a
nivel lgico alto el
flip flop bascula, si
esta a nivel bajo,
mantiene su valor
7
8
9
10
else q <= q;
end if;
end if;
end process;
end architff;
Flip Flop RS
library ieee;
use ieee.std_logic_1164.all;
entity flipfloRS is port (
r,s, clk: in std_logic;
q: buffer std_logic;
notq: out std_logic
);
end flipfloRS;
architecture archiflipfloRS of flipfloRS is
begin
process (clk)
begin
if (clk'event and clk='1') then
if (r='1')and(s='0') then q <= '0';
elsif (r='0')and(s='1')then q <='1';
end if;
end if;
end process;
notq <= not q;
end archiflipfloRS;
Flip Flop D
--flip-flop tipo d
library ieee;
use ieee.std_logic_1164.all;
entity flipflopd is port (
d, clk: in std_logic;
q: out std_logic
);
end flipflopd;
architecture archiflipflopd of flipflopd is
begin
process (clk)
begin
if (clk'event and clk='1') then q <= d;
end if;
end process;
end archiflipflopd;
Flip Flop JK
anterior.
-----
and qx);
Flip Flop T
--flip flop t
library ieee;
use ieee.std_logic_1164.all;
entity tff_logic is port (
t, clk : in std_logic;
q
: buffer std_logic
);
end tff_logic;
architecture t_example of tff_logic is
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (t = '1') then
q <= not(q);
else
q <= q;
end if;
end if;
end process;
end t_example;
Contador ascendente
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
Contador ascendente
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity contador is port(
clk:
in std_logic;
conta: buffer std_logic_vector(3 downto 0)
);
end contador;
architecture archicontador of contador is
begin
process (clk)
begin
if (clk'event and clk= '1') then
conta <= conta + 1;
end if;
end process;
end archicontador;
data:
in std_logic_vector(3 downto 0);
conta:buffer std_logic_vector(3 downto 0)
);
end contador;
architecture archicontador of contador is
begin
process (clk,reset)
begin
if reset = '1' then
conta <= "0000";
elsif (clk'event and clk= '1') then
if load = '1' then
conta <= data;
else
conta <= conta + 1;
end if;
end if;
end process;
end archicontador;
Contador BCD
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity contador is port(
Decodificador 2/4
Decodificador 2/4
Contador
Contador
Secuenciador
Secuenciador
1
2
3
4
5
6
7
8
library ieee;
use ieee.std_logic_1164.all;
use work.uno.all;
entity decoder is port (
seleccion:in std_logic_vector(1 downto
0);
enable1,enable2: in bit;
salida: out std_logic_vector(3 downto
0));
end decoder;
Es necesario poner en
la cabecera del cdigo,
la llamada a la librera
"uno", que es donde
guardaremos a este
decodificador como un
componente.
El
decodificad
or es
activado
atravez de
sus dos
seales de
enable.
Enable1 va
conectada
a la seal
10
11
12
13
14
15
16
17
18
de reloj,
para que el
funcionami
ento del
codificador
se
sincronice a
dicha seal.
Enable2,
har las
veces de un
abilitador
normal.
Entidad 2: Contador
Este circuito tiene como entradas las seales dereloj (clk) y de
informacin (d), siendo activa por flanco de subida. Como salida se
tiene al puerto q.
1
2
3
library ieee;
use ieeee.std_logic_1164.all;
use work.std_arith.all;
4
5
6
7
8
use work.uno.all;
entity count is port (
clk,reset:in bit;
conya :buffer std_logic_vector(1 downto
0));
end count;
Arquitectura 2: Contador
Un contador es un circuito secuencial que repite su estado cada cierto
nmero de pulsos de reloj. El nmero de estados por los que pasa
antes de volver al mismo estado se llama "modulo".
1
2
3
4
5
6
7
8
9
10
11
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
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
package uno is
component
count port (
clk,reset:in bit;
conta :buffer std_logic_vector(1 downto 0));
end component;
component
decoder port (
seleccion
:in std_logic_vector(1 downto 0);
enable1,enable2:in bit;
salida
:out std_logic_vector(3 downto 0));
end component;
end package;
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
use work.uno.all;
entity count is port (
clk,reset:in bit;
conta:buffer std_logic_vector(1 downto 0));
end count;
architecture archicount of count is
begin
contador :process (clk,reset)
begin
if (reset='1') then conta <= (others => '0') ;
elsif clk'event and clk='1' then conta <= conta + 1;
end if;
end process contador;
end archicount;
--descripcion del decodificador 3/8 (74ls138)
library ieee;
use ieee.std_logic_1164.all;
use work.uno.all;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Entidad 3: Secuencaidor
En esta practica se parte de la grfica siguente. Las especificaciones
del diseo nos pide que creemos un circuito que se ajuste al
comportamiento de la siguente grfica.
1
2
3
4
5
6
7
library ieee;
use ieee.std_logic_1164.all;
use work.uno.all;
entity total is port(
clk,reset:in bit;
salida:out std_logic_vector(3 downto
0));
end total;
Arquitectura 3: Secuenciador
Decodificador 2/4
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
use work.uno.all;
entity decoder is port (
seleccion:in std_logic_vector(1 downto 0);
enable1,enable2: in bit;
salida: out std_logic_vector(3 downto 0));
end decoder;
architecture archidecoder of decoder is
begin
decodificador:PROCESS(seleccion,enable1,enable2)
begin
if enable2='1' then salida<=(others=>'0');
elsif enable2='0' and enable1='0' then salida<=(others
elsif(enable1='1') then
CASE seleccion IS
when "00" => salida <= "0001";
when "01" => salida <= "0010";
when "10" => salida <= "0100";
when "11" => salida <= "1000";
when others => salida <="1111";
END CASE;
END IF;
END PROCESS decodificador;
END archidecoder;
Contador
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity cuad is port (
clk,reset:in bit;
conta:buffer std_logic_vector(1 downto 0));
end cuad;
=> '0');
Secuenciador
--EN ESTE FICHERO SE LLAMA A LAS LIBRERIAS DECLARADAS EN EL FICHERO
UNO
library IEEE;
use ieee.std_logic_1164.all;
use work.uno.all;
entity total IS PORT (
clk,reset:in bit;
salida:out std_logic_vector(3 downto 0));
end total;
architecture architotal of total is
SIGNAL intermedio:std_logic_vector(1 downto 0);
BEGIN
bloque1:octal port map(clk,reset,intermedio);
bloque2:decoder port map(intermedio,clk,reset,salida);
end architotal;
puertos
puertos
puertos
puertos
de
de
de
de
entradas
salidas
I/O
buffers
);
end circuito_a;
puertoa: in bit;
enable: in bit;
selec: in bit;
in1: in bit_vector(3 downto
0);
in2: in bit_vector(3 downto
0);
out1:out bit_vector(3
downto 0)
);
end multi;
architecture archpro of
programa is
-- declaracin de seales y otros
accesorios
begin
-- ncleo del programa
end archpro;
Paquetes
end nombre_del_package;
end nombre_del_package;
Todo esto hace posible que una vez declarados los subprogramas
dentro de un package, podamos utilizarlos haciendo nicamente uso
de una llamada al proceso, asignndole un nombre y la lista de
parmetros necesarios.
Para poder usar o llamar a un package que ha sido descrito
anteriormente, debemos incluir la clusula use antes del cuerpo de la
arquitectura.
use work.std_arith.all;
use work.uno.all;
entity count is port (
clk,reset:in bit;
conta:buffer std_logic_vector(1 downto 0));
end count;
architecture archicount of count is
begin
contador :process (clk,reset)
begin
if (reset='1') then conta <= (others => '0') ;
elsif clk'event and clk='1' then conta <= conta + 1;
end if;
end process contador;
end archicount;
--Declaracin de las arquitecturas
--Descripcion del decodificador 3/8 (74ls138)
library ieee;
use ieee.std_logic_1164.all;
use work.uno.all;
entity decoder is port (
seleccion
:in std_logic_vector(1 downto 0);
enable1,enable2:in bit;
salida
:out std_logic_vector(3 downto 0));
end decoder;
--Descripcin del decodificador
architecture archidecoder of decoder is
begin
decodificador:process(seleccion,enable1,enable2)
begin
if enable2='1' then salida<=(others=>'0');
elsif enable2='0' and enable1='0' then salida<=(others => '0');
elsif(enable1='1') then
case seleccion is
when "00" => salida <= "0001";
when "01" => salida <= "0010";
when "10" => salida <= "0100";
when "11" => salida <= "1000";
when others => salida <="1111";
end case;
end if;
end process decodificador;
end archidecoder;
Mdulo de
sumadores/restadores
Llamamos a lpmpkg
Vamos a multiplicar a y b
Y vamos a sumar s
El resultado es p
Llamamos a lpmpkg
En este ejemplo hemos hecho uso del mdulo mmult, el cual nos
exige no slo introducirle las seales con las cuales operar (con la
12 Identificadores
34 Smbolos especiales
56 Expresiones y operadores
7
Objetos
Identificadores
Palabras reservadas
else
elsif
end
entity
exit
file
for
function
generate
generic
guarded
if
in
inout
is
label
library
linkage
loop
map
mod
nand
new
next
nor
not
null
of
on
open
or
others
out
package
port
procedure
process
range
record
register
rem
report
return
select
severity
signal
subtype
then
to
transoprt
type
units
until
use
variable
wait
when
while
with
xor
Smbolos especiales
Tipos de datos
Expresiones y operadores
OPERADORES LGICOS
OPERADORES RELACIONALES
OPERADORES ARITMTICOS
OPERADOR CONCADENACIN
+ - * / **
MOD, REM, ABS
&
Los elementos a concadenar deben de ser del mismo tipo. Este tipo
de operador es muy empleado a la hora de trabajar con buses o
registros. El resultado que nos devuelve este operador es un array de
los elementos de los operandos concatenados. En nuestro ejemplo, si
"a" es un array de cuatro bits, la variable "aux", pasara a tener en su
primera poscicion el valor "0" y a continuacion tendra el valor de los
elementos de "a", de forma que "aux" pasa a tener dimension cinco.
Si el elemento ms a la izquierda de
entrada es '0', entonces se ejecuta lo que
sigue al then
Si el elemento ms a la derecha de
entrada es '1', entonces se ejecuta lo que
sigue al then
Sentencias secuenciales
Asignacin a variable
a toma el valor b
b toma el NUEVO valor de a (el de
b)
Sentencia if
si enable es 1 entonces
d="1111"
si enable no es 1 y es 0
entonces
sentencia case dentro del if
end if;
end process;
end archmul;
Sentencia case
finaliza la arquitectura
Esta sentencia es muy tpica de los lenguajes de programacin y
cuenta adems con una variante, muy importante en VHDL, como es
dar un valor especificado a la cierta seal si no se contemplan todos
los casos posibles de la seal a evaluar. Para ello se usa la palabra
reservada others, que aparece en el siguiente fragmento de cdigo:
case control is
when "00" => d <= a;
when "01" => d <= b;
when "10" => d <= c;
when others => d <=
"1111";
end case;
Sentencia loop
case control is
when "000" to "010" => d <= a;
when "011" to "110" => d <= b;
when "111"
=> d <= c;
when others
=> d <= null;
end case;
Sentencia exit
Sentencia next
Sentencia null
Sentencia wait
process
begin
x <= a and b and c;
wait on a,b,c;
end process;
Sentencias concurrentes
c <= a and b;
s <= a xor b;
Sentencia Process
sentencias secuenciales
end process etiqueta;
ejecuta el proceso.
v toma instantaneamente el
valor de b
v se incrementa
instantaneamente si a vale
"1111"
b toma el valor de v
process(control,entrada1,entrada2)
begin
if control='1' then
salida<=entrada1;
else
salida<=entrada2;
end if;
end process;
process(a, b, operacion)
begin
case operacin is
when "00" => resul <=
when "01" => resul <=
when "10" => resul <=
when "11" => resul <=
b);
end case;
end process;
a and b;
a or b;
a xor b;
not(a and
Sentencias estructurales
library ieee;
use work.gatespkg.all;
component inv
port (
a : in bit;
qn : out bit
);
end component;
use work.cypress.all;
entity and2 is
port (
a,b : in bit;
q : out bit
);
end and2;
architecture archand2 of and2 is
begin
q <= (a and b);
end archand2;
use work.cypress.all;
entity or2 is
port (
a,b : in bit;
q : out bit
);
end or2;
architecture archor2 of or2 is
begin
q <= (a or b);
end archor2;
use work.cypress.all;
entity inv is
port (
a : in bit;
qn : out bit
);
end inv;
architecture archinv of inv is
begin
qn <= not (a);
end archinv;
Subprogramas
Funciones
end process;
En esta ocasin hemos hecho la asignacin de las entradas por
posicin: al ejecutarse la funcin, el compilador usa el valor de
numero1 como a, ya que numero1 es el primer valor que se
introduce en la funcin y a es el primero incluido en la declaracin de
la funcin. Lo mismo ocurre con numero2 y con b. Tambin podamos
haber hecho el asignamiento por nombre de cualquiera de las
siguientes formas, siendo ambas equivalentes:
salida := sumar ( numero1=>a, numero2=>b );
salida := sumar ( numero2=>b, numero1=>a );
Sea cual sea la forma en la cual asignemos las seales a la entrada
del subprograma, stas deben coincidir en el tipo, es decir, en el
ejemplo no podamos haber introducido en la funcin numero1 y
numero2 si stos hubieran sido del tipo entero o bit. De la misma
forma la variable o la seal a la cual asignamos el valor de la funcin
debe coincidir con el tipo del objeto que hemos especificado para la
salida en la funcin. Es decir, no podemos asignar a salida el valor de
la funcin que hemos creado si es del tipo integer (por ejemplo), ya
que la salida de la funcin es suma que es del tipo std_logic_vector.
Procedimientos
Interface, compilador e
implementacin fsica
VHDL sintetizable 12 Galaxy de Cypress
4 Grabacin de nuestros
Nova de Cypress 3
diseos
VHDL sintetizable
Galaxy de Cypress
El botn set top sirve para indicar cual de los ficheros a compilar
es el principal, del cual cuelgan los dems ficheros. El botn generic
nos lleva al men que nos permitir elegir ciertas opciones como si
deseamos optimizar la velocidad o el rea usada del dispositivo de
lgica programable. El aspecto del men es el siguiente:
Nova de Cypress
Una vez que hayamos dado este paso, estaremos preparados para
grabar nuestra PLD en las mquinas dispuestas a tal efecto.
ELECTRONICO-ETN
Base, Colector, Emisor electronica la Mejor.
FAC. INGENIERIA
PUBLICACIONES
PROYECTOS
Buscar en el B GO
port
Ejemplo 7:
Disear en VHDL, un codificador 4:2 (como el ejemplo anterior), sin tanto codigo. realizarlo mas
eficientemente
Solucion:
--------------------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
-- Codificador de prioridad + eficiente
-------------------------------------------------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:
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)
----------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
---------------------------------------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);
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:
---------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
--------------------------------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
-- 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 seleccion. USANDO
multiplexores de 4 a 1
Solucion:
----------------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
---------------------------------------------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;
Articulos Relacionados
ping-pong 2 Jugadores
ELECTRONICO-ETN
Base, Colector, Emisor electronica la Mejor.
FAC. INGENIERIA
PUBLICACIONES
PROYECTOS
Buscar en el B GO
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
Bueno esperaba poderles mostrar el reloj digital y el cronometro, pero no sera posible
hasta terminar el semestre ya que no tengo tiempo... una sugerencia muy util, si no
pueden disear en leguaje vhdl la manera mas sencilla de presentar los trabajos en
laboratorios de simulacion es realizar la captura esquematica utilizando el quartus2 o el
webpack ise xilinx ya que los simuladores en captura esquematica tienen todos los
componentes basicos para realizar cualquier trabajo de digi y solamente es agarrar el
componente y conectar con cables como el multisim o proteus
Articulos Relacionados
ping-pong 2 Jugadores
ELECTRONICO-ETN
Base, Colector, Emisor electronica la Mejor.
FAC. INGENIERIA
PUBLICACIONES
PROYECTOS
Buscar en el B GO
Ejemplo 13:
Disear en VHDL, generador de bits para la coreccion de errores de un Bcd aiken
Solucion:
--------------------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
-- deteccion y correccion de errores
-------------------------------------------------library ieee;
use ieee.std_logic_1164.all;
entity DyCdeError is
port
(I: in std_logic_vector (3 downto 0);
bits: out std_logic_vector (7 downto 1));
end DyCdeError;
architecture rtl of DyCdeError is
begin
PROCESS(I)
BEGIN
CASE I IS
WHEN "0000" => bits <= "0000000";
WHEN "0001" => bits <= "0000111";
WHEN "0010" => bits <= "0011001";
WHEN "0011" => bits <= "0011110";
WHEN "0100" => bits <= "0101010";
WHEN "1011" => bits <= "1010101";
WHEN "1100" => bits <= "1100001";
WHEN "1101" => bits <= "1100110";
WHEN "1110" => bits <= "1111000";
WHEN "1111" => bits <= "1111111";
WHEN OTHERS => bits <= "0000000";
END CASE;
END PROCESS;
END rtl;
Ejemplo 14:
Ejemplo 15:
Disear en VHDL, disee un sumador simple, con acarreo
----------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
---------------------------------------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 sumdor de 8 bits con signo
Solucion:
---------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
--------------------------------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 ;
Articulos Relacionados
ping-pong 2 Jugadores
ELECTRONICO-ETN
Base, Colector, Emisor electronica la Mejor.
FAC. INGENIERIA
PUBLICACIONES
PROYECTOS
Buscar en el B GO
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 codigo. realizarlo mas
eficientemente
Solucion:
--------------------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
-- Codificador de prioridad + eficiente
-------------------------------------------------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 informacion de A mayor que
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)
----------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
---------------------------------------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;
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:
---------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
--------------------------------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
-- 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 seleccion. USANDO
multiplexores de 4 a 1
Solucion:
----------------------------------------------- electronico-etn.blogspot.com
-- ejemplos practiicos
---------------------------------------------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;