0% encontró este documento útil (0 votos)
201 vistas17 páginas

Introducción a VHDL para Circuitos

Este documento introduce el lenguaje VHDL para circuitos combinacionales. Explica las unidades básicas de diseño en VHDL como entidades, arquitecturas y puertos de entrada/salida. También describe cómo declarar entidades mediante la especificación de los puertos de entrada y salida, así como sus tipos de datos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
201 vistas17 páginas

Introducción a VHDL para Circuitos

Este documento introduce el lenguaje VHDL para circuitos combinacionales. Explica las unidades básicas de diseño en VHDL como entidades, arquitecturas y puertos de entrada/salida. También describe cómo declarar entidades mediante la especificación de los puertos de entrada y salida, así como sus tipos de datos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Instituto Tecnológico De Saltillo

Diseño Digital

Unidad 6 Introducción al lenguaje VHDL para circuitos


combinacionales.

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.

Aprenderemos también a emplear declaraciones concurrentes y


secuenciales dentro de un programa mediante la solución de circuitos
combinacionales individuales tales como los multiplexores, los
decodificadores, los codificadores, los sumadores entre otros.

Diseñaremos circuitos secuenciales como son los Flip – Flop, registros,


contadores y diagramas de estados, con estos circuitos no dejaran ver
los eventos futuros que se desarrollan en estas entidades y así ver que
es lo que estamos haciendo de acuerdo a la programación.

Unidades básicas de diseño

La estructura general de un programa en VHDL está formada por


módulos o unidades de diseño, cada uno de ellos compuesto por un
conjunto de declaraciones e instrucciones que definen, describen, Diagrama a bloques representativo de la entidad.
estructuran, analizan y evalúan el comportamiento de un sistema digital.
Los subsistemas pueden conectarse internamente entre sí; pero la
Existen cinco tipos de unidades de diseño en VHDL: entidad sigue identificando con claridad sus entradas y salidas generales.

Entidad, Arquitectura, Configuración, Declaración del paquete y Puertos de entrada/salida


Cuerpo del paquete.
Cada una de las señales de E/S en una entidad son referidas
En el desarrollo de programas en VHDL pueden utilizarse o no tres de como puerto, el cual es similar a una terminal (pin) de un símbolo
los cinco módulos, pero dos de ellos (entidad y arquitectura) son esquemático el cual será asignado. Todos los puertos que son
indispensables en la estructuración de un programa. declarados deben tener un nombre, un modo y un tipo de dato. El
nombre se utiliza como una forma de llamar al puerto, el modo permite
Las declaraciones de entidad, paquete y configuración se consideran definir la dirección que tomará la información y el tipo define qué clase
unidades de diseño primarias, mientras que la arquitectura y el cuerpo de información se transmitirá por el puerto.
del paquete son unidades de diseño secundarias porque dependen de
una entidad primaria que se debe analizar antes que ellas. Por ejemplo, respecto a los puertos de la entidad que representan a un
comparador de igualdad como el de la figura siguiente, las variables a y
Entidad (entity) b denotan los puertos de entrada y la variable c se refiere al puerto de
salida.
Es el bloque elemental de diseño en VHDL, las entidades son todos los
elementos electrónicos (sumadores, contadores, compuertas, flip-flops,
memorias, multiplexores, etc.) que forman de manera individual o en
conjunto un sistema digital.

La entidad puede representarse de muy diversas maneras; por ejemplo,


En la siguiente figura se muestra la arquitectura de un sumador completo Comparador de igualdad.
a nivel de compuertas.
Modos

Permite definir la dirección en la cual el dato es transferido a través de


un puerto. Un modo puede tener uno de cuatro valores: in (entrada), out
(salida), inout (entrada/salida) y buffer como se observa en la figura
siguiente.

Fig. Descripción a nivel de compuertas

Ahora bien, esta entidad se puede representar a nivel de sistema


indicando tan sólo las entradas (Cin, A y B) y salidas (SUMA y Cout) del
circuito como podemos observar en la figura siguiente:

Modos y el curso de sus señales.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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 out. En la línea 2 se inicia la declaración de la entidad con la palabra


Indica las señales de salida de la entidad. reservada entity, seguida del identificador o nombre de la entidad
(sumador) y la palabra reservada is.
Modo inout.
Permite declarar a un puerto de forma bidireccional, es decir, de Los puertos de entrada y salida (port) se declaran en las líneas 3 y 4,
entrada/salida; además permite la retroalimentación de señales dentro o respectivamente, en este caso los puertos de entrada son A, B y Cin,
fuera de la entidad. mientras que SUMA y Cout representan los puertos de salida.

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.

Bit_vector (vectores de bits)


Representa un conjunto de bits para cada variable de entrada o salida.

Integer (entero)
Representa un número entero.

Los anteriores son sólo algunos de los tipos que maneja VHDL, pero no
son los únicos.

Declaración de entidades Solución

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

Los identificadores son simplemente los nombres o etiquetas que se


Símbolo funcional de la entidad usan para referir variables, constantes, señales, procesos, etc. Pueden
ser números, letras del alfabeto y guiones bajos ( _ ) que separen
1 --Declaración de la entidad de un circuito sumador caracteres y no tienen una restricción en cuanto a su longitud. Todos los
2 entity sumador is identificadores deben seguir ciertas especificaciones o reglas para que
3 port (A, B, Cin: in bit; se puedan compilar sin errores, mismas que aparecen en la tabla 2.1.
4 SUMA, Cout: out bit);
5 end sumador; Regla Incorrecto Correcto
El primer carácter siempre es una letra 4suma Suma4
Los números de las líneas (1, 2, 3, 4, 5) no son parte del código; se usan mayúscula o minúscula. SUMA4
como referencia para explicar alguna sección en particular. Las palabras El segundo carácter no puede ser un S_4bits S4_bits
en negritas están reservadas para el lenguaje de programación VHDL; guion bajo
esto es, tienen un significado especial para el programa; el diseñador Dos guiones juntos no son permitidos Resta__4 Resta_4_
asigna los otros términos. Un identificador no puede utilizar Clear#8 Clear_8
símbolos
Ahora comencemos a analizar el código línea por línea.
Tabla Especificaciones para la escritura de identificadores.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

VHDL cuenta con una lista de palabras reservadas que no pueden


funcionar como identificadores. vector_A(3) = A3 vector_B(3) = B3 vector_SUMA(3) = S3
vector_A(2) = A2 vector_B(2) = B2 vector_SUMA(2) = S2
Abs Entity Next Severity vector_A(1) = Al vector_B(l) = B1 vector_SUMA(l) = S1
Access Exit Nor Signal vector A(0) = A0 vector_B(0) = B0 vector SUMA(0) = S0
After File Not Shared
Alias For Null Sla Una vez que se ha establecido el orden en que aparecerán los bits
All Función Of Sll enunciados en cada vector, no se puede modificar, a menos que se utilice
And Generate On Sra el comando to: 0 to 3 (0 hasta 3) que indica el orden de aparición en
Architecture Generic Open Sri sentido ascendente.
Array Group Or Subtype
Assert Guarded Others Then Ejemplo:
Atribute If Out To
Begin Impure Package Port Transport Describa en VHDL la entidad del circuito sumador representado en la
Block In Postponed Type figura anterior. Observe cómo la entrada Cin y la salida Cout se expresan
Body Inertial Procedure Unaffected de forma individual.
Buffer Inout Process Units
Bus Is Pure Until Solución:
Case Label Range Use
Compoennt Library Record Register Variable entity sumador is
Configuration Lindage Reject Wait port (A,B: in bit_vector (3 downto 0);
Constant Literal Rem When Cin: in bit;
Disconnect Loop Report While Cout: out bit;
Downto Map Return With SUMA: out bit_vector(3 downto 0));
Else Mod Rol Xnor end sumador;
Elsif Nand Ror Xor
End New Select Ejemplo 2

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

Una parte importante en la programación con VHDL radica en el uso de


librerías y paquetes que permiten declarar y almacenar estructuras
lógicas, seccionadas o completas que facilitan el diseño.
Una librería o biblioteca es un lugar al que se tiene acceso para utilizar
las unidades de diseño predeterminadas por el fabricante de la
Entidad representada por vectores. herramienta (paquete) y su función es agilizar el diseño. En VHDL se
encuentran definidas dos librerías llamadas ieee y work mostrada en la
La manera de describir en VHDL una configuración que utilice vectores figura siguiente. Como puede observarse, en la librería ieee se encuentra
consiste en la utilización de la sentencia bit_vector, mediante la cual se el paquete std_logic_1164, mientras que en la librería work se hallan
especifican los componentes de cada uno de los vectores utilizados. La numeric_std, std_arith y gatespkg.
parte del código que se usa para declarar un vector dentro de los puertos
es el siguiente:

port (vector_A, vector_B: in bit_vector (3 downto 0);


vector_SUMA: out bit_vector (3 downto 0));

Esta declaración define los vectores (A, B y SUMA) con cuatro


componentes distribuidos en orden descendente por medio del comando:
3 downto 0 (3 hacia 0)

los cuales se agruparían de la siguiente manera.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

Ejemplo:

En la figura siguiente se muestra el bloque representativo de un circuito


multiplicador de 2 bits. La multiplicación de (XI, XO) y (Y1,Y0) producen
la salida Z3, Z2, Zl, ZO.

Declare la entidad del circuito utilizando la librería ieee y el paquete


std_logic_1164.all.

En una librería también se permite almacenar el resultado de la


compilación de un diseño, con el fin de utilizar en uno o varios programas.
La librería work es el lugar establecido donde se almacenan los
programas que el usuario va generando. Esta librería se encuentra
siempre presente en la compilación de un diseño y los diseños se
Solución:
guardan en ella mientras no se especifique otra. La carpeta otra mostrada
en la figura anterior representa esta situación.
library ieee;
use ieee.std_logic_1164.all;
Un paquete es una unidad de diseño que permite desarrollar un
entity multiplica is
programa en VHDL de una manera ágil, debido a que contiene algoritmos
preestablecidos (sumadores, restadores, contadores, etc.) que ya tienen port (X0,X1,YO,Yl: in std_logic;
optimizado su comportamiento. Por esta razón, el diseñador no necesita Z3,Z2,Z1,Z0: out std_logic;
caracterizar paso a paso una nueva unidad de diseño si ya se encuentra end multiplica;
almacenada en algún paquete en cuyo caso basta con llamarla y
especificarla en el programa. Por lo tanto, un paquete no es más que una Arquitectura (architecture)
unidad de diseño formada por declaraciones, programas, componentes Una arquitectura se define como la estructura que describe el
y subprogramas, que incluyen los diversos tipos de datos (bit, booleano, funcionamiento de una entidad, de tal forma que permita el desarrollo de
std_logic), empleados en la programación en VHDL y que suelen formar los procedimientos que se llevarán a cabo con el fin de que la entidad
parte de las herramientas en software. cumpla las condiciones de funcionamiento deseadas.

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

Paquetes  Flujo de datos

El paquete std_logic_1164 que se encuentra en la librería ieee contiene  Estructural


todos los tipos de datos que suelen emplearse en VHDL
(std_logic_vector, std_logic, entre otros). Para observar las diferentes formas tomaremos como ejemplo un
comparador de 2 bits y se le dará solución por los 3 modos de
El acceso a la información contenida en un paquete es por medio de la programación, el cual se comporta de la siguiente manera:
sentencia use, seguida del nombre de la librería y del paquete,
respectivamente: use nombre_librería.nombre_paquete.all; C=1 si A=B.

por ejemplo:

use ieee.std_logic_1164.all;

En este caso ieee es la librería, std_logic_1164 es el paquete y la palabra


reservada all indica que se pueden usar todos los componentes En la figura se describe funcionalmente el circuito comparador a través
almacenados en el paquete. de una descripción funcional donde se expone la forma en que trabaja el
sistema, es decir las descripciones consideran la relación que hay entre
El paquete numeric_std define funciones para realizar operaciones las entradas y las salidas del circuito, sin importar como este organizado
entre diferentes tipos de datos, además, los tipos pueden representarse en su parte interior. Para este caso:
con signo o sin éste.

El paquete numeric_bit define tipos de datos binarios con signo o sin


éste.

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:

En lo sucesivo, se usarán a menudo las librerías y paquetes de los


programas desarrollados.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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:

mediante instrucciones when – else (cuando – si no) o por medio de


ecuaciones booleanas. Para esto de asignan unidades y se le da solución respetando la
jerarquía de la función además que se utilizaran los paquetes que ya
Descripción por flujo se datos mediante when - else vienen predeterminados dentro de las librerías.

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.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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

If – Then - Elsif. process (x) begin


case x is
library ieee; -- gfedcba
use ieee.std_logic_1164.all; when "0000" => y <= "1000000";
use ieee.std_logic_arith.all; when "0001" => y <= "1111001";
use ieee.std_logic_unsigned.all; when "0010" => y <= "0100100";
when "0011" => y <= "0110000";
entity pancho is when "0100" => y <= "0011001";
port(x: in std_logic_vector (3 downto 0); when "0101" => y <= "0010010";
y: out std_logic_vector (0 to 6)); when "0110" => y <= "0000010";
end; when "0111" => y <= "0111000";
when "1000" => y <= "0000000";
architecture maria of pancho is begin when "1001" => y <= "0010000";
process (x) when others => y <= "0000110";
begin end case;
if x <= "0000" then y <= "1000000"; end process;
elsif x <= "0001" then y <= "1111001"; end maria;
elsif x <= "0010" then y <= "0100100";
elsif x <= "0011" then y <= "0110000"; Diseño de sistemas secuenciales síncronos
elsif x <= "0100" then y <= "0011001";
elsif x <= "0101" then y <= "0010010"; la estructura de los sistemas secuenciales síncronos basa su
elsif x <= "0110" then y <= "0000010"; funcionamiento en los elementos de memoria conocidos como flip-flops.
elsif x <= "0111" then y <= "0111000"; La palabra sincronía se refiere a que cada uno de estos elementos de
elsif x <= "1000" then y <= "0000000"; memoria que interactúan en un sistema se encuentran conectados a la
elsif x <= "1001" then y <= "0010000"; misma señal de reloj, de forma tal que sólo se producirá un cambio de
else y <= "0110000"; estado en el sistema cuando ocurra un flanco de disparo o un pulso en
end if; la señal de reloj.
end process;
end maria; Existe una división en el diseño de los sistemas secuenciales que se
refiere al momento en que se producirá la salida del sistema.
Usando el With - Select.
• En la estructura de Mealy mostrada en la figura siguiente las señales
library ieee; de salida dependen tanto el estado en que se encuentra el sistema, como
use ieee.std_logic_1164.all; de la entrada que se aplica en determinado momento.
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity pancho is
port(x: in std_logic_vector (3 downto 0);
y: out std_logic_vector (0 to 6));
end;

architecture maria of pancho is begin


with x select
y <= "0111111" when "0000",
"0000110" when "0001",
"0100100" when "0010",
"0110000" when "0011", Arquitectura secuencial de Mealy
"0011001" when "0100",
"0010010" when "0101", • En la estructura de Moore figura siguiente la señal de salida sólo
"0000010" when "0110", depende del estado en que se encuentra.
"0111000" when "0111",
"0000000" when "1000",
"0010000" when "1001",
"0000110" when others;
end maria;

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

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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.

Transición de un estado a otro

Con un poco de lógica se puede intuir el comportamiento del diagrama


de estados. Observe como sólo la secuencia de cuatro unos
consecutivos provoca que la salida Z = 1.
Detector de secuencia
Este diagrama se puede codificar con facilidad mediante una descripción
Diagramas de estado de alto nivel en VHDL. Esta descripción supone el uso de declaraciones
case-when las cuales determinan, en un caso particular, el valor que
El uso de diagramas de estados en la lógica programable facilita de tomará el siguiente estado.
manera significativa la descripción de un diseño secuencial, ya que no
es necesario seguir la metodología tradicional de diseño. Por otro lado, la transición entre estados se realiza por medio de
declaraciones if-then'else, de tal forma que éstas se encargan de
En VHDL se puede utilizar un modelo funcional en que sólo se indica la establecer la lógica que seguirá el programa para realizar la asignación
transición que siguen los estados y las condiciones que controlarán el del estado.
proceso.
Como primer paso en nuestro diseño, consideremos los estados d0, d1,
De acuerdo con nuestro ejemplo según la figura siguiente: d2 y d3. Para poder representarlos en código VHDL, hay que definirlos
dentro de un tipo de datos enumerados mediante la declaración type.

Observemos la forma en que se listan los identificadores de los estados,


así como las señales utilizadas para el estado actual (edo_presente) y
siguiente (edo_futuro):

type estados is (d0, d1, d2,d3) ;


signal edo_presente, edo_futuro : estados;

El siguiente paso consiste en la declaración del proceso que definirá el


comportamiento del sistema.

En éste debe considerarse que el edo_futuro depende del valor del


edo_presente y de la entrada X. De esta manera la lista sensitiva del
proceso quedaría de la siguiente forma:

proceso1: process (edo_presente, X)

Dentro del proceso se describe la transición del edo_presente al


edo_futuro.

Primero se inicia con la declaración case que especifica el primer estado


que se va a evaluar en nuestro caso consideremos que el análisis
comienza en el estado d0 (when d0), donde la salida Z siempre es cero
sin importar el valor de X.

Si la entrada X es igual a 1 el estado futuro es di; en caso contrario, es


vemos que el sistema secuencial se puede representar por medio del d0.
diagrama de estados de la figura por arquitectura Mealy.
De este modo, la declaración del proceso quedaría de la siguiente
En este diagrama se advierte que el sistema cuenta con una señal de manera:
entrada denominada X y una señal de salida Z. En la figura se muestra
la tabla de estados que describe el comportamiento del circuito. procesol: process (edo_presente, X)
begin
Edo. presente Edo. futuro Salida Z case edo_presente is
X=0 X=1 X=0 X=1 when d0 => Z <= '0';
d0 d0 d1 0 0 if X ='1' then
d1 d1 d2 0 0 edo_futuro <= d1;
d2 d2 d3 0 0 else
d3 d3 d0 0 1 edo_futuro <= d0;
Tabla de estados end if;

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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.

En el proceso2 se lleva a cabo de manera síncrona la asignación del


estado futuro al estado presente, de suerte que cuando se aplica un pulso
de reloj, el proceso se ejecuta.

se describe la forma de programar la salida Z en el estado d3 cuando


ésta obtiene el valor de 0 o 1, según el valor de la entrada X.

Programa del diagrama de estados Diagrama de estados


Solución
library ieee;
use ieee.std_logic_1164.all; Notamos que el circuito pasa al estado q1 con el primer 1 de entrada y
entity diagrama is al estado q2 con el segundo. Las salidas asociadas con estas dos
port(clk,x: in std_logic; entradas son 0, según se señala.
z: out std_logic);
end diagrama; La tercera entrada consecutiva de 1 genera un 1 en la salida y hace que
el circuito pase al estado q3. Una vez que se encuentra en q3, el circuito
architecture arq_diagrama of diagrama is permanecerá en este estado, emitiendo salidas 0.
type estados is (d0, d1, d2, d3);
signal edo_presente, edo_futuro: estados; En lo que respecta a la programación en VHDL, este ejemplo sigue la
begin misma metodología que el ejercicio anterior, el cual consiste en usar
proceso1: process (edo_presente, x) estructuras case - when y tipo de datos enumerado, que en este caso
begin contiene los cinco estados (q0, q1, q2, q3 y q4) que componen el
case edo_presente is diagrama.

when d0 => z <= '0'; El programa se encuentra a continuación.


if x =' 1' then
edo_futuro <= d1; library ieee;
else use ieee.std_logic_1164.all;
edo_futuro <= d0; entity diag is
end if; port (clk,x: in std_logic;
z: out std_logic);
when d1 => z <='0'; end diag;
if x='l' then architecture arq_diag of diag is
edo_futuro <= d2; type estados is (q0,ql/q2,q3/q4);
else signal edo_pres, edo_fut: estados;
edo_futuro <= d1; begin
end if; procesol: process (edo_pres,x) begin
case edo_pres is
when d2 => z <='0';
if x='l' then when q0 => z <= '0';
edo_futuro <= d3; if x = '0' then
else edo_fut <= q4;
edo_futuro <= d0; else
end if; edo_fut <= q1;
end if;
when d3 =>
if x='l' then when q1 => z <= '0';
edo_futuro <= d0; if x = '0' then
z <='1'; edo_fut <= q4;
else else
edo_futuro <= d3; edo_fut <= q2;
z <= '0'; end if;
end if;
when q2 =>
end case; if x = '0' then
end process proceso1; edo_fut <= q4;
proceso2: process(clk) z <= '0';
begin else
if (clk'event and clk='l') then edo_fut <= q3;
edo_presente <= edo_futuro; z <= '1';
end if; end if;
end process proceso2;
end arq_diagrama; when q3 => z <= '0';
if x = '0' then
edo_fut <= q3;
else

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

edo_fut <= q3;


end if;

when q4 => z <= '0';


if x = '0' then
edo_fut <= q4; Y nos aparecerá la siguiente Ventana.
else
edo_fut <= q1;
end if;
end case;
end process procesol;

proceso2: process (clk) begin


if (clk'event and clk='l')then
edo_pres <= edo_fut;
end if;
end process proceso2;
end arqL_diag;

El lenguaje de descripción de hardware o HDL es en lenguaje descriptivo


el cual nos permite dar soluciones a los sistemas digitales en un
dispositivo programable.

Software de programación

El software requerido para realizar los programas en VHDL y simular


nuestros programas son:

● ispLever Classic 2.1.

● Proteus

ispLever Classic 2.1

Es el entorno integrado para programar CPLD’s de la empresa Lattice


Le damos nombre al Proyecto, por ejemplo, programa1.
Semiconductor, este software es el que me permite configurar el
proyecto, editar el código VHDL, compilar, asignar pines y sintetizar, el
resultado final es un archivo con extensión .JED usado para programar
físicamente el CPLD.

El Software Isplever clasic 2.0 o 2.1 se encuentran en la nube o drive


En la parte de Desing Entry Type seleccionamos VHDL, en Synthesis
de la materia.
Tools seleccionamos Synplify, en Simulator Tools seleccionamos Active-
HDL y hacemos clic en siguiente.
Una vez instalado el programa nos pedirá una licencia la cual deberemos
aplicar de la siguiente manera:
Nos aparecerá una ventana donde deberemos seleccionar el dispositivo
que vamos a programar y tildamos Show Obsolete Devices.
nos darán un archivo [Link], este archivo lo descargamos y lo
pegamos en nuestra carpeta license donde se instaló nuestro programa
y listo podemos usarlo.

Por default será C:\ispLEVER_Classic2_0\license

una vez licenciado acedemos al programa IspLever Classic Project


Navigator.

Nos aparecerá la siguiente pantalla y daremos clic en new Project.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

Y nos aparece la siguiente ventana y damos clic en finalizar.


Teclearemos en familia GAL Device y buscamos en Device el
GAL22V10D Y seleccionamos la opción en package type 24 DIP y
hacemos clic en siguiente.

Nos aparecerá la siguiente ventana y haremos clic derecho sobre el


dispositivo GAL22V10D y seleccionamos New.

Nos aparecerá la ventana siguiente y daremos clic en siguiente.

Ahora seleccionaremos VHDL Module y hacemos clic en OK.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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.

Tomaremos el ejemplo de un comparador donde C es uno si a es igual a


b, esto es que:
En esta ventana nos solicitara: c=1 si a y b son iguales, 00 o 11.
File Name, donde le daremos nombre al programa. Y dándole solución por una de las diferentes formas de solución que se
Entity, donde daremos el nombre de la entidad. ven en la teoría.
Architecture de desarrollo correspondientes a nuestro programa. s en
Port Name podremos seleccionar las variables de entrada y salida que
vamos a trabajar en muestro programa, así como su tipo. Desarrollamos e programa Y guardamos cada vez que modifiquemos el
programa.
De no hacerlo aquí tendremos que teclearlas dentro de nuestro
programa.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

Una vez que ya tengamos nuestro programa pasaremos a compilar


nuestro programa dando primero clic en el archivo que generamos en
Sourses in Project que tiene como extensión .vhd en mi caso se llama
comparador ([Link]) que fue el nombre que configuramos y después
doble clic en Synplify Synthesize VHDL File de no encontrar errores de
sintaxis en nuestro programa lo compilara y mostrara 2 ángulos en color
verde.

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

Gnd será el pin 12

Vcc el pin 24

Después buscaremos la pestaña donde dice Pick Devices identificado


con la letra P.

En la pestaña Keywords tecleamos AM22V10, seleccionamos el


dispositivo y damos clic en aceptar.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

Para usar insertamos el elemento seleccionado.

Después daremos doble Click sobre el AM22V10 y abrimos la carpeta


JEDEC Fuse Map File: y ubicaremos la dirección del archivo jed que Resultado de la simulación.
vamos a simular y damos click en OK.

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

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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

Se observa que cuando a = b, c = 1 si no es 0.

Actividades entregables para la unidad 6


Actividad 45
Actividad 41
Realizar un programa en VHDL para diseñar un multiplexor 8 a 1
Realizar un programa en VHDL en donde 2 entradas (A y B) y 8 salidas
(C, D, E, F, G, H, I, J) que realice las siguientes operaciones:

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

Realizar un programa en VHDL para diseñar un decodificador BCD a 7


segmentos 4 entradas (DCBA) 7 salidas (gfedcba) para un display de
cátodo común.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

Actividad 47

Realizar un programa en VHDL para diseñar un codificador 8 bits de


entrada a 3 bits de salida.

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

realizar un programa en VHDL para diseñar un contador ascendente


binario de 0 a 255, agregue una entrada para seleccionar el cambio a un
contador descendente.

Actividad 55

realizar un programa en VHDL para diseñar un contador BCD de 0 a 9


en un display con una base de tiempo de 1 segundo utilizando el
oscilador de la tarjeta dividiendo el tiempo por medio de un divisor para
ajustar la base de tiempo.

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

apoyándose en el siguiente diagrama y programa realizar un sumador


BCD considere el uso de display 7 segmentos para su salida y use sus
respectivos decodificadores.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

Actividad 57

realizar el diseño de un comparador de dos números A y B, cada número


formado por dos bits (Al, A0) y (B1, B0) la salida del comparador también
es de dos bits y está representada por la variable Z (Z1 Z0) de tal forma
que si:

A = B entonces Z = 11
A < B entonces Z = 01
A > B entonces Z = 10

La tabla de verdad correspondiente a este comparador es la siguiente.

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

Y representado por el siguiente circuito:

Programa propuesto

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

Actividad 58 entity refrescos is


port (clk: in std_logic;
realizar un programa en VHDL para diseñar una ruleta de 8 salidas la monedas: in std_logic_vector(2 downto 0);
cual es controlada por un contador y decodificada para activar una salida soda, Cambio: out std_logic);
a la vez. end;

Actividad 59 architecture sodas of refrescos is


type estados is (S0,S1,S2,S3,S4,S5,S6,S7);
Realizar un programa para solucionar una máquina de estado por medio signal edo_pres, edo_fut: estados;
del análisis por mealy en sistema consiste en la realización de un detector
de secuencia begin
proceso1: process (monedas)
begin
case edo_pres is

--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';

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez


Instituto Tecnológico De Saltillo
Diseño Digital

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;

proceso2: process(clk) begin


if(clk'event and clk='1') then
edo_pres<=edo_fut;
end if;
end process proceso2;
end sodas;

Gracias por haber concluido este semestre espero que el próximo


semestre sea mejor y concluyan de una mejor manera sus estudios
Por mi parte cuentan con un amigo y maestro que puede
aconsejarlos y guiarlos en esta parte de su vida en la cual se
preparan para el mundo laboral.

Felices vacaciones.

Departamento Eléctrica – Electrónica Ing. Alejandro Benítez Gutiérrez

También podría gustarte