Introducción a VHDL para Circuitos
Introducción a VHDL para Circuitos
Diseño Digital
INTRODUCCIÓN
Símbolo funcional de la entidad
Aprenderemos a ver la descripción y la estructura básica del lenguaje de
programación de “VHDL” así como los módulos básicos de diseño: sus De igual forma, la integración de varios subsistemas (medio sumador)
palabras reservadas, los tipos de datos, así como el manejo de diferentes puede representarse mediante una entidad como se observa en la
arquitecturas o estilos de diseño empleados en el desarrollo de un siguiente figura.
programa.
Modo in. Observemos que la línea: en la línea 1 inicia con dos guiones (--), los
Se refiere a las señales de entrada a la entidad. Este sólo es cuales indican que el texto que está a la derecha es un comentario cuyo
unidireccional y nada más permite el flujo de datos hacia dentro de la objetivo es documentar el programa, ya que el compilador ignora todos
entidad. los comentarios.
Modo buffer. El tipo de dato que cada puerto maneja es del tipo bit, lo cual indica que
Permite hacer retroalimentaciones internas dentro de la entidad, pero a sólo pueden manejarse valores de '0' y '1' lógicos. Por último, en la línea
diferencia del modo inout, el puerto declarado se comporta como una 5 termina la declaración de entidad con la palabra reservada end,
terminal de salida. seguida del nombre de la entidad (sumador).
Tipos de datos Debemos notar que, como cualquier lenguaje de programación, VHDL
sigue una sintaxis y una semántica dentro del código, mismas que hay
Los tipos son los valores (datos) que el diseñador establece para los que respetar. En esta entidad conviene hacer notar el uso de punto y
puertos de entrada y salida dentro de una entidad; se asignan de acuerdo coma (;) al finalizar una declaración y de dos puntos (:) al asignar
con las características de un diseño en particular. Algunos de los tipos nombres a las entradas y salidas.
más utilizados en VHDL son:
Ejemplo:
Bit
El cual tiene valores de 0 y 1 lógico. Declare la entidad del circuito lógico de la figura:
Boolean (booleano)
Este define valores de verdadero o falso en una expresión.
Integer (entero)
Representa un número entero.
Los anteriores son sólo algunos de los tipos que maneja VHDL, pero no
son los únicos.
Los módulos elementales en el desarrollo de un programa dentro del Como puede observarse, las entradas y salidas del circuito se
lenguaje de descripción en hardware (VHDL) son la entidad y la encuentran delimitadas por la línea punteada. En este caso, a3, b3, a2,
arquitectura. b2, a1, b1, a0, b0 son las entradas y F es la salida.
La declaración de una entidad consiste en la descripción de las entradas La declaración de la entidad sería de la siguiente forma:
y salidas de un circuito de diseño identificado como entity (entidad), es
decir, la declaración señala las terminales o pines de entrada y salida con -- Declaración de la entidad
que cuenta la entidad de diseño. Entity circuito is
Port (a3,b3,a2,b2,al,bl,a0,b0: in bit;
Por ejemplo, la forma de declarar la entidad correspondiente al circuito F: out bit);
sumador de la figura siguiente se muestra a continuación: end circuito;
Identificadores
Diseño de entidades mediante vectores Declare la entidad del circuito lógico mostrado en la figura mediante el
uso de vectores.
La entidad sumador realizada en el circuito de la figura siguiente:
Usa bits individuales, los cuales sólo pueden representar dos valores
lógicos (0 o 1). De manera general, en la práctica se utilizan conjuntos
(palabras) de varios bits; en VHDL las palabras binarias se conocen
como vectores de bits, los cuales se consideran un grupo y no como bits
individuales. Como ejemplo considérense los vectores de 4 bits que se
muestran a continuación:
Solución:
vector_A = [A3, A2, A1, A0]
--Declaración de entidades mediante vectores
vector_B = [B3, B2, B1, B0]
entity detector is
vector_SUMA = [S3, S2, SI, S0]
port (a,b: in bit_vector(3 downto 0);
F: out bit));
En la figura siguiente se observa la entidad del sumador analizado antes,
end detector;
sólo que ahora las entradas A, B y la salida SUMA incorporan vectores
de 4 bits en sus puertos. Obsérvese cómo la entrada Cin y la salida Cout
son de un bit. Declaración de entidades mediante librerías y paquetes
Ejemplo:
Por último, cuando en el diseño se utiliza algún paquete es necesario La gran ventaja que presenta VHDL para definir una arquitectura radica
llamar a la librería que lo contiene. Para esto se utiliza la siguiente en la manera en que pueden describirse los diseños, es decir mediante
declaración: library ieee; el algoritmo de programación empleado se puede describir desde el nivel
de compuertas hasta sistemas complejos.
Lo anterior permite el uso de todos los componentes incluidos en la
librería ieee. En el caso de la librería de trabajo (work), su uso no Existen 3 tipos de modo de programación:
requiere la declaración library, dado que la carpeta work siempre está
presente al desarrollar un diseño. Funcional
por ejemplo:
use ieee.std_logic_1164.all;
El paquete std_arith define funciones y operadores aritméticos, como Nos quedaría un esquema de la siguiente manera y el programa que nos
igual (=), mayor que (>), menor que (<), entre otros. queda:
Solución Funcional:
Flujo de Datos (Ecuaciones Booleanas).
library ieee;
use ieee.std_logic_1164.all; library ieee;
use ieee.std_logic_arith.all; use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity burro is
PORT(A,B: in std_logic_vector (1 downto 0); entity burro is
C: out std_logic); port(A,B: in std_logic_vector (1 downto 0);
end burro; C: out std_logic);
end;
architecture pardo of burro is
begin architecture pardo of burro is begin
process (A,B) C <= (a(1) xnor b(1)) and (a(0) xnor b(0));
begin end pardo;
if (A=B) then
C<='1'; Estructural
Else
C<='0'; Para analizar consideramos el circuito o representación esquemática
end if; siguiente:
end process;
end pardo;
Otra forma de abordar el mismo ejemplo es por flujo de datos que indica
la forma en que los datos pueden transferir una señal a otra sin necesidad
de declaraciones secuenciales (if then else). Este tipo de descripciones
permiten definir el flujo que tomaran los datos entre módulos encargados
de realizar operaciones. En este tipo de descripción se pueden utilizar
dos formatos:
Mostramos el código del comparador de igualdad de dos bits, nótese la library ieee;
diferencia que radica en la eliminación del proceso y en la descripción sin use ieee.std_logic_1164.all;
declaraciones secuenciales if then else.
entity comp is
Flujo de datos (when - else): port (a,b: in bit_vector (0 to 1);
c: out bit);
library ieee; end comp;
use ieee.std_logic_1164.all; use [Link] ;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all; architecture estructural of comp is
signal x: bit_vector (0 to 1);-- uso de bits internos
entity burro is begin
port(A,B: in std_logic_vector (1 downto 0); U0: xnor2 port map (a(0), b(0), x(0)
C: out std_logic); Ul: xnor2 port map (a(l), b(1), x(1)
end; U2: and2 port map (x(0), x(l), c);
end estructural;
architecture pardo of burro is
begin Decodificador de BCD a 7 segmentos.
C <= '1' when (A=B) else '0';
--a C asígnale 1 cuando A sea igual a B Realizaremos un circuito decodificador BCD a 7 segmentos usando “if -
--si no asígnale 0. then - elsif” “with - select” y por último el “case” para poder realizar
end pardo; nuestra programación ya que el resultado siempre va a ser el mismo de
las tres maneras.
Descripción por flujo de datos mediante ecuaciones booleanas
Para comprobar lo anterior mostraremos la programación que realizamos
Otra forma de describir el circuito comparador de dos bits es mediante la en VHDL se considera que la decodificación es la siguiente de acuerdo
obtención de sus ecuaciones booleanas como se observa en la figura b. a la tabla de verdad:
Mostrará los dígitos del 0 – 9 y después de eso que nos marque un error
(E) al poner otra combinación binaria que no sea ninguna de 0 a 9 el
diseño es para el uso de un display tipo ánodo común de considerar el
uso de un display de tipo cátodo común habrá que rehacer la tabla para
el mismo.
Como comentario cuando se trabaja con un bit se usa la comilla simple end;
o tilde como se ha observado ('1') y cuando se trata de un conjunto o
grupo de bits de usa la comilla doble ("0000110").
Programación que utilizaremos: architecture maria of pancho is begin
entity pancho is
port(x: in std_logic_vector (3 downto 0);
y: out std_logic_vector (0 to 6));
end;
Usando el Case
Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
Arquitectura secuencial de Moore.
entity pancho is
port( x: in std_logic_vector ( 3 downto 0 ); Un sistema secuencial se desarrolla a través de una serie de pasos
y: out std_logic_vector ( 0 to 6 ) ); generalizados que comprenden el enunciado del problema, diagrama de
estados, tabla de estados, asignación de estados, ecuaciones de entrada Cuando se está en el estado d0 y la señal de entrada X es igual a uno,
a los elementos de memoria y diagrama electrónico del circuito. se avanza al estado d1 y la salida Z durante esta transición es igual a
cero, en caso contrario, cuando la entrada X es igual a cero, el circuito
Como ejemplo consideremos el diseño del siguiente sistema secuencial se mantiene en el estado d0 y la salida también es cero como se muestra
mostrado en la figura siguiente, en el cual se emite un pulso de salida Z en la figura siguiente:
(Z = l) cuando en la línea de entrada (X) se reciben cuatro unos en forma
consecutiva; en caso contrario, la salida Z es igual a cero.
Nótese que en cada estado debe indicarse el valor de la salida (Z< = 0) Ejemplo:
después de la condición when, siempre y cuando la variable Z no cambie
de valor. Se requiere programar el diagrama de estados de la figura siguiente:
Como podemos observar, en el programa se utilizan dos procesos. En el
proceso1 se describe la transición que sufren los estados y las
condiciones necesarias que determinan dicha transición.
Software de programación
● Proteus
Se abrirá el Text Editor, y aparecerá la ventana New VHDL Source. Al hacer clic en ok nos aparecerá nuestro editor de programa ya
precargado con nuestras librerías y variables, así como nuestra entidad
y arquitectura, esto nos facilitará nuestra programación y podremos
enfocarnos en nuestra lógica.
Ya hecho esto haremos clic sobre nuestro dispositivo que vamos a usar
que para nuestro caso es el GAL22V10D y pasamos a crear nuestro
mapa de fusibles dando doble clic en Create Fuse Map donde se creará
nuestro Chip Report me crea el mapa de entradas y salidas y para
posteriormente realizar las conexiones adecuadas y también creara el
JEDEC File que es el archivo que nos va servir para simular o en su caso
programarlo físicamente.
Para la simulación de estas prácticas usaremos el Proteus
De estar todo bien aparecerán ángulos en color verde. Profesional.
Podremos observar el mapa que creo para las entradas y salidas del Al abrir el programa buscaremos la parte de ISIS o schematic capture
integrado una vez programado, para nuestra compilación quedo: para realizar simulaciones.
a en el pin 1
b en el pin 2
c en el pin 23
Vcc el pin 24
0 U1
1
2
I0/CLK
I1
IO0
IO1
23
22 1
0 3
4
I2
I3
IO2
IO3
21
20
5 19
I4 IO4
6 18
I5 IO5
7 17
I6 IO6
8 16
I7 IO7
9 15
I8 IO8
10 14
I9 IO9
11
I10
13
I11
AM22V10
Conforme vayamos ocupando otro tipo de elementos para realizar
nuestro circuito los podemos agregar en Pick Devices como dispositivos
de entrada o salida, se pueden buscar por tipo o por número de parte.
1 U1
Usaremos herramientas de Debugging Tools para similar entradas y
1
2
I0/CLK
I1
IO0
IO1
23
22 0
salidas.
0 3
4
I2
I3
IO2
IO3
21
20
5 19
I4 IO4
6 18
I5 IO5
7 17
I6 IO6
8 16
I7 IO7
9 15
I8 IO8
10 14
I9 IO9
11
I10
13
I11
AM22V10
0 U1
1
2
I0/CLK
I1
IO0
IO1
23
22 0
1 3
4
I2
I3
IO2
IO3
21
20
5 19
Y realizamos la simulación de nuestro diseño para ver la operación I4 IO4
6 18
debemos activar la simulación poniéndola en modo de run. I5 IO5
7 17
I6 IO6
8 16
I7 IO7
9 15
I8 IO8
10 14
I9 IO9
11
I10
13
I11
Actividad 44
1 U1 Realizar un programa en VHDL para diseñar un Buffer triestado de 4 bits.
1
2
I0/CLK
I1
IO0
IO1
23
22 1
1 3
4
I2
I3
IO2
IO3
21
20
5 19
I4 IO4
6 18
I5 IO5
7 17
I6 IO6
8 16
I7 IO7
9 15
I8 IO8
10 14
I9 IO9
11
I10
13
I11
C = A AND B
D = A NAND B
E = A OR B
F = A NOR B
G = A XOR B
H = A XNOR B
I = NOT A
J = NOT B
Actividad 42
Actividad 46
Realizar un programa para resolver mediante ecuaciones booleanas
Realizar un programa en VHDL para diseñar un Demultiplexor 1 a 8.
usando Minitérminos y Maxitérminos dada la siguiente tabla de verdad:
C B A X
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 0
Actividad 43
Actividad 47
Actividad 52
Actividad 48
Realizar un programa en VHDL para diseñar un registro de 8 bits
Realizar un programa en VHDL para diseñar un decodificador 3 entradas
a 8 bits de salida.
Actividad 53
Actividad 49
Realizar un programa en VHDL para demostrar el funcionamiento de 4
Realizar un programa en VHDL para diseñar un codificador de decimal a registros de 4 bits multiplexados.
binario.
Actividad 54
Actividad 55
Actividad 56
Actividad 50
Realizar un programa en VHDL que compare de 4 bits de A y B e indique
Realizar un programa en VHDL para diseñar un Sumador/Restador de 4
en 3 salidas si A es mayor que B, si A es menor que B, o si a es igual B.
bits.
Actividad 51
Actividad 57
A = B entonces Z = 11
A < B entonces Z = 01
A > B entonces Z = 10
Al A0 Bl B0 Z1 Z0
0 0 0 0 1 1
0 0 0 1 0 1
0 0 1 0 0 1 La cual nos genera el siguiente diagrama de estados
0 0 1 1 0 1
0 1 0 0 1 0
0 1 0 1 1 1
0 1 1 0 0 1
0 1 1 1 0 1
1 0 0 0 1 0
1 0 0 1 1 0
1 0 1 0 1 1
1 0 1 1 0 1
1 1 0 0 1 0
1 1 0 1 1 0
1 1 1 0 1 0
1 1 1 1 1 1
Programa propuesto
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--ESTADO 0
when S0=>
soda<='0';
cambio<='0';
if monedas="001" then edo_fut<=S1;
elsif monedas="010"then edo_fut<=S2;
elsif monedas="100"then edo_fut<=S3;
else edo_fut<=S0;
end if;
Actividad 60
--ESTADO 1
realizar un programa en VHDL para solucionar una máquina de estados when S1=>
para controlar una máquina de refrescos presentada a continuación: cambio<='0';
if monedas="000" then
Se tiene una máquina de refrescos que acepta monedas de 5, 10 y 20 edo_fut<=S0;
pesos y esta solo da cambios de 5 pesos según sea el caso. soda<='1';
else
edo_fut<=S1;
soda<='0';
end if;
--ESTADO 2
when S2=>
if monedas="000" then
edo_fut<=S0;
soda<='1';
cambio<='1';
else
edo_fut<=S2;
soda<='0';
cambio<='0';
end if;
--ESTADO 3
when S3=>
if monedas="000" then
edo_fut<=S4;
soda<='0';
cambio<='1';
else
edo_fut<=S3;
soda<='0';
cambio<='0';
end if;
--ESTADO 4
when S4=>
edo_fut<=S5;
soda<='0';
cambio<='0';
--ESTADO 5
when S5=>
edo_fut<=S6;
soda<='0';
cambio<='1';
--ESTADO 6
when S6=>
edo_fut<=S7;
soda<='0';
cambio<='0';
--ESTADO 7
when S7=>
edo_fut<=S0;
soda<='1';
cambio<='1';
end case;
end process proceso1;
Felices vacaciones.