Está en la página 1de 11

División de Ingeniería Eléctrica

Facultad de Ingeniería
UNAM

Diseño Digital en VHDL

M.I. MA. DEL SOCORRO GUEVARA RODRÍGUEZ


Descripción de diseños digital usando herramientas de software
Existen diferentes formas de describir la funcionalidad de un circuito digital a través de
herramientas descriptivas soportadas sobre la base del diseño lógico.

Descripción estructural.
Consiste en instanciar los componentes o bloques, así como sus interconexiones. Existen dos
formas de descripción estructural.

Gráfica o esquema. Es una forma tradicional de describir en un formato gráfico los


componentes y conexiones de un diseño lógico.

Lenguaje. Se realiza una descripción de los componentes, sus conexiones mediante un


lenguaje computacional que describa el comportamiento de este sistema digital.

Descripción comportamental o funcional.


Consiste en poder describir un circuito digital por medio de características asociadas puramente el
comportamiento del arreglo digital, también se puede utilizar un lenguaje descriptivo del diseño.

Algorítmico. Define la funcionalidad de un circuito mediante un algoritmo sin importar el


cómo se conformó la estructura digital.

Descripción por flujo de datos.


Conjunto de ecuaciones ejecutadas concurrentemente, que determina el comportamiento del
diseño a describir.

Diseño en forma de gráfico.


Los símbolos gráficos son elementos prediseñados que son como cajas que contienen unidades de
diseño, tales como símbolos básicos, y en orden creciente se va subiendo en su complejidad
digital, eso depende de los símbolos prediseñados en el software que se está utilizando.

La interconexión de los distintos símbolos para efectuar un diseño de un circuito en forma gráfica
se utilizan líneas, pero en realidad esas líneas que dibujamos son cables de conexiones entre los
elementos lógicos (físicamente podría tratarse de una pista de cobre en una PCB).

También se pueden utilizar buses de conexión, los cuales nos representan múltiples conexiones.

Por la complejidad de los diseños, con infinidad de conexiones se pueden utilizar etiquetas a los
pines o conexiones llamadas índices, el utilizar esos nombres en el diseño, nos indica conexión
realizada entre elementos que pueden ser muy próximos o lejanos dentro del ambiente de
edificación grafica.

Algo muy importante son los puestos de entrada, salida o bidireccionales que nos indica la
dirección del flujo de información, no olvidar que nos indican conexiones al exterior, como pueden
ser pines de entrada y salida.
Todo diseño en un formato gráfico con sus múltiples símbolos trabaja de forma concurrente.
(simultaneo) como un arreglo real.

El poder describir circuitos lógicos en un gráfico cada vez más complejos hacen que las
herramientas de apoyo que, aunque utilizan lenguaje de descriptivo de programación, se obtienen
diseños complejos que utilizan muchos recursos.

El interés de describir un circuito directamente por un lenguaje permite hacer diseños de forma
más rápida y sencilla, además de poder realizar circuitos más complejos apoyados a través de un
formato funcional no como en un gráfico que se describe en forma estructural.

Diseño en lenguaje de descripción de hardware (VHDL)


VHDL surge a principios de los 80´s de un proyecto DARPA (Departamento de Defensa de los EE.
UU.) llamado VHSIC-Very High Speed Integrated Circuits. Aparece como una manera de describir
circuitos integrados, originalmente como una manera estándar de documentar los circuitos
digitales. En 1987 el lenguaje fue cedido al IEEE, y a partir de ese momento es un estándar abierto.

El significado de las siglas VHDL (Hardware Description Language), Lenguaje Descripción de


Hardware, fue desarrollado como un lenguaje para el modelado y simulación de sistemas digitales.

El VHDL es un lenguaje amplio y flexible que permite cualquier tipo de modelado utilizando
cualquier estilo de descripción de circuitos lógicos (Descripción estructural, comportamental, flujo
de datos) de forma precisa.

Una ventaja de utilizar VHDL es que al utilizar los mismos estándares se hacen compatibles y
utilizables entre ellos, con ello permite dividir o descomponer un diseño en secciones más
pequeñas.

En VHDL también existen dos formas generales de describir un sistema, una indicando los
diferentes componentes y sus conexiones para con ello indicar cómo funciona (Gráfico).

La segunda forma en que se describe un circuito mostrando como funciona o lo que hace, de
forma comportamental, la podemos dividir en dos formas dependiendo de su complejidad y el
modo en que se ejecutan las instrucciones (flujo de datos y algorítmica), dada la diferencia de
ejecutar las instrucciones en forma de serie o paralelo.

Módulos básicos en un código en VHDL:

Declaraciones de bibliotecas
Las declaraciones de bibliotecas en una lista y sus correspondientes paquetes que el compilador
necesita para procesar el diseño.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Entidad
Es una lista con especificaciones para los puertos de entradas y salidas de un circuito bajo diseño.
En él se alojan generalmente parámetros que deben ser declarados, así como algunas otras
declaraciones, subprogramas y declaraciones concurrentes.

ENTITY nombre_entidad IS

GENERIC ( nombre_constante1: tipo_constante:= valor;


nombre_constante2: tipo_constante:= valor;
nombre_n’constantes: tipo_constante:= valor;
);

PORT ( nombre_puerto1: modo_señal tipo de señal;


nombre_puerto2: modo_señal tipo de señal;
nombre_puerto’n: modo_señal tipo de señal;
);
END nombre_entidad;

GENERIC: aloja la declaración de constantes genéricas, los cuales pueden ser usadas
en cualquier parte del código, incluido en el puerto.

PORT:
modo señal:
in y out son unidireccionales.
inout es bidireccional.
Buffer es necesario cuando una señal puede ser leída de manera interna.
tipo de señal: bit, bit_vector, integer, std_logic, std_logic_vector, booleano, etc.

Declaración VHDL de la entidad.

ENTITY mi_diseño IS
PORT (
clk,rst: IN std_logic;
d: IN std_logic_vector (0 to 7);
q: OUT std_logic_vector(7 DOWNTO 0) );
END mi_diseño;
Arquitectura
Es la parte que contiene el código propio (los circuitos destinados a la descripción mediante flujo
de datos, estructural o algorítmico). Este puede ser concurrente o secuencial. Por flujo de datos o
estructural son adecuados para el diseño de circuitos combinacionales, mientras que algorítmico
puede ser usado para diseño secuenciales, sin olvidar los circuitos combinacionales.

ARCHITECTURE nombre_arquitectura OF nom_entidad IS

(Parte declarativa)

BEGIN

(Código)
END nombre_arquitectura;

Tipos de variables y señales en VHDL

Tipo de variable Valor Forma de escribir Ejemplo


BIT 0o1 Comillas simples ‘0’, ‘1’
STD_LOGIC U,X,0,1,Z,W,L,H Comillas simples ‘X’, ‘0’, ‘1’, ‘Z’
INTEGER Números enteros Sin comillas 4095, 7,-120,-1
BIT_VECTOR Múltiples casos de 0 o 1 Comillas dobles “1110110”
STD_LOGIC_VECTOR Múltiples casos de Comillas dobles “11001100”,
U,X,0,1,Z,W,L,H “00ZZ11”,
“ZZZZZZ”

Sintetizables No sintetizables
0 forzado a cero W desconocido débil
1 forzado a uno L débil 0
- Don´t Care H débil 1
Z alta impedancia U no inicializada, valor por defecto.
X Desconocido. Debido a un corto circuito
Asignación de señales

SIGNAL nom_variable: std_logic_vector(7


Declaración de una señal de 8 bits
downto 0);

Asignación de un valor binario (cadena o vector) nom_variable <= “10100011”;


Múltiples bits: comillas dobles (“)
Asignación de un valor en hexadecimal nom_variable <=x”A3”;
Múltiples bits: comillas dobles (“)
Asignación de un bit nom_variable <=‘1’;
Un bit: comilla simple (‘)
Asignación de un rango de bits nom_variable (7 downto 4) <=“1010”;
Múltiples bits: comillas dobles (“)
Concatenación de bits o vectores nom_variable <= a(1 downto 0) & b(1 downto
nom_variable es un vector de 4 bits declarado 0);
previamente

Estructura de un código en VHDL

Library ieee;
Use ieee.std_logic_1164.all;

Entity nombre_entidad is
Port (……..
……..
…….. );
End nombre_entidad ;

Arquitecture nombre_arquitectura
of nombre_entidad is

Begin

End nombre_arquitectura;

Los comentarios se realizan al colocar mínimo 2 guiones (--….-- comentario)


Estructuras sintácticas del lenguaje VHDL de tipo concurrente, utilizadas de manera frecuente.

Declaración Ejemplo
WHEN – ELSE WHEN es una simple declaración condicional, y X<= ‘0’ WHEN rst=‘0’ ELSE
es equivalente a la instrucción if. ‘1’ WHEN a=‘0’ and b=‘1’ ELSE
La expresión de asignación es: ‘-’ ; -- don’t care.
x<=valor asignación 1 WHEN condición ELSE
valor asignación 2 WHEN condición ELSE Y<= “00” WHEN ( a and b)=“01” ELSE
valor asignación 3 WHEN condición ELSE “11” WHEN (a and b)= “10” ELSE
valor asignación default; “ZZ”; --alta impedancia.

Q<= ‘0’ WHEN rst=‘1’ ELSE


d WHEN clk=‘1’ ELSE
UNAFFECTED; -- ninguna acción;
WITH-SELECT- Se utiliza para asignar un valor (de varios WITH entrada SELECT
WHEN posibles) a una señal o grupo de señales Y <= “0000” WHEN “00”,
(basándose en cada valor que pueda tener la x ”1” WHEN “11”,
señal) previamente seleccionada. “10” & entrada WHEN OTHERS;
Por lo general un grupo de señales forman un
vector como en ejemplo entrada; este vector
está formado por entrada (0), entrada (1) ……
entrada(n)
MAPEO DE En la asociación posicional, las señales en el ARQUITECTURE nombre_arquitectura IS
PUERTOS POR mapa de puertos deben listarse en el mismo BEGIN
POSICIONES orden en el cual se declararon los puertos en la nombre_etiqueta: ENTITY WORK
entidad. Para que la asociación se realice las archivo,carpetar,sistema
señales deben ser del mismo tipo. (Para no PORT MAP (llamado de las señales, en orden,
cometer errores No olvidar el orden) separando);

END nombre_arquitectura;

MAPEO DE Este tipo de mapeo reduce la posibilidad de ARQUITECTURE nombre_arquitectura IS


PUERTOS POR cometer errores ya que para cada asociación se COMPONENT COMB, IS
NOMBRE especifica: PORT (……..
Nombre de la señal a asociar con el símbolo => y ……..
el nombre del puerto como aparece en la …….. );
entidad del componente. No importa el orden de END COMPONENT;
realizar la asociación
BEGIN
nombre_etiqueta: COMB PORT MAP ( A =>_ , B =>_ ,
C =>_);
END nombre_arquitectura;
Decodificador en VHDL

Declaración de bibliotecas
Las bibliotecas son la primera parte que se tiene que declarar, se enuncian una lista de las más
utilizadas que el compilador necesita para procesar el diseño.

LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Programación por flujo de datos


ENTITY Deco2a4 IS ̅)
DEC 2:4 Salidas Activas a cero (SA=0) Con Habilitador negado (𝐇
PORT ( A : in STD_LOGIC;
B : in STD_LOGIC;
H : in STD_LOGIC; Declaración de puerto compacta
Y0 : out STD_LOGIC;
Y1 : out STD_LOGIC; Port ( A, B, H : IN BIT;
Y2 : out STD_LOGIC; Y0, Y1, Y2, Y3 : OUT BIT);
Y3 : out STD_LOGIC);
END Deco2a4;
Entidad.
ARCHITECTURE BEHAVIORAL OF Las entradas y salidas son declaradas de un solo bit.
Deco2a4 IS Arquitectura.
BEGIN A cada salida está dada por su función lógica (generada de la tabla de
Y0 <= H OR A OR B; verdad).
Y1 <= H OR A OR NOT B;
Y2 <= H OR NOT A OR B;
Y3 <= H OR NOT A OR NOT B;
END BEHAVIORAL;

Programación Algorítmica por asignación selectiva


ENTITY Deco2a4 IS DEC 2:4 Salidas Activas a uno (SA=1) Sin habilitador
PORT (entrada: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
salida: OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); Entidad.
END Deco2a4; Se declara la entidad con 2 vectores, el de entrada de
2 bits, y salidas de 4 bits.
ARCHITECTURE BEHAVIORAL OF deco2a4 IS Arquitectura.
BEGIN Se utiliza WITH, SELECT. Cuando la entrada sea
WITH entrada SELECT seleccionada se asigna la salida correspondiente, se
salida <= "0001" WHEN "00", tienen 4 posibles entradas de selección (00,01,10,11).
"0010" WHEN "01", Las salidas son asignadas en vector en donde solo se
"0100" WHEN "10", activa a 1 la salida deseada mientras las otras 3 se
"1000" WHEN "11", ponen a cero.
"0000" WHEN OTHERS; Cuando se utiliza estas instrucciones, siempre se
END BEHAVIORAL; deben de seleccionar los otros casos utilizando en la
declaración WHEN OTHERS.
ENTITY deco2a4 IS DEC 2:4 Salidas Activas a uno (SA=1) con
PORT (entrada: IN INTEGER RANGE 0 TO 3; habilitador negado, entrada como variable entera,
H: IN STD_LOGIC; utilizando WHEN-ELSE
salida: OUT STD_LOGIC_VECTOR (3 DOWNTO
0)); Entidad.
END deco2a4; El vector de entrada es entero de 0 a 3, la salida está
ARCHITECTURE BEHAVIORAL OF deco2a4 IS declarada como vector lógico (4 bits).
BEGIN Arquitectura.
salida <= "0001" WHEN (entrada=0 AND H=’0’) ELSE Se le asigna al vector de salida cuando cada entrada
"0010" WHEN (entrada =1 AND H=’0’) ELSE sea seleccionada en forma entera, realizando una
"0100" WHEN (entrada =2 AND H=’0’) ELSE AND lógica con el habilitador y todos sus posibles
"1000" WHEN (entrada =3 AND H=’0’) ELSE casos (ELSE).
"0000";
END BEHAVIORAL;

ENTITY dec8a1 IS
DEC 3:8 SA=1 sin habilitador, utilizando PROCESS, IF,
PORT ( ent : in STD_LOGIC_VECTOR (2 downto 0);
ELSIF, THEN.
sal : out STD_LOGIC_VECTOR (7 downto 0));
END d dec8a1;
Para el uso de la instrucción IF, es necesarios el utilizar
variables sensibles a la instrucción por lo que se utiliza la
ARCHITECTURE BEHAVIORAL OF dec8a1 IS
instrucción PROCESS.
BEGIN
PROCESS(variables sensitivas)
PROCESS(ent)
Entidad.
BEGIN
Las entradas y salidas están declaradas como vector.
IF ent="000" THEN sal<= X"01";
Arquitectura.
ELSIF ent="001" THEN sal<=X"02";
Después del primer BEGIN se declara la instrucción
ELSIF ent="010" THEN sal<= X"04";
PROCESS entre paréntesis la o las variables sensitivas
ELSIF ent="011" THEN sal<= X"08";
(sensibles al cambio de las variables de entrada).
ELSIF ent="100" THEN sal<= X"10";
Las entradas y salidas están trabajándose en binario y
ELSIF ent="101" THEN sal<= X"20";
para reducir el formato se hace uso de la variable en
ELSIF ent="110" THEN sal<= X"40";
hexadecimal (X).
ELSE sal<=x"80";
Se utiliza el IF y ElSIF (todos los distintos casos)
END IF;
END IF para cerrar el IF.
END PROCESS;
END PROCESS para cerrar el PROCESS.
END Behavioral;

ENTITY deco8a1 IS DEC 3:8 SA=1 sin habilitador, utilizando LOOP,


PORT ( entrada : IN STD_LOGIC_VECTOR (2 downto 0); PROCESS, IF, ELSE, THEN.
salida : OUT STD_LOGIC_VECTOR (7 downto 0)); Entidad.
END deco8a1; La entrada está dada en forma de vector de 3 bits, la
salida también en vector de 8 bits.
ARCHITECTURE BEHAVIORAL OF deco8a1 IS
BEGIN Arquitectura.
PROCESS(entrada) Se utiliza la instrucción PROCESS con variable
VARIABLE j: INTEGER; sensitiva entrada. Se declara una variable interna j
BEGIN entera y se le asigna a j la conversión entera de la
J:=CONV_INTEGER(entrada); variable entrada.
FOR i IN 0 TO 7 LOOP Se realiza un ciclo de i desde 0 a 7, con el IF se
IF (i=j) then compara si i=j si cumple se asigna la salida a 1 caso
Salida (i)<= ‘1’; contrario (ELSE) se asigna la salida=0.
ELSE No olvidar cerrar el IF, LOOP, PROCESS
Salida (i)<= ‘0’;
END IF;
END LOOP;
END PROCESS;
END deco8a1;
Multiplexores en VHDL

Programación por flujo de datos


ENTITY MUX4A1 IS MUX 4:1
PORT( D0,D1,D2,D3: IN BIT; Entidad.
SELEC : IN BIT_VECTOR (1 DOWNTO 0); La entrada está declarada en 4 variables cada una de
Y: OUT BIT); TIPO BIT. Las líneas de selección están declaradas como
END MUX4A1; vector TIPO BIT (2 bits). La salida Y declarada de TIPO BIT.

ARCHITECTURE BEHAVIORAL OF MUX4A1 IS Arquitectura.


BEGIN Se asigna a la salida la función que representa al
y <= ((NOT SELEC (1)) AND (NOT SELEC (0)) AND D0) multiplexor de 4 a 1.
OR ((NOT SELEC (1)) AND (SELEC (0)) AND D1)
OR ((SELEC (1)) AND (NOT SELEC (0)) AND D2)
OR ((SELEC (1)) AND (SELEC (0)) AND D3);
END BEHAVIORAL;

Programación Algorítmico por asignación selectiva


ENTITY MUX4A1 IS
PORT( D0,D1,D2,D3: IN BIT; Entidad.
SEL : IN BIT_VECTOR (1 DOWNTO 0); La entrada está declarada a través de 4 variables cada
Y: OUT BIT); una de TIPO BIT. Las líneas de selección están declaradas
END MUX4A1; en forma de vector TIPO BIT (2 bits). La salida Y
declarada como bit.
ARCHITECTURE BEHAVIORAL OF MUX4A1 IS
BEGIN Arquitectura.
WITH SEL SELECT Cuando se seleccionas alguna de las 4 posibles entradas,
Y <= DO WHEN "00", se le asigna el dato correspondiente utilizando WITH-,
D1 WHEN "01", SELECT. Al utilizar la variable SEL TIPO BIT, no es
D2 WHEN "10", necesario utilizar al final de la selección el WHEN
D3 WHEN "11“; OTHERS.
END BEHAVIORAL;

ENTITY MUX4A1 IS MULTIPLEXOR 4:1 CON UN PROCESO Y CASE.


PORT ( D0,D1,D2,D3: IN BIT;
SEL : IN BIT_VECTOR (1 DOWNTO 0); Entidad.
Y: OUT BIT); La entrada está declarada en 4 variables cada una de
END MUX4A1; TIPO BIT. Las líneas de selección están declaradas en
forma de vector TIPO BIT (2 bits). La salida Y declarada
ARCHITECTURE BEHAVIORAL OF MUX4A1 IS como TIPO BIT.
BEGIN
PROCESS (SELEC,D0,D1,D2,D3) Arquitectura.
BEGIN Se Utiliza el PROCESS con las variables sensitivas.
CASE SELEC IS Se utiliza el CASE (caso) de la variable SELEC, con cada
WHEN “00” => Y <= D0; una de sus 4 entradas, asignando a la salida Y el dato
WHEN “01” => Y<= D1; correspondiente. El WHEN OTHERS se le asigna la salida
WHEN “10” => Y <= D2; de la variable Y a cero.
WHEN “11” => Y<= D3; Se cierra el CASE y el PROCESS.
WHEN OTHERS => Y<= ‘0’;
END CASE;
END PROCESS;
END BEHAVIORAL;
ENTITY MUX4A1 IS MULTIPLEXOR 4:1 utilizando PROCESS, IF.
PORT ( D: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
SELEC : IN STD_LOGIC_VECTOR(1 DOWNTO 0); Entidad.
Y : OUT STD_LOGIC); La entrada D está declarada como vector lógico de 4 bits.
END MUX4A1 ; Las líneas de selección están declaradas en forma de
vector lógico de 2 bits. La salida lógica declarada de un
ARCHITECTURE BEHAVIORAL OF MUX4A1 IS bit.
BEGIN
PROCESS (D,SELEC) Arquitectura.
BEGIN Se utiliza IF para asignar el dato seleccionado con “00”,
IF (SELEC = "00“) THEN Y <= D(0); utilizando ELSIF para cada una de las selecciones
ELSIF (SELEC = "01") THEN Y <= D(1); faltantes, al final se utiliza ELSE para el último dato. Se
ELSIF (SELEC= "10") THEN Y <= D(2); cierra el IF y el PROCESS.
ELSE Y <= D(3);
END IF;
END PROCESS;
END BEHAVIORAL;

ENTITY MUX4A1 IS
PORT(A, B, C ,D:IN BIT_VECTOR(3 DOWNTO 0); MULTIPLEXOR 4 :1
H :IN BIT; CADA ENTRADA ESTA DADA POR 4 BITS C/U
SEL :IN BIT_VECTOR(1 DOWNTO 0);
Y :OUT BIT_VECTOR(3 DOWNTO 0)); Entidad.
END MUX4A1 ; La entrada está declarada en 4 variables cada una TIPO
BIT (4 bits). La línea de selección (SEL) está declarada
ARCHITECTURE BEHAVIORAL OF MUX4A1 TIPO BIT (2 bits). La salida declarada TIPO BIT (4 bits),
BEGIN tiene un habilitador H tipo bit (1 bit).
PROCESS (A, B, C, D, SEL, H)
BEGIN Arquitectura.
IF H='0' THEN Y<=X"0"; Se utiliza el PROCESS con las variables sensibles, se
ELSE decide por medio del IF, el valor del habilitador cuando
CASE SEL IS H=0 se asigna a todas las salidas el valor=0 dado en
WHEN "00" => Y<= A; forma hexadecimal. En el caso contrario utilizando el
WHEN "01" => Y<= B; ELSE para utilizar cada caso (CASE) de las líneas de
WHEN "10" => Y <= C; selección, se asigna a cada valor asignado a la salida. Se
WHEN OTHERS => Y<= D; utiliza el WHEN OTHERS para el caso de la selección “11”.
END CASE; SE cierra el CASE, IF, PROCESS. En el mismo orden que
END IF; fueron utilizados.
END PROCESS;
END BEHAVIORAL;

También podría gustarte