Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Introduccion VHDL

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 16

Laboratorio de Estructura de Computadores

INTRODUCCIÓN A LA
PROGRAMACIÓN EN VHDL

Dpto. Arquitectura de Computadores y Automática


Ingeniería Informática
Facultad de Informática

Profesores: Marcos Sánchez-Élez


marcos@fis.ucm.es
Mª Carmen Molina
Laboratorio de Estructura de Computadores

1. Introducción:

VHDL es un lenguaje de descripción de circuitos electrónicos digitales que utiliza


distintos niveles de abstracción. El significado de las siglas VHDL es VHSIC (Very High
Speed Integrated Circuits) Hardware Description Language. Esto significa que VHDL
permite acelerar el proceso de diseño.
VHDL no es un lenguaje de programación, por ello conocer su sintaxis no implica
necesariamente saber diseñar con él. VHDL es un lenguaje de descripción de hardware
genérico, que permite describir circuitos síncronos y asíncronos. Para realizar esto
debemos:
- Pensar en puertas y biestables, no en variables ni funciones.
- Evitar bucles combinacionales y relojes condicionados.
- Saber que parte del circuito es combinacional y cual secuencial.

Los circuitos descritos en VHDL pueden ser simulados utilizando herramientas de


simulación para reproducir el funcionamiento del circuito. Además utilizando herramientas
de síntesis se puede implementar dicho circuito en un dispositivo lógico programable o en
un circuito integrado.

2. Elementos Básicos de VHDL:

VHDL es un lenguaje y como tal, posee sus tipos de datos y operadores. Los datos se
almacenan en objetos que contienen valores de un tipo dado.

2.1 Identificadores

- Constant. Los objetos de esta clase tienen un valor inicial que es asignado de
forma previa a la simulación y que no puede ser modificado durante ésta.

o constant identificador: tipo:= valor;

- Variable. Los objetos de esta clase contienen un único valor que puede ser
cambiado durante la simulación con una sentencia de asignación. Las variables
generalmente se utilizan como índices, principalmente en instrucciones de bucle, o
para tomar valores que permitan modelar componentes. Las variables NO
representan conexiones o estados de memoria.

o variable identificador: tipo [:= valor];

- Signal. Los objetos de esta clase contienen una lista de valores que incluye el
valor actual y un conjunto de valores futuros. Las señales representan elementos de
memoria o conexiones y si pueden ser sintetizadas. Los puertos de una entidad son
implícitamente declarados como señales en el momento de la declaración, ya que
estos representan conexiones. También pueden ser declaradas en la arquitectura
antes del BEGIN, lo cual nos permite realizar conexiones entre diferentes módulos.
Laboratorio de Estructura de Computadores

o signal identificador: tipo;

VHDL permite utilizar datos predefinidos, así como otros definidos por el usuario.

BIT 0, 1
BIT_VECTOR (range)
BOOLEAN TRUE, FALSE
CHARACTER {ascii}
STRING {ascii}
SEVERITY_LEVEL {WARNING, ERROR, FALURE}
INTEGER range
NATURAL range
POSITIVE range
REAL range
TIME
( range: n_min TO n_max; n_max DOWNTO n_min)

STD_LOGIC Tipo predefinido en el estándar IEEE 1164. Este tipo representa una
lógica multivaluada de 9 valores. Además del ‘0’ lógico y el ‘1’ lógico, posee alta
impedancia ‘Z’, desconocido ‘X’ ó sin inicializar ‘U’ entre otros. (std_logic_vector, vector
de tipo std_logic).

TIPO ENUMERADO es un tipo de dato con un grupo de posibles valores asignados


por el usuario. Los tipos enumerados se utilizan principalmente en el diseño de máquinas
de estados

type nombre is (valor1, valor2, …);

Los tipos enumerados se ordenan de acuerdo a sus valores. Los programas de


síntesis automáticamente codifican binariamente los valores del tipo enumerado para que
estos puedan ser sintetizados. Algunos programas lo hacen mediante una secuencia binaria
ascendente, otros buscan cual es la codificación que mejor conviene para tratar de
minimizar el circuito o para incrementar la velocidad del mismo una vez que la descripción
ha sido sintetizada. También es posible asignar el tipo de codificación mediante directivas
propias de la herramienta de síntesis.

TIPOS COMPUESTOS un tipo compuesto es un tipo de dato formado con


elementos de otros tipos, existen dos formas de tipos compuestos, arrays y records.
Un ARRAY es un objeto de datos que consiste en una “colección” de elementos del
mismo tipo.

type nombre is array (rango) of tipo;

Un RECORD es un objeto de datos que consiste en una “colección” de elementos


de distintos tipos.
Laboratorio de Estructura de Computadores

type nombre is record


elemento1: tipo_de_dato1;
elemento2: tipo_de_dato2;
end record;

constant DATA_WIDTH: integer := 8;


signal CTRL: bit_vector(7 downto 0);
variable SIG1, SIG2: integer range 0 to 15;
type color is (rojo, amarillo, azul);
signal BMP: color;
type word is array (0 to 15) of bit_vector (7 downto 0);
type matriz is array (0 to 15)(7 downto 0) of bit;
type conjunto is record
palabra: std_logic_vector (0 to 15);
valor: integer range -256 to 256;
end record;

2.2 Operadores

Un operador nos permite construir diferentes tipos de expresiones mediante los


cuales podemos calcular datos utilizando diferentes objetos de datos con el tipo de dato que
maneja dicho objeto. En VHDL existen distintos operadores de asignación con lo que se
transfieren valores de un objeto de datos a otro, y operadores de asociación que relacionan
un objeto de datos con otro, lo cual no existe en ningún lenguaje de programación de alto
nivel.

abs
*, /, mod, rem
+ (sig.), - (sig)
+, -, &
and, or, nand, nor, xor
:= asignación de valores a constantes y variables.
<= asignación de valores a señales.

y<=(x1 and x2) or d(0);


y(1)<= x1 and not x2;
y <= x1&x2; -- y=’x1x2’
c := 27 + r;
Laboratorio de Estructura de Computadores

3. Estructura básica de un archivo fuente en VHDL.

El archivo VHDL contiene la descripción del circuito que se quiere implementar.

3.1 Entidades

Una entidad es la abstracción de un circuito, ya sea desde un complejo sistema


electrónico hasta una simple compuerta lógica. La entidad únicamente describe la forma
externa del circuito, aquí se enumeran las entradas y las salidas del diseño. Una entidad es
análoga a un símbolo esquemático de los diagramas electrónicos, el cual describe las
conexiones del dispositivo hacia el resto del diseño.

ENTITY
- Define externamente al circuito o subcircuito.
- Nombre y número de puertos, tipos de datos de entrada y salida.
- Tienes toda la información necesaria para conectar tu circuito a otros circuitos.

A
F Y
B
entity F is
port (A, B: in bit; Y out bit);
end F;

Los puertos pueden ser de entrada in, salida out, entrada-salida inout o un buffer;
se utilizará el modo inout cuando
Además, la entidad puede definir un valor genérico (GENERIC) que se utilizará
para declarar las propiedades y constantes del circuito, independientemente de cual sea la
arquitectura.

entity nombre is
generic (cte1: tipo := valor1; cte2: tipo:= valor 2; …);
port (entrada1, entrada2, … : in tipo;
salida1, salida2, …: out tipo;
puertoi : modo tipo);
end nombre;
Laboratorio de Estructura de Computadores

3.2 Arquitecturas

Los pares de entidades y arquitecturas se utilizan para representar la descripción


completa de un diseño. Una arquitectura describe el funcionamiento de la entidad a la que
hace referencia. Si una entidad la asociamos con una “caja” en la que se enumeran las
interfaces de conexión hacia el exterior, entonces la arquitectura representa la estructura
interna de esa caja.

ARCHITECTURE
- Define internamente el circuito.
- Señales internas, funciones, procedimientos, constantes …
- La descripción de la arquitectura puede ser estructural o por comportamiento.

architecture arch_name of entity_name is


-- declaraciones de la arquitectura
-- tipos
-- señales
-- componentes

begin
-- código de descripción
-- instrucciones concurrentes
-- ecuaciones booleanes
process
begin
-- código de descripción
end process;
end arch_name;

Una arquitectura se describe por comportamiento o por estructura. Una entidad


puede tener más de una arquitectura, pero cuando se compile se indica cual es la
arquitectura que queremos utilizar.

- Descripción estructural:
Esta descripción utiliza entidades descritas y compiladas previamente. Se declaran los
componentes que se utilizan y después, mediante los nombres de los nodos, se realizan las
conexiones entre las compuertas. Las descripciones estructurales son útiles cuando se trata
de diseños jerárquicos.
Una descripción estructural:
• Describe las interconexiones entre distintos módulos.
• Estos módulos pueden a su vez tener un modelo estructural o de
comportamiento.
• Normalmente esta es una descripción a más alto nivel.
Laboratorio de Estructura de Computadores

entity entity_name is
port(…);
end entity_name;

architecture arch_name of entity_name is


component component_name
port (…);
end component;
signal declarations;
begin
component_i: component_name port map (io_name)
end arch_name;

GENERATE: Las secuencias de generación de componentes permiten crear una o más


copias de un conjunto de interconexiones, lo cual facilita el diseño de circuitos mediante
descripciones estructurales.

for indice in rango generate


-- instrucciones concurrentes
end generate;

---------------------------------

component comp
port( x: in bit; y: out bit);
end component comp

signal a, b: bit_vector(0 to 7)

gen: for i in 0 to 7 generate
u: comp port map(a(i),b(i));
end generate gen;

- Descripción por comportamiento:


Las descripciones comportamentales son similares a un lenguaje de programación de
alto nivel por su alto nivel de abstracción. Más que especificar la estructura o la forma en
que se deben conectar los componentes de un diseño, nos limitamos a describir su
comportamiento. Una descripción comportamental consta de una serie de instrucciones, que
ejecutadas modelan el comportamiento del circuito. La ventaja de este tipo de descripción
es que no necesitamos enfocarnos a un nivel de compuerta para implementar un diseño.

Los módulos que se suelen describir mediante comportamiento suelen ser:

• Módulos que están al final de la jerarquía en una descripción estructural.


Laboratorio de Estructura de Computadores

• Paquetes CI de una librería.


• Módulos cuyo comportamiento es complicado para poderlo describir
mediante una estructura.
• Process con wait, if, else, when, case ...
• Muchas veces las funciones dependen del tiempo, VHDL resuelve este
problema permitiendo la descripción del comportamiento en la forma de un
programa tradicional.

entity entity_name is
port(…);
end entity_name;

architecture arch_name of entity_name is


signal declarations;
begin
-- nonprocedural (concurrent) assertions
and, or, not, nand, xor, +, -, wait
-- procedural (sequential ) assertions
process (sensitivity list)
variable declarations;
begin
sequential statements; --without wait!
end process;
end arch_name;

PROCESS: Cuando en VHDL se escribe un process, dentro de él aparece la parte


secuencial del circuito. La simulación no entra en el process hasta que no haya variado
alguna de las señales o variables de su lista de sensibilidad independientemente de lo que
este contenido dentro del process. Por otro lado únicamente dentro de un process pueden
aparecer las sentencias de tipo if y else y nunca puede aparecer una sentencia del tipo wait.

3.3 Sentencias de descripción

WAIT esta instrucción es utilizada en procesos que no tienen lista de sensibilidad:

wait on signal_list;
wait for time_expression;
wait until condition;

Eventos sobre las señales (‘EVENT) nos indican cuando ocurre un cambio en la señal

signal'event
signal'last_event
signal'last_value
Laboratorio de Estructura de Computadores

IF – THEN – ELSE solo son aplicables dentro de un process

if condición then
... --sequential statements
elsif otra_condición then
... --sequential statements
else
... --sequential statements
end if;

CASE – WHEN solo son aplicables dentro de un process

case expresión is
when alternativa_l => ... --seq. statements

when alternativa_n => ... --seq. statements
when others => ... --seq. statements
end case;

FOR – LOOP solo son aplicables dentro de un process

for loop_var in range loop


... --sequential statements
end loop;

WHILE – LOOP solo son aplicables dentro de un process

while condición loop


... --sequential statements
end loop;

WHEN – ELSE

Signal_name <= valor_1 when condición1 else


valor_2 when condición2 else
...
valor_i when condicióni else
otro_valor;

WITH – SELECT – WHEN

with identificador select


Signal_name <= valor_1 when valor_identificador1,
valor_2 when valor_identificador2,
...
valor_i when valor_identificadori,
otro_valor when others;
Laboratorio de Estructura de Computadores

3.4 Ejemplos

MULTIPLEXOR 2x1:
Un multiplexor 2x1 se correspondería con el siguiente módulo visto desde fuera:

Por lo que su entidad correspondiente sería:

entity mux2 is
port (D0, D1, S0: in std_logic; O out std_logic);
end mux2;

La descripción de lo que hace internamente se puede realizar de varias maneras, así


pues un multiplexor es un módulo que hace:

S0 O
0 D0
1 D1

Lo cual podría corresponder perfectamente a la siguiente arquitectura:

architecture behavioral1 of mux2 is


begin
O <= D1 when (S0 = ‘1’) else D0;
end behavioral1;

Ó a esta otra:

architecture behavioral2 of mux2 is


begin
multiplexor: process(D0,D1,S0)
if(S0 = ‘1’) then
O <= D1;
else
O <= D0;
end if;
end process;
end behavioral2;

También podemos saber mediante la realización de la tabla de verdad como está


diseñado por dentro un multiplexor:
Laboratorio de Estructura de Computadores

Lo que daría como resultado la siguiente arquitectura si lo hacemos de manera


estructural:

architecture structural of mux2 is


-- declaración de componentes
component AND2
port (I0,I1: in std_logic; O: out std_logic);
end component;
component OR2
port (I0,I1: in std_logic; O: out std_logic);
end component;
component INV
port (I0,I1: in std_logic; O: out std_logic);
end component;
-- declaración de señales
signal S1,S2,S3: std_logic;
begin
U1: INV port map (S0,S1);
U2: AND2 port map (D0,S1,S2);
U3: AND2 port map (S0,D1,S3);
U4: OR2 port map (S2,S3,O);
end structural;

O esta otra si lo hacemos por comportamiento

architecture mixed of mux2 is


signal S1,S2: std_logic;
begin
S1 <= D0 and not S0;
S2 <= D1 and S0;
O <= S1 or S2;
end mixed;
Laboratorio de Estructura de Computadores

4. Descripción de lógica secuencial:

Para la descripción de biestables y registros utilizaremos procesos en los que la


señal de reloj CLK será la que actúe por flanco. Podemos utilizar dos sentencias que
representan una señal de reloj.

if (CLK’event and CLK=’1’) then …


wait until CLK’event and CLK=’1’;

Ambos casos representan una lógica secuencial que cambia con el flanco de subida.
Así pues si se quiere representar un biestable deberíamos añadir el siguiente
process:

process (clock)
begin
if (clock = '1') then out1 <= in1;
end if;
end process

Biestable tipo D con reset asíncrono. El proceso se activa cuando hay eventos en las
señales de reset o clock como indica su lista de sensibilidad. La primera sentencia del
proceso comprueba si la señal de reset está a 1. Si esta señal se ha activado el biestable se
pone a cero. Si no se ha activado, el proceso funciona como el proceso descrito
anteriormente.

process (clock, reset)


begin
if (reset = '1') then q <= '0';
elsif clock = '1' and clock'event then q <= d;
end if;
end process;
Laboratorio de Estructura de Computadores

5. Diseño de una máquina de estado:

VHDL permite realizar descripciones algorítmicas de alto nivel de máquinas de


estados. De esta forma, el diseñador se evita tareas como generar la tabla de transición de
estados o la obtención de las ecuaciones de excitación basadas en tipo de biestable.

registro
E SIG_ESTADO ESTADO O
F G
CLK

Una Maquina de Estados Finita (FSM) se puede describir en VHDL de varias


formas. En primer lugar en la sección de declaraciones de la arquitectura, se define un tipo
enumerado en el que se asignan identificadores a cada estado. Suele ser recomendable
utilizar identificadores ilustrativos para los estados. La herramienta de síntesis será la
encargada de codificar estos estados. Posteriormente, en el cuerpo de la arquitectura se
define la función de transición de estados (F) y la función de salida (G) en uno o varios
procesos.
Por lo tanto tenemos:
- Un proceso secuencial que modela los biestables de estado; Por lo tanto que
actualiza el estado (ESTADO).
- Un proceso combinacional que modela las funciones F y G; por lo tanto deriva el
siguiente estado (ESTADO_SIG) y actualiza las salidas (O).

Para ilustrar la descripción de máquinas de estados vamos a pensar en un ejemplo


Se trata de diseñar una maquina de estados que active una salida S cuando se detecta la
secuencia …001... en una línea de datos E sincronizada con un reloj. Este detector de
secuencia se puede realizar con una máquina de Moore de cuatro estados.
— S1: Esperar el l.er Cero de la secuencia.
— S2: Esperar el 2.° Cero de la secuencia.
— S3: Esperar el uno de la secuencia y activar la salida S cuando llega.

E=1

E=0
S1 E=0 S2 E=0 S3 S4
O=0 O=0 O=0 E=1 O=1

E=1
E=1
E=0
Laboratorio de Estructura de Computadores

Para la implementación en VHDL. Primero definimos un tipo enumerado, formado


por los nombres de los estados y se declaran dos señales de este tipo:

type ESTADOS is (S1, S2, S3, S4);


signal ESTADO, ESTADO_SIG: ESTADOS;

A continuación creamos un proceso combinacional en el que se determina el


siguiente estado (ESTADO_SIG) y la salida S en función del estado actual (ESTADO, E).
El programa quedaría al final de la siguiente manera:

library IEEE;
use IEEE.std_logic_1164.all;

entity FSM is
port(reset, E, clk: in bit; O: out bit);
end FSM;

architecture ARCH of FSM is

type ESTADOS is (S1, S2, S3,S4);


signal ESTADO, SIG_ESTADO: ESTADOS;
begin

SINCRONO: process(clk,reset)

begin
if reset ='1' then
ESTADO<=S1;
elsif clk'event and clk='1' then
ESTADO<= SIG_ESTADO;
end if;
end process SINCRONO;

CONTROL: process(ESTADO,E)
begin
case ESTADO is
when S1 =>
O <= '0';
if (E='0') then
Laboratorio de Estructura de Computadores

SIG_ESTADO<=S2;
else
SIG_ESTADO<=S1;
end if;

when S2 =>
O <= '0';
if (E='0') then
SIG_ESTADO<=S3;
F
else
SIG_ESTADO<=S1;
end if;
when S3 =>
O <= '0'; G
if (E='0') then
SIG_ESTADO<=S3;
else
SIG_ESTADO<=S4;
end if;
when S4 =>
O <= '1';
if (E='0') then
SIG_ESTADO<=S2;
else
SIG_ESTADO<=S1;
end if;
end case;
end process control;
end ARCH;
Laboratorio de Estructura de Computadores

Este manual fue inicialmente creado para la asignatura de Diseño y Test de Circuitos Integrados II de la titulación de I. Electrónica

También podría gustarte