Documentos de Académico
Documentos de Profesional
Documentos de Cultura
01 Resumen VHDL PDF
01 Resumen VHDL PDF
3 - Diseño Lógico
Combinacional con VHDL
Cap.3 – Diseño Lógico Combinacional con VHDL Programación de Estructuras Básicas
Diseño
Diseño (Programación)
(Programación) de
de una
una
Estructura
Estructura Básica
Básica Combinatoria
Combinatoria
Biblioteca
Biblioteca (s)
(s)
Declaración
Declaración
Sintaxis:
Sintaxis:
Entidad
Entidad
ARCHITECTURE
ARCHITECTURE nombre_arquitectura
nombre_arquitectura OF
OF nombre_entidad
nombre_entidad IS
IS
Declaración
Declaración {Declarativas
{Declarativas de
de Bloque}
Bloque} ––Se
Se analizarán
analizarán posteriormente
posteriormente
Arquitectura
Arquitectura BEGIN
BEGIN
{Enunciados
{Enunciados Concurrentes}
Concurrentes}
END
END [nombre_arquitectura]
[nombre_arquitectura]
Enunciado
Enunciado Concurrente.
Concurrente.
Unidad
Unidad de
de Cómputo/Cálculo
Cómputo/Cálculo que
que realiza
realiza lo
lo siguiente:
siguiente:
•Lectura
•Lectura de
de Señales.
Señales.
•Realiza
•Realiza cálculos
cálculos basados
basados en
en los
los valores
valores de
de las
las Señales.
Señales.
•Asigna
•Asigna los
los valores
valores calculados
calculados aa Señales
Señales específicas.
específicas.
Cap.3 – Diseño Lógico Combinacional con VHDL Enunciados Concurrentes
Asignación
Asignación de
de Señales
Señales
Tipos:
Tipos:
•Asignaciones
•Asignaciones de
de Señales
Señales mediante
mediante Ecuaciones
Ecuaciones Booleanas
Booleanas
•Asignaciones
•Asignaciones Condicionales
Condicionales de
de Señales
Señales –– La
La construcción
construcción when-else
when-else
•Asignaciones
•Asignaciones de
de Señales
Señales por
por Selección
Selección –– La
La construcción
construcción with-select-when
with-select-when
SEÑALES
SEÑALES Y
Y VARIABLES
VARIABLES
VARIABLES:
VARIABLES:
Es
Es similar
similar al
al concepto
concepto de
de variable
variable enen otros
otros lenguajes.
lenguajes. Su
Su valor
valor puede
puede ser
ser
alterado
alterado en
en cualquier
cualquier instante
instante yy se
se le
le puede
puede asignar
asignar un
un valor
valor inicial.
inicial. Las
Las
variables
variables sólo
sólo se
se declaran
declaran en
en los
los procesos
procesos oo subprogramas.
subprogramas.
Utilizadas
Utilizadas en
en ejecuciones
ejecuciones en
en serie.
serie.
SEÑALES:
SEÑALES:
Se
Se declaran
declaran igual
igual que
que las
las constantes
constantes yy variables.
variables. La
La diferencia
diferencia eses que
que pueden
pueden
ser
ser normal,
normal, register
register yy bus.
bus. SiSi no
no se
se especifica
especifica nada
nada en
en la
la declaración
declaración elel
compilador
compilador entenderá
entenderá queque eses del
del tipo
tipo normal.
normal. Se
Se puede
puede decir
decir que
que la
la señal
señal
tiene
tiene dos
dos partes
partes una
una donde
donde se se escribe
escribe yy otra
otra donde
donde se
se lee.
lee. Las
Las señales
señales pueden
pueden
ser
ser declaradas
declaradas sólo
sólo en
en las
las arquitecturas,
arquitecturas, paquetes PACKAGE)) oo en
paquetes ((PACKAGE en bloques
bloques
concurrentes
concurrentes ((BLOCK
BLOCK). ).
Utilizadas
Utilizadas en
en ejecuciones
ejecuciones concurrentes.
concurrentes.
Cap.3 – Diseño Lógico Combinacional con VHDL Programación de Estructuras Básicas
SEÑALES
SEÑALES Y
Y VARIABLES
VARIABLES
--Uso
--Uso incorrecto
incorrecto de
de las
las señales
señales --Uso
--Uso correcto
correcto de
de las
las señales
señales
ARCHITECTURE
ARCHITECTURE ejem1
ejem1 OF
OF entidad
entidad IS
IS ARCHITECTURE
ARCHITECTURE ejem1
ejem1 OF
OF entidad
entidad IS
IS
SIGNAL
SIGNAL a,
a, b,
b, c,
c, x,
x, yy :: INTEGER;
INTEGER; SIGNAL
SIGNAL a,
a, b,
b, x,
x, yy :: INTEGER;
INTEGER;
BEGIN
BEGIN BEGIN
BEGIN
P1:
P1: PROCESS
PROCESS (a,b,c)
(a,b,c) P1:
P1: PROCESS
PROCESS (a,b)
(a,b)
BEGIN
BEGIN VARIABLE
VARIABLE c:
c: INTEGER;
INTEGER;
c<=
c<= a;
a; --Se
--Se ignora
ignora BEGIN
BEGIN
x<=c+2;
x<=c+2; c:=
c:= a;
a; --Inmediato
--Inmediato
c<=b;
c<=b; --Se
--Se mantiene
mantiene x<=c+2;
x<=c+2;
y<=c+2;
y<=c+2; c:=b;
c:=b; --Inmediato
--Inmediato
END
END PROCESS
PROCESS p1;
p1; y<=c+2;
y<=c+2;
END
END ejem1
ejem1 END
END PROCESS
PROCESS p1;
p1;
END
END ejem1
ejem1
Cap.3 – Diseño Lógico Combinacional con VHDL Operadores Lógicos
Operadores Lógicos
and, or, nand, xor, xnor, not
Tipos de Operandos permisibles: bit, boolean y arreglos unidimensionales (del
tipo bit o boolean)
Operandos deben tener la misma longitud, excepto para el operador not, el cual
se aplica por lo general a un solo operando.
Si una expresión incluye varios de estos operadores (p.ej. AND, NOT, XNOR)
es necesario utilizar paréntesis para evaluarla correctamente.
Ejemplos:
Ejemplos:
Asignaciones
Asignaciones de
de Señales
Señales mediante
mediante Ecuaciones
Ecuaciones Booleanas
Booleanas
a x1
b
c x2
d
x3
e
f
L Ejemplo Nº 1 – Asignaciones de Señales – Uso de Ecs. Booleanas
1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity logica is
4 port (a,b,c, d, e, f: in std_logic;
5 x1, x2, x3: out std_logic);
6 end logica;
7 architecture booleana of logica is
En este tipo de 8 begin
asignaciones, cada
función de salida es 9 x1 <= a xnor b;
descrita mediante su 10 x2 <= ((c and d) or (a xnor b)) nand ((e xor f) and (c and d));
ecuación booleana
correspondiente, lo 11 x3 <= (e xor f) and (c and d);
cual implica el uso de
operadores lógicos. 12 end booleana;
Cap.3 – Diseño Lógico Combinacional con VHDL Asignación de Señales
Asignaciones
Asignaciones de
de Señales
Señales mediante
mediante Ecuaciones
Ecuaciones Booleanas
Booleanas
L Ejemplo Nº 2 – Asignaciones de Señales – Uso de Ecs. Booleanas
A B C X Y Z 1 library ieee;
0 0 0 1 0 1 2 use ieee.std_logic_1164.all;
3 entity logica is
0 0 1 1 1 0
4 port (A,B,C: in std_logic;
0 1 0 0 0 1
5 X,Y,Z: out std_logic);
0 1 1 1 0 1 6 end logica;
1 0 0 0 0 0 7 architecture a_log of logica is
1 0 1 0 1 0 8 begin
1 1 0 0 1 0 9 X <= (not A and not B and not C) or (not A and not B and C)
1 1 1 1 0 0 10 or (not A and B and C) or (A and B and C);
11 Y <= (not A and not B and C) or (A and not B and C)
12 or (A and B and not C);
13 Z <= (not A and not B and not C) or (not A and B and not C)
14 or (not A and B and C);
15 end a_log;
X = A B C + A B C + A BC + ABC
Y = A B C + AB C + ABC
Z = A B C + A BC + A BC
Cap.3 – Diseño Lógico Combinacional con VHDL Asignación de Señales
Asignaciones
Asignaciones Condicionales
Condicionales de
de Señales
Señales -- La
La construcción
construcción when-else
when-else
a Entidad f(a,b,c)
b L Ejemplo Nº 3 - Uso de la construcción when-else
c Tabla 1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity tabla is
a b c f 4 port (a,b,c: in std_logic;
0 0 0 1 5 f: out std_logic);
6 end tabla;
0 0 1 0
7 architecture arq_tabla of tabla is
0 1 0 0 8 begin
0 1 1 1 9 f <= ‘1’ when (a = ‘0’ and b=‘0’ and c=‘0’) else
1 0 0 0 10 ‘1’ when (a = ‘0’ and b=‘1’ and c=‘1’) else
11 ‘1’ when (a = ‘1’ and b=‘1’ and c=‘0’) else
1 0 1 0
12 ‘1’ when (a = ‘1’ and b=‘1’ and c=‘1’) else
1 1 0 1 13 ‘0’;
1 1 1 1 14 end arq_tabla;
La construcción when-else permite definir paso a paso el comportamiento de un sistema. Para esto, es necesario
declarar los valores que se le deben asignar a una determinada señal (o grupo) en función de las diferentes
condiciones de entrada posibles. El orden en el que se declaren las condiciones de entrada, no es importante.
Cap.3 – Diseño Lógico Combinacional con VHDL Asignación de Señales
Asignaciones
Asignaciones Condicionales
Condicionales de
de Señales
Señales -- La
La construcción
construcción when-else
when-else
A B C D F
L Ejemplo Nº 4 - Uso de la construcción when-else
0 0 0 0 1
1 library ieee;
0 0 0 1 0
2 use ieee.std_logic_1164.all;
0 0 1 0 0
3 entity funcion is
0 0 1 1 0
4 port (A,B,C,D: in std_logic;
0 1 0 0 0 5 F: out std_logic);
0 1 0 1 1 6 end funcion;
0 1 1 0 1 7 architecture a_func of funcion is
0 1 1 1 0 8 begin
9 F <= ‘1’ when (A = ‘0’ and B=‘0’ and C=‘0’ and D=‘0’) else
1 0 0 0 0
10 ‘1’ when (A = ‘0’ and B=‘1’ and C=‘0’ and D=‘1’) else
1 0 0 1 0
11 ‘1’ when (A = ‘0’ and B=‘1’ and C=‘1’ and D=‘0’) else
1 0 1 0 0
12 ‘1’ when (A = ‘1’ and B=‘1’ and C=‘1’ and D=‘1’) else
1 0 1 1 0 13 ‘0’;
1 1 0 0 0 14 end a_func;
1 1 0 1 0
1 1 1 0 0
1 1 1 1 1
Cap.3 – Diseño Lógico Combinacional con VHDL Asignación de Señales
Asignaciones
Asignaciones de
de Señales
Señales por
por Selección
Selección –– La
La construcción
construcción with-select-when
with-select-when
•La estructura with-select-when se utiliza para asignar un valor (de varios posibles) a una señal o grupo de señales con
base a los diferentes valores de otra señal o grupo de señales previamente seleccionada(o).
•Por lo general, un grupo de señales forman un vector, como en el ejemplo descrito a(1) y a(0) forman el vector a.
Cap.3 – Diseño Lógico Combinacional con VHDL Asignación de Señales
Asignaciones
Asignaciones de
de Señales
Señales por
por Selección
Selección –– La
La construcción
construcción with-select-when
with-select-when
L Ejemplo Nº 6 – Uso de la construcción with-select-when
X3 X2 X1 X0 F
Circuito Combinatorio que detecte Números Primos de 4-Bits
0 0 0 0 0
1 library ieee;
0 0 0 1 1
2 use ieee.std_logic_1164.all;
0 0 1 0 1 3 entity seleccion is
0 0 1 1 1 4 port (X: in std_logic_vector (3 downto 0);
0 1 0 0 0 5 F: out std_logic);
0 1 0 1 1 6 end seleccion;
0 1 1 0 0 7 architecture a_selec of seleccion is
8 begin
0 1 1 1 1
9 with X select
1 0 0 0 0
10 F <= ‘1’ when “0001”,
1 0 0 1 0 11 ‘1’ when “0010”,
1 0 1 0 0 12 ‘1’ when “0011”,
1 0 1 1 1 13 ‘1’ when “0101”,
1 1 0 0 0 14 ‘1’ when “0111”,
15 ‘1’ when “1011”,
1 1 0 1 1
16 ‘1’ when “1101”,
1 1 1 0 0
17 ‘0’ when others;
1 1 1 1 0 18 end a_selec;
Cap.3 – Diseño Lógico Combinacional con VHDL Ejemplo general- MUX
Asignaciones
Asignaciones de
de Señales
Señales mediante
mediante Ecuaciones
Ecuaciones Booleanas
Booleanas
--Ejemplo 7. Multiplexor de 4 a 1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------
ENTITY mux IS
PORT ( a, b, c, d, so, s1: IN STD_LOGIC;
y: OUT STD_LOGIC);
END mux;
------------------------------------------------------------------
ARCHITECTURE ecu_booleana OF mux IS
BEGIN
y <= ( a AND NOT s1 AND NOT s0) OR
(b AND NOT s1 AND s0) OR
(c AND s1 AND NOT s0) OR
(d AND s1 AND s0);
END ecu_boolena;
Cap.3 – Diseño Lógico Combinacional con VHDL Ejemplo general- MUX
Asignaciones
Asignaciones Condicionales
Condicionales de
de Señales
Señales -- La
La construcción
construcción when-else
when-else
--Ejemplo 8. Multiplexor de 4 a 1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------
ENTITY mux IS
PORT ( a, b, c, d: IN STD_LOGIC;
sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
y: OUT STD_LOGIC);
END mux;
------------------------------------------------------------------
ARCHITECTURE mux1 OF mux IS
BEGIN
y <= a WHEN sel=“00” ELSE
b WHEN sel=“01” ELSE
c WHEN sel=“10” ELSE
d;
END mux1;
Cap.3 – Diseño Lógico Combinacional con VHDL Ejemplo general- MUX
Asignaciones
Asignaciones de
de Señales
Señales por
por Selección
Selección –– La
La construcción
construcción with-select-when
with-select-when
--Ejemplo 9. Multiplexor de 4 a 1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
-----------------------------------------------------------------
ENTITY mux IS
PORT ( a, b, c, d: IN STD_LOGIC;
sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
y: OUT STD_LOGIC);
END mux;
------------------------------------------------------------------
ARCHITECTURE mux2 OF mux IS
BEGIN
WITH sel SELECT
y <= a WHEN “00”, --Notar que se pone “,” en lugar de “;”
b WHEN “01”,
c WHEN “10”,
d WHEN OTHERS; --No es: “[d WHEN “11”]”.
END mux2;
Cap.3 – Diseño Lógico Combinacional con VHDL Ejemplo general- MUX
Asignaciones
Asignaciones de
de Señales
Señales por
por Selección
Selección –– Con
Con el
el tipo
tipo de
de dato
dato INTEGER
INTEGER
Multiplexores:Mux
Multiplexores:Mux 44 aa 11 (2-Bits)
(2-Bits)
Ejemplo Nº 11 – Multiplexor 4 a 1 / Uso de Ecs. Booleanas
library ieee;
a[1:0] use ieee.std_logic_1164.all;
00
b[1:0] entity mux_eb is
01 Mux z[1:0]
c[1:0] port (a, b, c, d: in std_logic_vector (1 downto 0);
10 s: in std_logic_vector (1 downto 0);
d[1:0]
z: out std_logic_vector (1 downto 0));
11
end mux_eb;
s[1:0] architecture arqmux_eb of mux_eb is
begin
z(1) <= (a(1) and not s(1) and not s(0)) or
(b(1) and not s(1) and s(0)) or
(c(1) and s(1) and not s(0)) or
(d(1) and s(1) and s(0));
z(0) <= (a(0) and not s(1) and not s(0)) or
(b(0) and not s(1) and s(0)) or
(c(0) and s(1) and not s(0)) or
(d(0) and s(1) and s(0));
end arqmux_eb;
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Multiplexores:
Multiplexores: Mux
Mux 44 aa 11 (2-Bits)
(2-Bits)
Proceso
Proceso (process)
(process)
•Cada
•Cada proceso
proceso es
es conformado
conformado por
por un
un conjunto
conjunto de
de enunciados
enunciados secuenciales.
secuenciales.
•Enunciados Secuenciales
•Enunciados Secuenciales Éstos
Éstos son
son interpretados
interpretados por
por la
la herramienta
herramienta de
de
síntesis
síntesis en
en forma
forma secuencial,
secuencial, es
es decir,
decir, uno
uno por
por uno;
uno; por
por lo
lo que
que el
el orden
orden en
en el
el
cual
cual son
son declarados
declarados tiene
tiene un
un efecto
efecto significativo
significativo en
en la
la lógica
lógica que
que se
se intenta
intenta
describir
describir oo sintetizar.
sintetizar.
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
•• Enunciados
Enunciados de
de Asignación
Asignación de
de Variables
Variables
Proceso
Proceso (process)
(process) •• Enunciados
Enunciados de
de Asignación
Asignación de
de Señales
Señales
•• Enunciados
Enunciados ifif
•• Enunciados
Enunciados case
case
•• Enunciados
Enunciados loop
loop
Enunciados
Enunciados Secuenciales
Secuenciales •• Enunciados
Enunciados next
next
•• Enunciados
Enunciados exit
exit
•• Enunciados
Enunciados de
de Subprogramas
Subprogramas
•• Enunciados
Enunciados return
return
Nota importante:
Una señal que se vea involucrada dentro de un •• Enunciados
Enunciados wait
wait
proceso no recibe inmediatamente el valor asignado,
sólo hasta el final del mismo. Una variable que sea •• Enunciados
Enunciados null
null
utilizada dentro de un proceso sí recibe el valor de
forma inmediata.
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
Enunciados
Enunciados if:
if: if la_condición_es_cierta then
•La
•La construcción
construcción if-then-else
if-then-else {ejecuta grupo-1 de enunciados secuenciales};
else
{ejecuta grupo-2 de enunciados secuenciales};
end if;
Enunciados
Enunciados if:
if: if la_condición-1_se_cumple then
{ejecuta grupo-1 de enunciados secuenciales};
•La
•La construcción
construcción if-then-elsif-then-else
if-then-elsif-then-else
elsif la_condición-2_se_cumple then
{ejecuta grupo-2 de enunciados secuenciales};
else
{ejecuta grupo-3 de enunciados secuenciales};
end if;
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
Enunciados
Enunciados CASE:
CASE:
•• La
La construcción
construcción case
case -- when
when ejecuta
ejecuta una
una oo
varias
varias instrucciones
instrucciones secuenciales
secuenciales que que
dependen
dependen del
del valor
valor de
de una
una sola
sola expresión.
expresión.
SINTAXIS
case expression is
when choices => { sequential_statement }
when choices => { sequential_statement }
end case;
DESCRIPCION
DESCRIPCION
expression:
expression: evalúa
evalúa aa un
un entero,
entero, oo tipo
tipo enumerado.
enumerado.
sequential_statement:
sequential_statement: uno
uno oo mas
mas enunciados
enunciados secuenciales.
secuenciales.
choices:
choices: opciones.
opciones.
La
La última
última opción
opción puede
puede ser
ser others
others (valor
(valor por
por omisión
omisión del
del resto
resto de
de
las
las opciones).
opciones).
Cap.3 – Diseño Lógico Combinacional con VHDL Operadores Relacionales
Operadores Relacionales
Características.
•Uso: Para fines de comparación de datos.
•Operadores incluidos en los paquetes: std_numeric y std_logic_arith
•Los operadores de Igualdad y Desigualdad (= , /=) utilizan todos los tipos
de datos.
•Los operadores (<, <=, >, >=) son definidos para los tipos escalar y
arreglos unidimensionales de tipos de datos enumerados o enteros.
Operador Significado
= Igual
/= Diferente
< Menor
<= Menor o Igual
> Mayor
>= Mayor o Igual
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
La
La construcción:
construcción: if-then-else
if-then-else
La
La construcción:
construcción: if-then-else
if-then-else
La
La construcción:
construcción: case-when
case-when --Ejemplo 14. Mux 2a1 empleando case.
library ieee;
use ieee.std_logic_1164.all;
ENTITY mux IS
La construcción case es similar a la PORT ( a, b, sel: IN STD_LOGIC;
instrucción with/select/when por que
tiene una señal de selección e incluye sal: OUT STD_LOGIC );
cláusulas when para diversas END mux;
combinaciones de señal.
Ejemplo
Ejemplo 15.
15. Decodificador:
Decodificador: BCD
BCD aa 7-Segmentos
7-Segmentos
a
b a
A0 Código BCD (A) Segmentos del Display (d)
1 c
A1 f g b d6 d5 d4 d3 d2 d1 d0
2 d A3 A2 A1 A0
A2 a b c d e f g
4 e e c
A3 0 0 0 0 0 0 0 0 0 0 1
8 f d
0 0 0 1 1 0 0 1 1 1 1
g d[6:0]
0 0 1 0 0 0 1 0 0 1 0
Salidas en Activo-Bajo 0 0 1 1 0 0 0 0 1 1 0
0 1 0 0 1 0 0 1 1 0 0
0 1 0 1 0 1 0 0 1 0 0
0 1 1 0 0 1 0 0 0 0 0
0 1 1 1 0 0 0 1 1 1 0
1 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 1 0 0
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Decodificadores:
Decodificadores: BCD
BCD aa 7-Segmentos
7-Segmentos
Ejemplo Nº 15 – Decodificador
BCD a 7-Segmnetos
(Uso de construcción case-when)
library ieee;
when “0101” => d <= “0100100”;
use ieee.std_logic_1164.all;
when “0110” => d <= “0100000”;
entity decobcd_7s is
when “0111” => d <= “0001110”;
port (A: in std_logic_vector (3 downto 0);
when “1000” => d <= “0000000”;
d: out std_logic_vector (6 downto 0));
when “1001” => d <= “0000100”;
end decobcd_7s;
when others => d <= “1111111”;
architecture arqdeco of decobcd_7s is
end case;
begin
end process;
process (A) begin
end arqdeco;
case A is
when “0000” => d <= “0000001”;
when “0001” => d <= “1001111”;
Construcción case-when: En esta construcción se evalua la
when “0010” => d <= “0010010”; expresión especificada (case) y el valor que se obtenga se
compara con los asociados a las diferentes opciones
when “0011” => d <= “0000110”; descritas. Aquella opción (when) que coincida con dicho
when “0100” => d <= “1001100”; valor, le serán ejecutados sus enunciados secuenciales
adyancentes.
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Decodificadores:
Decodificadores: BCD
BCD aa Decimal
Decimal if x = “0000” then
a <= ‘0’;
Ejemplo Nº 16 – Decodificador de BCD a Decimal elsif x = “0001” then
library ieee; b <= ‘0’;
use ieee.std_logic_1164.all; elsif x = “0010” then
entity deco is c <= ‘0’;
port (x: in std_logic_vector (3 downto 0); elsif x = “0011” then
a, b, c, d, e, f, g, h, i, j: out std_logic); d <= ‘0’;
end deco; elsif x = “0100” then
architecture arqdeco of deco is e <= ‘0’;
begin BCD/DEC 0 a elsif x = “0101” then
process (x) begin 1 b f <= ‘0’;
a <= ‘1’; elsif x = “0110” then
2 c
b <= ‘1’; g <= ‘0’;
x0 1 3 d elsif x = “0111” then
c <= ‘1’;
d <= ‘1’; x1 2 4 e h <= ‘0’;
e <= ‘1’; x2 4 5 f elsif x = “1000” then
f <= ‘1’; x3 8 6 g i <= ‘0’;
g <= ‘1’; h else j <= ‘0’;
7
h <= ‘1’; end if;
8 i
i <= ‘1’; Salidas en end process;
j <= ‘1’; Activo-Bajo 9 j end arqdeco;
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Codificadores:
Codificadores: Decimal
Decimal aa BCD
BCD DEC/BCD
a0 0
a1 1
Ejemplo Nº 17 – Codificador Decimal a BCD
a2 2
Entrada Decimal
d0
Salida BCD
library ieee; a3 3 1
d1
use ieee.std_logic_1164.all; a4 4 2
d2
entity codif is a5 5 4
d3
port (a: in std_logic_vector (9 downto 0); a6 6 8
d: out std_logic_vector (3 downto 0)); a7 7
end codif; a8 8
architecture arqcodif of codif is a9 9
begin
process (a) elsif a = “0001000000” then d <= “0110”;
begin elsif a = “0010000000” then d <= “0111”;
if a = “0000000000” then d <= “0000”; elsif a = “0100000000” then d <= “1000”;
elsif a = “0000000010” then d <= “0001”; elsif a= “1000000000” then d <= “1001”;
elsif a = “0000000100” then d <= “0010”; else d <= “1111”;
elsif a = “0000001000” then d <= “0011”; end if;
elsif a = “0000010000” then d <= “0100”; end process;
elsif a = “0000100000” then d <= “0101”; end arqcodif;
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
La
La construcción:
construcción: if-then-else
if-then-else
L Ejemplo Nº 18 - La construcción if-then-else
Comparador de dos palabras con long. de 2-bits
1 library ieee;
2 use ieee.std_logic_1164.all;
La construcción if-then-else sirve 3 entity comp is
para seleccionar una operación con
base al análisis (evaluación lógica 4 port (a,b: in std_logic_vector (1 downto 0);
Cierto o Falso) de una condición. 5 c: out std_logic);
6 end comp;
a
c 7 architecture funcional of comp is
b Comparador 8 begin
9 compara: process (a,b)
10 begin
11 if a = b then
12 c <= ‘1’;
Lista-Sensitiva
13 else Señales (incluyendo puertos) leídas por el proceso.
14 c <=‘0’;
15 end if;
16 end process compara;
17 end funcional;
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
La
La construcción:if-then-elsif-then-
construcción:if-then-elsif-then- L Ejemplo Nº 19 - La construcción if-then-elsif-then-else
else
else Comparador de Magnitud 2-Words de 4-bits
1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity comp4 is
La construcción if-then-elsif-then-else
se utiliza cuando se requiere analizar 4 port (a,b: in std_logic_vector (3 downto 0);
más de una condición de entrada.
5 x,y,z: out std_logic);
6 end comp4;
a=b x
a[3:0] 7 architecture arq_comp4 of comp4 is
8 begin
y
a>b 9 process (a,b)
z 10 begin
b[3:0] a<b 11 if (a = b) then
12 x <= ‘1’;
13 elsif (a > b) then
¿Qué circuito es inferido?
¿Qué valores tienen las otras 14 y <=‘1’;
salidas en este instante?
15 else
16 z <=‘1’;
17 end if;
18 end process;
19 end arq_comp4;
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
La
La construcción:when-else
construcción:when-else L Ejemplo Nº 20 - La construcción when-else
Comparador de Magnitud 2-palabras de 4-bits
1 entity comp4 is
2 port (a,b: in bit_vector (3 downto 0);
3 x,y,z: out bit);
La construcción when-else permite
definir paso a paso el comportamiento 4 end comp4;
de un sistema.
5 architecture arq_comp4 of comp4 is
6 begin
a=b x
a[3:0] 7 x <= ‘1’ when a = b else
8 ‘0’;
y
a>b 9 y <=‘1’ when a > b else
z 10 ‘0’;
b[3:0] a<b 11 z <=‘1’ when a < b else
12 ‘0’;
13 end arq_comp4;
¿Qué valores tienen las otras 14
salidas en este instante?
15
16
17
18
19
Cap.3 – Diseño Lógico Combinacional con VHDL Procesos (process)
Buffer-Salida
Buffer-Salida de
de 3-Estados
3-Estados
Ejemplo Nº 22 – Buffer Salida de 3-Estados
habilitar (enable) library ieee;
use ieee.std_logic_1164.all;
entrada salida entity tri_est is
port (enable, entrada: in std_logic;
salida: out std_logic);
end tri_est;
Tipos Lógicos Estándares
architecture arq_buffer of tri_est is
‘U’ Valor No-Inicializado begin
‘X’ Valor Fuerte Desconocido process (enable, entrada)
‘0’ 0 Fuerte begin
‘1’ 1 Fuerte if (enable = ‘0’) then El tipo de dato bit no soporta el valor
‘Z’, por lo que se debe utilizar el tipo
‘Z’ Alta Impedancia salida <= ‘Z’; std_logic, que si lo soporta.
else
‘W’ Valor Débil Desconocido
salida <= entrada;
‘L’ 0 Débil
end if;
‘H’ 1 Débil end process;
‘-’ No Importa (Don’t Care) end arq_buffer;
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Sumadores:
Sumadores: Medio
Medio Sumador
Sumador
Suma = A ⊕ B
Cout = AB
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Sumadores:
Sumadores: Sumador
Sumador Completo
Completo Cin SUMA
Medio
A SUMA Sumador
Sumador
B A
Completo Cout
Cin Medio Cout
B
Sumador
Sumador Completo
A B Cin Suma Cout
0 0 0 0 0
Medio Sumador
0 0 1 1 0 Cin SUMA
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1 A Cout
1 1 0 0 1
1 1 1 1 1 B
Medio Sumador
Suma = A B Cin + A BCin + A B Cin + ABCin = A ⊕ B ⊕ Cin
Sumador Completo
Cout = AB + BCin + ACin = AB + (A ⊕ B)Cin
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
Sumadores:
Sumadores: Sumador
Sumador Completo
Completo Suma = A BCin + ABCin + ABCin + ABCin = A ⊕ B ⊕ Cin
Cout = AB + BCin + ACin = AB + ( A ⊕ B )Cin
Sumadores:
Sumadores: Sumador
Sumador Paralelo
Paralelo 4-Bits
4-Bits Ejemplo Nº 25 – Sumador Paralelo 4-Bits
library ieee;
S0 use ieee.std_logic_1164.all;
A0 Σ C0 entity suma is
B0 port (A, B: in std_logic_vector (3 downto 0);
S: out std_logic_vector (3 downto 0);
S1
Cout: out std_logic);
A1 Σ C1 end suma;
B1 architecture arqsuma of suma is
signal C: std_logic_vector (2 downto 0);
S2
- -ATTRIBUTE synthesis_off OF C: SIGNAL IS true;
A2 Σ C2 begin
B2 S(0) <= A(0) xor B(0);
C(0) <= A(0) and B(0);
S3
S(1) <= (A(1) xor B(1)) xor C(0);
A3 Σ Cout C(1) <= (A(1) and B(1)) or (C(0) and (A(1) xor B(1)));
B3
S(2) <= (A(2) xor B(2)) xor C(1);
Declaraciones de Señales (signal): Especifican C(2) <= (A(2) and B(2)) or (C(1) and (A(2) xor B(2)));
señales que permiten conectar los diferentes
tipos de enunciados concurrentes (asignación de S(3) <= (A(3) xor B(3)) xor C(2);
señales, bloques, procesos y llamadas a
componentes o procedimientos) de que consta
Cout <= (A(3) and B(3)) or (C(2) and (A(3) xor B(3)));
una arquitectura. end arqsuma;
Cap.3 – Diseño Lógico Combinacional con VHDL FOR-GENERATE
Sumadores:
Sumadores: Sumador
Sumador Paralelo
Paralelo 4-Bits
4-Bits Ejemplo Nº 26 – Sumador Paralelo 4-Bits
LIBRARY IEEE;
FOR-GENERATE: Es una instrucción para USE IEEE.STD_LOGIC_1164.ALL;
describir código concurrente jerárquico
estructurado regularmente. Es obligatorio
agregar una etiqueta, en este caso se llama ENTITY suma IS
CICLO, y se indica que se deberá hacer cuatro PORT( S : OUT STD_LOGIC_VECTOR( 3 DOWNTO 0 );
copias de las ecuaciones ( S(I) y C(I+1) ).
A : IN STD_LOGIC_VECTOR( 3 DOWNTO 0 );
B : IN STD_LOGIC_VECTOR( 3 DOWNTO 0 );
Label: FOR identifier IN range GENERATE C4 : OUT STD_LOGIC;
(concurrent assignments) C0 : IN STD_LOGIC );
End GENERATE END suma;
Sumadores:
Sumadores: Sumador
Sumador Paralelo
Paralelo 4-Bits
4-Bits Ejemplo Nº 28 – Sumador Paralelo 4-Bits
ENTITY sumador IS
FOR-GENERATE: Es una instrucción para GENERIC( N : INTEGER := 4 );
describir código concurrente jerárquico PORT( SAL: OUT STD_LOGIC_VECTOR( N-1 DOWNTO 0 );
estructurado regularmente. Es obligatorio
agregar una etiqueta, en este caso se llama A : IN STD_LOGIC_VECTOR( N-1 DOWNTO 0 );
CICLO, y se indica que se deberá hacer cuatro B : IN STD_LOGIC_VECTOR( N-1 DOWNTO 0 );
copias de las ecuaciones ( S(I) y C(I+1) ).
C4 : OUT STD_LOGIC;
C0 : IN STD_LOGIC );
Label: FOR identifier IN range GENERATE END sumador;
(concurrent assignments)
End GENERATE ARCHITECTURE arq_suma OF sumador IS
SIGNAL C : STD_LOGIC_VECTOR( N DOWNTO 0 );
SIGNAL S : STD_LOGIC_VECTOR( N-1 DOWNTO 0 );
GENERIC (parameter_name: ATTRIBUTE SYNTHESIS_OFF OF C : SIGNAL IS TRUE;
parameter_type := paremeter_value);
BEGIN
C(0) <= C0;
CICLO : FOR I IN 0 TO N-1 GENERATE
S(I) <= C(I) XOR A(I) XOR B(I);
C(I+1)<= (B(I) AND C(I)) OR (A(I) AND C(I)) OR (A(I) AND B(I));
END GENERATE;
C4 <= C(4);
SAL <= S;
END arq_suma;
Cap.3 – Diseño Lógico Combinacional con VHDL Otra Estructura
Sumadores:
Sumadores: Sumador
Sumador Paralelo
Paralelo 4-Bits
4-Bits
#include<stdio.h>
unsigned int vbit(unsigned int num, int i,int negada) ;
int eq(unsigned int A, unsigned int B, int i);
void main()
{
unsigned int A = 13;
unsigned int B = 5;
int n = 4; /*n es el numero de bits*/
int i,j, AmayB = 0;
int eqp; /* es la variable que almacena el producto de los terminos eqn*/
for ( i=0; i <= n-1; i++){ /* es la sumatoria de 0 a n-1*/
eqp = 1;
for(j=i+1; j<=n-1; j++) /* es la productoria de i+1 a n-1*/
eqp*=eq(A,B,j); /* esta funcion obtiene el termino eq en la posicion j*/
AmayB += vbit(A,i,0) * vbit(B,i,1) * eqp; /* es A(i) *B(i) *eqn */
}
printf(“%d”, AmayB);
}
Cap.3 – Diseño Lógico Combinacional con VHDL Otras Estructuras Básicas
printf(“%d”, AmayB);
}
unsigned int vbit(unsigned int num, int i,int negada)
/*obtiene el valor de un bit en la posicion i*/
{
unsigned int aux = 01;
aux = aux << i; /* pone en uno el valor del bit en la posicion i para hacer un and*/
if ( (aux& num) > 0 ){
if (negada == 0)
return 1;
else
return 0;}
else{
if( negada == 0)
return = 0;}
return 1;
}
int eq(unsigned int A, unsigned B, int i)
{
/*obtiene 1 si los bits A(i) y B(i) son iguales*/
unsigned int Ai, int Bi;
Ai = vbit(A,i,0);
Bi = vbit(B,i,0);
if(Ai==Bi)
return 1;
return 0;
}