Diseño VLSI - Introducción a VHDL

VHDL significa lenguaje de descripción de hardware de circuito integrado de muy alta velocidad. Es un lenguaje de programación utilizado para modelar un sistema digital por flujo de datos, estilo de modelado de comportamiento y estructural. Este lenguaje se introdujo por primera vez en 1981 para el Departamento de Defensa (DoD) bajo el programa VHSIC.

Describir un diseño

En VHDL, se usa una entidad para describir un módulo de hardware. Una entidad se puede describir usando,

  • Declaración de entidad
  • Architecture
  • Configuration
  • Declaración de paquete
  • Cuerpo del paquete

Veamos cuáles son estos

Declaración de entidad

Define los nombres, las señales de entrada y salida y los modos de un módulo de hardware.

Syntax -

entity entity_name is
   Port declaration;
end entity_name;

Una declaración de entidad debe comenzar con 'entidad' y terminar con palabras clave de 'fin'. La dirección será entrada, salida o entrada.

En El puerto se puede leer
Afuera El puerto se puede escribir
En fuera El puerto se puede leer y escribir
Buffer El puerto se puede leer y escribir, solo puede tener una fuente.

Architecture -

La arquitectura se puede describir usando estilo estructural, de flujo de datos, de comportamiento o mixto.

Syntax -

architecture architecture_name of entity_name 
architecture_declarative_part;

begin
   Statements;
end architecture_name;

Aquí, debemos especificar el nombre de la entidad para la que estamos escribiendo el cuerpo de la arquitectura. Las declaraciones de arquitectura deben estar dentro de las palabras clave 'begin' y 'énd'. La parte declarativa de la arquitectura puede contener variables, constantes o declaración de componentes.

Modelado de flujo de datos

En este estilo de modelado, el flujo de datos a través de la entidad se expresa mediante una señal concurrente (paralela). Las declaraciones concurrentes en VHDL son WHEN y GENERATE.

Además de ellos, las asignaciones que usan solo operadores (Y, NO, +, *, sll, etc.) también se pueden usar para construir código.

Finalmente, un tipo especial de asignación, llamado BLOQUEO, también se puede emplear en este tipo de código.

En código concurrente, se puede utilizar lo siguiente:

  • Operators
  • La instrucción WHEN (WHEN / ELSE o WITH / SELECT / WHEN);
  • La sentencia GENERATE;
  • La declaración BLOCK

Modelado de comportamiento

En este estilo de modelado, el comportamiento de una entidad como conjunto de declaraciones se ejecuta secuencialmente en el orden especificado. Solo las declaraciones colocadas dentro de un PROCESO, FUNCIÓN o PROCEDIMIENTO son secuenciales.

PROCESOS, FUNCIONES y PROCEDIMIENTOS son las únicas secciones de código que se ejecutan secuencialmente.

Sin embargo, en su conjunto, cualquiera de estos bloques sigue siendo concurrente con cualquier otra declaración colocada fuera de él.

Un aspecto importante del código de comportamiento es que no se limita a la lógica secuencial. De hecho, con él, podemos construir circuitos secuenciales así como circuitos combinacionales.

Las declaraciones de comportamiento son IF, WAIT, CASE y LOOP. Las VARIABLES también están restringidas y se supone que deben usarse solo en código secuencial. VARIABLE nunca puede ser global, por lo que su valor no se puede transferir directamente.

Modelado estructural

En este modelo, una entidad se describe como un conjunto de componentes interconectados. Una declaración de instanciación de componentes es una declaración concurrente. Por lo tanto, el orden de estas declaraciones no es importante. El estilo estructural de modelado describe solo una interconexión de componentes (vistos como cajas negras), sin implicar ningún comportamiento de los propios componentes ni de la entidad que representan colectivamente.

En el modelado estructural, el cuerpo de la arquitectura se compone de dos partes: la parte declarativa (antes de que comience la palabra clave) y la parte de declaración (después de que comience la palabra clave).

Operación lógica - AND GATE

X Y Z
0 0 0
0 1 0
1 0 0
1 1 1

VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;

entity and1 is
   port(x,y:in bit ; z:out bit);
end and1;

architecture virat of and1 is
begin
   z<=x and y; 
end virat;

Formas de onda

Operación lógica - Puerta OR

X Y Z
0 0 0
0 1 1
1 0 1
1 1 1

VHDL Code: 
Library ieee; 
use ieee.std_logic_1164.all;  

entity or1 is
   port(x,y:in bit ; z:out bit); 
end or1; 
 
architecture virat of or1 is
begin
   z<=x or y; 
end virat;

Formas de onda

Operación lógica - NO puerta

X Y
0 1
1 0

VHDL Code:
  
Library ieee; 
use ieee.std_logic_1164.all; 
 
entity not1 is
   port(x:in bit ; y:out bit); 
end not1; 
 
architecture virat of not1 is
begin
   y<=not x;
end virat;

Formas de onda

Operación lógica - Puerta NAND

X Y z
0 0 1
0 1 1
1 0 1
1 1 0

VHDL Code:
  
Library ieee; 
use ieee.std_logic_1164.all; 

entity nand1 is
   port(a,b:in bit ; c:out bit); 
end nand1; 
 
architecture virat of nand1 is
begin
   c<=a nand b; 
end virat;

Formas de onda

Operación lógica - Puerta NOR

X Y z
0 0 1
0 1 0
1 0 0
1 1 0

VHDL Code: 
 
Library ieee; 
use ieee.std_logic_1164.all; 
 
entity nor1 is
   port(a,b:in bit ; c:out bit); 
end nor1; 
 
architecture virat of nor1 is
begin
   c<=a nor b;
end virat;

Formas de onda

Operación lógica - Puerta XOR

X Y Z
0 0 1
0 1 1
1 0 1
1 1 0

VHDL Code: 
 
Library ieee; 
use ieee.std_logic_1164.all;
  
entity xor1 is
   port(a,b:in bit ; c:out bit); 
end xor1;
  
architecture virat of xor1 is
begin
   c<=a xor b; 
end virat;

Formas de onda

Operación lógica - Puerta X-NOR

X Y Z
0 0 1
0 1 1
1 0 1
1 1 0

VHDL Code: 
 
Library ieee; 
use ieee.std_logic_1164.all; 

entity xnor1 is
   port(a,b:in bit ; c:out bit); 
end xnor1; 
 
architecture virat of xnor1 is
begin
   c<=not(a xor b); 
end virat;

Formas de onda