Todo Del VHDL
Todo Del VHDL
Todo Del VHDL
Ir a la navegaciónIr a la búsqueda
VHDL es un lenguaje de especificación definido por el IEEE (Institute of Electrical and
Electronics Engineers) (ANSI/IEEE 1076-1993) utilizado para describir circuitos digitales y
para la automatización de diseño electrónico . VHDL es acrónimo proveniente de la
combinación de dos acrónimos: VHSIC (Very High Speed Integrated Circuit) y HDL (Hardware
Description Language). Aunque puede ser usado de forma general para describir cualquier
circuito digital se usa principalmente para programar PLD (Programable Logic Device -
Dispositivo Lógico Programable), FPGA (Field Programmable Gate Array), ASIC y similares.
Originalmente, el lenguaje VHDL fue desarrollado por el departamento de defensa de los
Estados Unidos a inicios de los años 80 basado en el lenguaje de programación ADA con el
fin de simular circuitos eléctricos digitales. Posteriormente se desarrollaron herramientas de
síntesis e implementación en hardware a partir de los archivos VHD.
Otros métodos para diseñar circuitos son la captura de esquemas (con herramientas CAD) y
los diagramas de bloques, pero estos no son prácticos en diseños complejos. Otros lenguajes
para el mismo propósito, pero con un nivel de abstracción superior son Verilog y ABEL.
Índice
Secuencia de diseño[editar]
El flujo de diseño de un sistema podría ser:
Procedimiento de diseño[editar]
El primer paso del diseño consiste en la construcción del diagrama en bloque del sistema. En
diseños complejos como en software los programas son generalmente jerárquicos y VHDL
ofrece un buen marco de trabajo para definir los módulos que integran el sistema y sus
interfaces, dejando los detalles para pasos posteriores.
El segundo paso es la elaboración del código en VHDL para cada módulo, para sus interfaces
y sus detalles internos. Como el VHDL es un lenguaje basado en texto, se puede utilizar
cualquier editor para esta tarea, aunque el entorno de los programas de VHDL incluye su
propio editor de texto. Después de que se ha escrito algún código se hace necesario
compilarlo. El compilador de VHDL analiza este código y determina los errores de sintaxis y
chequea la compatibilidad entre módulos. Crea toda la información necesaria para la
simulación. El próximo paso es la simulación, la cual le permite establecer los estímulos a
cada módulo y observar su respuesta. El VHDL da la posibilidad de crear bancos de prueba
que automáticamente aplica entradas y compara las salidas con las respuestas deseadas. La
simulación es un paso dentro del proceso de verificación. El propósito de la simulación es
verificar que el circuito trabaja como se desea, es decir es más que comparar entradas y
salidas. En proyectos complejos se hace necesario invertir un gran tiempo en generar pruebas
que permitan evaluar el circuito en un amplio rango de operaciones de trabajo. Encontrar
errores en este paso del diseño es mejor que al final, en donde hay que repetir entonces una
gran cantidad de pasos del diseño. Hay dos dimensiones a verificar:
Estructura de programa[editar]
VHDL fue diseñado con base a los principios de la programación estructurada. La idea es
definir la interfaz de un módulo de hardware mientras deja invisible sus detalles internos. La
entidad (ENTITY) en VHDL es simplemente la declaración de las entradas y salidas de un
módulo mientras que la arquitectura (ARCHITECTURE) es la descripción detallada de la
estructura interna del módulo o de su comportamiento. En la siguiente figura se ilustra el
concepto anterior. Muchos diseñadores conciben la Entity como una funda de la arquitectura
dejando invisible los detalles de lo que hay dentro (architecture). Esto forma la base de un
sistema de diseño jerárquico, la arquitectura de la entidad de más nivel (top level) puede usar
otras entidades, dejando invisible los detalles de la arquitectura de la identidad de menos
nivel. En la figura las entidades B, E y F no utilizan otras entidades. Mientras que la entidad A
utiliza todas las demás. A la pareja entidad-arquitectura se la llama modelo. En un fichero
texto VHDL la entidad y la arquitectura se escriben separadas, por ejemplo a continuación se
muestra un programa muy simple en VHDL de una compuerta de 2 entradas. Como otros
programas, VHDL ignora los espacios y saltos de líneas. Los comentarios se escriben con 2
guiones (--) y terminan al final de la línea. En la figura siguiente se muestra la estructura de un
modelo en VHDL. SINTAXIS PARA LA DECLARACIÓN DE LA ENTIDAD VHDL define
muchos caracteres especiales llamados “palabras reservadas”. Aunque las palabras
reservadas no son sensibles a las mayúsculas o minúsculas, en el ejemplo que sigue las
utilizaremos en mayúsculas y negrita para identificarlas.
ENTITY Nombre_entidad IS
PORT ( Nombre de señal: modo tipo de señal;
. . .
Nombre de señal: modo tipo de señal ) ;
END nombre_entidad ;
Modo Descripción
Este modo se utiliza para las señales que además de salir de la entidad pueden usarse como
BUFFER
entradas realimentadas
Este modo se utiliza para señales bidireccionales. Se emplea en salida con tres estados. Se
INOUT puede asignar como sustituto de los tres modos anteriores, pero no se aconseja pues
dificulta la comprensión del programa.
Tipo de señal; en VHDL, hay varios tipos de señales predefinidas por el lenguaje, tales
como:
TIPO Características
BIT En este tipo las señales solo toman los valores de "1" y "0"
Booleana En este tipo las señales solo toman los valores de True y False
En este tipo las señales toman 9 valores, entre ellos tenemos: "1", "0", "Z" (para
Std_logic
el 3.er estado), "-" (para los opcionales).
Integer En este tipo las señales toman valores enteros. Los 1 y los 0 se escriben sin “
En este tipo los valores de las señales son una cadena de unos y ceros. Ejemplo:
Bit_Vector
“1000”
En este tipo los valores de las señales son una cadena de los nueve valores
Std_Logic_Vector
permisibles para el tipo std_logic.
Contiene todos los caracteres ISO de 8 bits, donde los primeros 128 son los
Character
caracteres ASCII.
Ejemplo: “1-0Z” -231 + 1 231 - 1 Integer -2 147 483 647 2 147 483 647
Bit Character Severity_level Bit_vector Integer String Boolean Real time
Operadores
Tipo Std_logic
ENTITY ejemplo1 IS
PORT ( a, b : IN bit;
F : OUT bit );
END ejemplo1 ;
BEGIN
Enunciado concurrente
. . .
Enunciado concurrente
END nombre_arquitectura;
Las declaraciones y definiciones que preceden al BEGIN, pueden estar presentes todas,
algunas o ninguna. Esto depende del tipo de diseño que se esté realizando. No obstante la
declaración de señales se utiliza mucho, pues contribuye entre otras cosas a la claridad del
diseño.
Nombre_entidad es el nombre de su entidad. Nombre_arquitectura es el nombre dado por el
usuario a la arquitectura. Las señales externas de la arquitectura son las declaradas en el port
de la entidad, no obstante una arquitectura puede contener señales y otras declaraciones que
solo existen localmente en esa arquitectura. Declaraciones comunes a varias entidades
pueden ser puestas en un “paquete” separado utilizado por todas las entidades. Las
declaraciones en la arquitectura pueden aparecer en diferente orden, pero lo más usual es
comenzar por la declaración de las señales. Signal signal-name: signal-type Variables en
VHDL son similares a las señales excepto que ellas no tienen significado físico en el circuito.
En el ejemplo anterior no se puso declaración de variables, ellas son usadas en funciones,
procedimientos y procesos. Todas las señales, variables y constantes en VHDL tienen
asociadas un tipo, este especifica el conjunto de valores que el objeto puede tomar. También
hay un conjunto de operadores tales como add, and etc, asociados con un tipo dado.
Operadores en VHDL[editar]
En VHDL existen diferentes operadores entre los que tenemos:
Operadores Definidos en VHDL para los tipos: Lógicos AND, OR, XOR, NOT, NAND, NOR,
XNOR Bit y Booleanos De relación =, /=, <, >, >=, <= Integer, Bit y Bit_Vector Concatenación
& Bit, Bit_Vector y para las cadenas Aritméticos +, -, *, /, Mod, Rem, Abs, ** Integer* Mod:
Módulo de la división. Rem: Resto de la división Abs: valor absoluto.
o exponentiation.
El WARP solo soporta multiplicar y dividir por 2. Ejemplo: Escriba la definición de arquitectura
para la entidad del ejemplo anterior.
ARCHITECTURE and_2ent OF ejemplo1 IS
BEGIN
F <= a AND b;
END and_2ent;
Ejemplo; Realice el programa en VHDL de un circuito con dos entradas y una salida f. La
entidad es la misma anterior, pero supongamos que la función que realiza el circuito es tal que
la salida será 0 solo si las entradas son iguales (operación XOR).
ENTITY Boole_4 IS
PORT ( a, b: IN Boolean;
Y: OUT Bolean);
END Boole_4;
Ejemplo: repita el diseño anterior, pero utilice asignaciones condicionales de la forma WITH..
SELECT.. WHEN.. OTHERS
ENTITY Boole_5 IS
PORT ( a, b: IN Boolean;
Y: OUT Bolean);
END Boole_5;
Sintaxis para el trabajo con vectores. Los vectores se describen como: a(3), a(2), a(1), a(0),
siempre comenzando por 0.Cuando un vector se declara en orden descendente utilizando la
palabra clave DOWNTO por ejemplo (3 DOWNTO 0), debemos interpretar que el MSB es a(3)
y el LSB es a(0). Si se declara (0 to 3), entonces el LSB es a(3) y el MSB es a(0).
Bibliotecas[editar]
Una biblioteca en VHDL es un lugar en donde se guarda la información relacionada con un
diseño determinado. Al comienzo de cada diseño el compilador crea automáticamente una
biblioteca llamada WORK con este objetivo. Además de esta biblioteca particular existen otras
bibliotecas de tipo general que contienen un conjunto de definiciones que pueden utilizarse en
cualquier diseño. Un ejemplo de biblioteca general es la llamada Library IEEE, que contiene
definiciones estándar para VHDL. Para utilizar una biblioteca general es necesario escribir su
nombre al inicio del programa, por eso es muy común que en la primera línea de un diseño en
VHDL aparezca escrito "Library IEEE", de esta forma dicha biblioteca se hace visible para el
diseño.
Paquetes[editar]
En los paquetes se guardan definiciones de tipos y objetos que pueden ser utilizados en los
diferentes diseños que invoquen su utilización. Un paquete muy utilizado es el paquete
estándar IEEE_STD_LOGIC_1164.ALL; La utilización de un paquete en un diseño se realiza
invocando su empleo mediante la cláusula USE y el nombre del paquete. Por ejemplo USE
IEEE_STD_LOGIC_1164.ALL;
La terminación ALL, permite utilizar todas las definiciones y objetos que contiene dicho
paquete. Además del estándar, existen otros paquetes de utilización general y también los
diseñadores que trabajan con VHDL pueden definir sus propios paquetes, lo que les permite
reutilizar diseños realizados anteriormente como parte de nuevos diseños.
Sintaxis para la definición de paquetes.
La sintaxis para la definición de un paquete es la siguiente:
PACKAGE nombre_paquete IS
Declaración de tipos
Declaración de señales.
Declaración de constantes
Declaración de componentes
Definición de funciones
Definición de procedimientos
END nombre_paquete
Esta última parte que aparece entre los dos END, la relacionada con el cuerpo del paquete
puede o no existir y en el caso de existir las declaraciones y definiciones contenidos en la
misma son locales, visibles solo dentro del paquete, mientras que las declaraciones y
definiciones contenidas en la primera parte del paquete son visibles para todos los diseños
que los utilicen.
Sintaxis para la declaración de una componente en VHDL
COMPONENT nombre_componente
PORT ( Nombre de señal: modo tipo de señal;
...
Nombre de señal: modo tipo de señal);
END COMPONENT;
ENTITY T IS
PORT (a,b,c: IN BIT;
T: OUT BIT);
END T;
ARCHITECTURE T OF T IS
BEGIN
T <= ‘1’ WHEN a = ‘0’ AND b = ‘1’ AND c = ‘1’ ELSE
‘1’ WHEN a = ’1’ AND b = ‘0’ AND c = ‘0’ ELSE
‘0’;
END T;
PACKAGE TPKG IS
COMPONENT T -- El nombre del componente tiene que ser igual a la entidad
que se empaqueta
PORT (a,b,c: IN BIT;
T: OUT BIT);
END COMPONENT;
END TPKG;
Ejemplos de programas[editar]
Para llevar a cabo un diseño en VHDL, se recomienda hacer uso de las librerías genéricas de
la IEEE, para garantizar la flexibilidad del diseño a cualquier herramienta de compilación y
síntesis, además en el diseño se tienen dos partes principales: la entidad es como una caja
negra en la que se definen entradas y salidas pero no se tiene acceso al interior, y es lo que
usa cuanto se reutiliza un diseño dentro de otro; la arquitectura, que es donde se describe el
diseño de la forma que se ha visto antes. Otros elementos del lenguaje son las librerías,
paquetes, funciones...
Multiplexor[editar]
Este ejemplo simula un multiplexor de dos entradas. Es un ejemplo sencillo que muestra como
describir un elemento a partir de su funcionamiento.
entity MUX2a1 is
port( a: in std_logic;
b: in std_logic;
sel: in std_logic;
z: out std_logic);
end entity
entity MUX4a1 is
port( a: in std_logic;
b: in std_logic;
c: in std_logic;
d: in std_logic;
z: out std_logic;
sel: in std_logic_vector(1 downto 0));
end entity;
architecture dataflow of MUX4a1 is
begin
process(a,b,c,d,sel) begin
case sel is
when "00" => z <= a;
when "01" => z <= b;
when "10" => z <= c;
when "11" => z <= d;
end case;
end process;
end dataflow;
Biestable[editar]
A continuación se muestra el proceso que describe un biestable D activado por el flanco de
subida del reloj (CLK). Este biestable tiene una señal de reset asíncrona (RST). El dato D se
guarda en el biestable hasta el siguiente flanco de subida del reloj.
entity BIEST is
port(RST: in std_logic; -- Reset asincrono
CLK: in std_logic; -- Reloj
D: in std_logic; -- Dato de entrada
Q: out std_logic); -- Salida (dato
guardado en el biestable)
end BIEST;
architecture D of BIEST is
begin
biest_D : process(RST, CLK)
begin
if RST = '1' then -- Reset asincrono
Q <= '0';
elsif CLK'event and CLK = '1' then -- Condicion de
reloj activo por flanco de subida
Q <= D;
end if;
end process;
end D;
Contador[editar]
Este es un ejemplo de un sistema que contará pulsos de un reloj digital (CLK) hasta llegar a
1000 y entonces volverá a empezar. La inicialización se consigue con un reset (RST).
Después de compilar este programa habría que indicar a la herramienta encargada del diseño
las restricciones oportunas para asignar las señales de entrada y salida a las patillas
del chip donde se programará o bien usar este diseño dentro de otro.
Corrección Hamming[editar]
Ejemplo del código corrector de errores Hamming implementado en VHDL.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity hamcorr is
port(
DU: in STD_LOGIC_VECTOR(1 to 7);
DC: out STD_LOGIC_VECTOR( 1 to 7);
NOERROR: out STD_LOGIC
);
end hamcorr;
architecture hamcorr of hamcorr is
function syndrome (D:STD_LOGIC_VECTOR)
return STD_LOGIC_VECTOR is
variable SYN: STD_LOGIC_VECTOR (2 downto 0);
begin
SYN(0):= D(1) xor D(3) xor D(5) xor D(7);
SYN(1):= D(2) xor D(3) xor D(6) xor D(7);
SYN(2):= D(4) xor D(5) xor D(6) xor D(7);
return(SYN);
end syndrome;
begin
process(DU)
variable i : INTEGER;
begin
DC<=DU;
i:=CONV_INTEGER(syndrome(DU));
if i=0 then NOERROR <='1';
else NOERROR <='0'; DC(i) <=not DU(i); end if;
end process;
end hamcorr;
Con este código obtenemos la corrección de los errores de una palabra mediante Hamming.
Hola Mundo[editar]
El VHDL permite descripciones que no son sintetizables, es decir, que no se pueden
implementar directamente en un circuito electrónico digital. Este tipo de descripciones son
útiles en simulación. Un ejemplo de este tipo de descripciones son las que incluyen mensajes
que notifican al diseñador si se ha cumplido alguna condición durante la simulación.
El código siguiente mostraría el mensaje "hola mundo" durante la simulación:
entity hola is
end entity hola;
Herramientas[editar]
Warp
Altera
Xilinx
ActiveVHDL
GHDL (GNU)
Max+Plus II
Quartus II
ModelSim/ISE
Otros programas están incluyendo en sus últimas versiones la capacidad de programar
FPGA usando sus propios lenguajes, pero también incluyen módulos en VHDL, por
ejemplo Protel DXP, Labview o Matlab.
Véase también[editar]
Electrónica
Hardware
Lenguaje de programación
Lenguajes de programación
Very Large Scale Integration (VLSI)
Enlaces externos[editar]
Wikilibros alberga un libro o manual sobre VHDL.
Diseño de circuitos digitales con VHDL
Diseño de sistemas digitales con VHDL
Códigos de programa[editar]
Open Cores
vhdl.org
Xess
Diapositivas para enseñanza de VHDL
Fabricantes de FPGA y de herramientas[editar]
Aldec-ActiveVHDL
GHDL
IEEE
IEEE estándar 1164
Sintaxis de la revisión del 93
Synplicity. Herramientas de síntesis física y verificación de diseño
Mentor Graphics. Herramientas de síntesis física, simulación y otras relacionadas con
diseño microelectrónico, sistemas embebidos, diseño de PCB, etc.
edia
55
HDL
2
Categorías:
Lenguajes de especificación
Lenguajes de descripción de hardware