Vous êtes sur la page 1sur 62

Modelado y Simulacion VHDL 05-06

MODELADO Y SIMULACION EN VHDL 1. Unidades bsicas de diseo 1.1 Declaracin de entidad 1.2 Arquitectura 1.2.1 Estilo algortmico 1.2.2 Estilo flujo de Datos 1.2.3 Estilo estructural 1.2.4 Estilo mixto 1.3 Configuracin 1.4 Paquetes 1.5 Bibliotecas 1.6 Simulacin en VHDL 1.7 VHDL concurrente y secuencial 2. Objetos, tipos de datos y operaciones 2.1 Elementos lxicos 2.1.1 Identificadores 2.1.2 Palabras reservadas 2.1.3 Smbolos especiales 2.1.4 Literales 2.2 Objetos del VHDL 2.2.1 Constantes 2.2.2 Variables 2.2.3 Seales 2.2.4 Ficheros 2.3 Tipos de datos 2.3.1 Declaracin de tipos de datos 2.3.2 Tipos de datos escalares 2.3.3 Declaracin de subtipos de datos 2.3.4 Tipos de datos compuestos 2.3.5 Otros tipos de datos 2.4 Expresiones y operadores 2.5 Atributos 2.5.1 Atributos de rangos de vectores 2.5.2 Atributos de tipos de datos 2.5.3 Atributos de seales 2.5.4 Atributos definidos por el usuario
1

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

3. Sentencias secuenciales 3.1 La sentencia WAIT. 3.2 Asignacin a seal. 3.3 Asignacin a variable. 3.4 La sentencia IF. 3.5 La sentencia CASE. 3.6 La sentencia LOOP. 3.7 La sentencia EXIT. 3.8 La sentencia NEXT. 3.9 La sentencia ASSERT. 3.10 La sentencia RETURN. 3.11 La sentencia NULL 3.12 Llamada a Subprogramas 4. Sentencias Concurrentes 4.1 La sentencia PROCESS 4.2 Asignacin a seal concurrente 4.3 Asignacin concurrente condicional 4.4 Asignacin concurrente con seleccin 4.5 ASSERT concurrente 4.6 Llamada concurrente a subprograma 4.7 Sentencias estructurales 4.7.1 Componentes 4.7.2 Sentencia GENERATE 4.7.3 Configuracin de un diseo 4.7.4 Genricos 4.7.5 Sentencia BLOCK 5. Subprogramas 5.1 Funciones 5.2 Procedimientos

6. Bancos de pruebas

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1. UNIDADES BSICAS DE DISEO


Se trata de construcciones VHDL que se pueden analizar de forma independiente. Cinco tipos: 1. Declaracin de entidad (entity Declaration) 2. Arquitectura de una entidad (architecture). 3. Configuracin (Configuration) 4. Declaracin de paquete (Package declaration). 5. Cuerpo del paquete (Package body)

Estructura de un programa en VHDL

1.1 DECLARACIN DE ENTIDAD


Sirve para definir la interfase del dispositivo con el exterior. Una vez que se declaran se pueden almacenar en una biblioteca para poder ser utilizadas por otros diseos. Sintaxis: entity identificador is (genricos) (puertos) [declaraciones] [begin sentencias) end [entity) (identificador]:

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Los puertos de una entidad equivalen a las patillas de un circuito. Para cada puerto se debe indicar: Nombre: referencia al pin Tipo: clase de informacin que se transmite por el puerto Modo: in,out,inout y buffer .

La declaracin de una entidad que implementa un multiplexor de 2 bits sera: entity Mux2to1 is port ( a : in bit ; b : in bit; ctrl : in bit.; z : out bit); end;

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1.2 ARQUITECTURA
Sirve para definir la funcionalidad de la entidad que representa. Sintaxis: architecture identificador of identificador_entidad is [declaraciones] begin [sentencias concurrentes) end [architecturej [identificador]; El identificador es el nombre que va a recibir la arquitectura y que servir para referenciarla mas tarde. Declaracin para declarar constantes ,tipos de datos, seales.. Dependiendo del tipo de sentencias utilizadas se puede modelar una arquitectura siguiendo diferentes estilos: Estilo algortmico Estilo flujo de datos Estilo estructural 1.2.1 ESTILO ALGORTMICO: Define la funcionalidad del diseo mediante un algoritmo ejecutado secuencialmente. No hace ninguna referencia a la estructura que se seguir para implementar el algoritmo hardware. La arquitectura de Mux2to1 en estilo algortmico sera: architecture Algoritmico of Mux2to1 is begin process (a, b, ctrl) begin if (ctrl = '0') then z <= a; else z <= b; end if; end process; end Algoritmico;

1.2.2 ESTILO FLUJO DE DATOS: Refleja la funcionalidad un dispositivo mediante un conjunto de ecuaciones ejecutadas concurrentemente que determinan el flujo que van a seguir los datos entre los modelos encargados de implementar las operaciones. Existe una correspondencia directa entre el cdigo y su implementacin hardware.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Mux2to1 en estilo flujo de datos architecture FlujoDatos of Mux2to1 is signal ctrl_n, n1, n2 : bit; begin ctrl_n <= not (ctrl) after 1 ns n1 <= ctrl_n and a after 2 ns; n2 <= ctrl and b after 2 ns; z <= (n1 or n2) after 2 ns; end FlujoDatos;

1.2.3 ESTILO ESTRUCTURAL: Descripcin de un conjunto de componentes interconectados mediante seales (netlist). Primero se definen los componentes y despus se realiza una instanciacin. architecture Estructural of MUX2to1 is signal ctrl_n, n1, n2 : bit; component INV port ( y : in bit; z : out bit); end component; . component AND2 . port ( x : in bit; y : in bit; z : out bit); end component ; component OR2 port ( x : in bit; y : in bit; z : out bit); end component; begin U0: INV port map (ctrl, ctrl_n); U1: AND2 port map (ctrl_n, a, n1); U2: AND2 port map (ctrl, b, n2); U3: OR2 port map (n1, n2, z); end Estructural; 1.2.3 ESTILO MIXTO Estos estilos pueden mezclarse en la implementacin de una sola arquitectura

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1.3 CONFIGURACION
Selecciona la arquitectura que se quiere utilizar para una entidad concreta. VHDL permite definir varias arquitecturas para una misma entidad. Sintaxis: configuration identificador of identificador_entidad is for identificadcr_arquitectura { for (ref_componente {, ...} I others I all} : id_componente use entity id_entidad[(id arquitectura}; I use configuration id_configuracin; ] end for; } end for; end {configuration}[identificador}; Es necesario identificar la entidad y la arquitectura En una jerarqua pueden determinarse las entidades y arquitecturas que se van a utilizar para los componentes de mas bajo nivel

Ejemplo: Configuracin del multiplexor de 2 bits para trabajar con la arquitectura flujo de datos. configuration Mux2to1_cfg of Mux2to1 is for FlujoDatos end for; end Mux2to1_cfg Configuracion de un modelo jerrquico. Consideraciones: para los componentes usados en la implementacin de la entidad Mux2to1 a nivel estructural existe una entidad con el mismo nombre y una arquitectura llamada Algortmico almacenados en la biblioteca de trabajo. configuration Mux2to1_cfg of Mux2to1 is for Structural for U0 : INV use work.entity INV(Algoritmico); end for; for all:AND2 use work.entity AND2(Algoritmico); end for; for U3 : OR2 use work.entity OR2(Algoritmico); end for; end for; end Mux2to1_cfg;

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1.4 PAQUETES
Facilitan la reutilizacin y actualizacin del cdigo ya que permiten agrupar un conjunto de declaraciones para que puedan ser usadas por varios dispositivos sin ser repetida en la definicin de cada dispositivo. Se divide en dos unidades: declaracin y cuerpo: Declaracin: visin externa de los elementos que se declaran Cuerpo: define su implementacin. Sintaxis de la declaracin de un paquete Package identificador [declaraciones] end [Package ][identificador] Sintaxis del cuerpo del paquete Package body identificador is [declaraciones cuerpo] end [Package body] [identificador];

Ejemplo: Package RetardosOp is constant RetNOT : time; constant RetAND2 : time; constant RetOR2 : time; end RetardosOp; Package body RetardosOp is constant RetNOT : time:= 1ns; constant RetAND2: time:= 2ns; constant RetOR2 : time:= 2ns; end RetardosOp; Supongamos que el paquete RetardosOp se encuentra almacenado en la biblioteca Biblio La arquitectura del multiplexor de 2 bits tipo FlujoDatos se puede reescribir de la forma: architecture FlujoDatos of Mux2to1 is signal ctrl_n, n1. n2 : bit; begin ccrl_n <= not (ctrl) after Biblio.RetardosOp.RetNOT; n1 <= ctrl_n and a after Biblio.RetardosOp.RetAND2; n2 <= ctrl and b after Biblio.RetardosOp.RetAND2; z <= (n1 or n2) after Biblio.RetardosOp.RetOR2; end FlujoDatos;

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Para no tener que identificar la biblioteca cada vez que se utilice se usa: Use Biblio.RetardosOp.RetNOT; Si se utiliza mas de un elemento del paquete se utiliza la sentencia: Use Biblio.RetardosOp.all En el caso anterior, la descripcin de la arquitectura en estilo flujo de datos sera: use Biblio.RetardosOp.all architecture FlujoDatos of Mux2to1 is signal ctrl_n, n1, n2 : bit; begin ctrl_n <= not (ctrl) after RetNOT; n1 <= ctrl_n and a after RetAND2; n2 <= ctrl and b after RetAND2; z <= (n1 or n2) after RetOR2; end FlujoDatos; En VHDL existe un paquete llamado standard almacenado en una biblioteca llamada std que contiene tipos de datos bsicos.

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1.5 BIBLIOTECAS
Almacenan el resultado del anlisis de las unidades de diseo. El anlisis debe respetar un cierto orden, ya que unas unidades dependen de otras. Para el Mux2to1 un posible orden seria: Declaracion del paquete RetardosOp. Cuerpo del paquete RetardosOp Declaracion de la entidad Mux2to1 Arquitectura FlujoDatos de Mux2to1 Arquitectura Algortmico de Mux2to1 Arquitectura estructural de Mux2to1 Configuracin Mux2to1_cfg

La biblioteca work sirve por defecto como biblioteca de trabajo. Para dar visibilidad a una biblioteca se utiliza la sentencia library. Ejemplo library BibliotecaEjemplo; use BibliotecaEjemplo.PaqueteEjemplo.all; Las bibliotecas work y std no requieren la sentencia library ya que siempre son visibles La siguiente tabla presenta las bibliotecas y paquetes mas usados:

Library std std work ieee ieee ieee ieee ieee ieee

Descripcin Define tipos y subtipos bsicos de VHDL: standard boolean,bit,bit_vector,character,string,integer,real,time. Define los tipos de datos tales como line y text y textio procedimientos de lectura y escritura en archivos Librera de defecto donde se almacenan las entidades de diseo del usuario Define los tipos std_logic y std_logic_vector std_logic_1164 Define los tipos signed y unsigned as como operaciones numeric_std aritmticas para stos. Es el estndar formal. Define los tipos signed y unsigned as como operaciones std_logic_arith aritmticas para stos. Ha sido estndar de facto Define operaciones aritmticas con signo,operaciones de std_logic_signed conversin y de comparacin para std_logic_vector Define operaciones aritmticas sin signo,operaciones de std_logic_unsigned conversin y de comparacin para std_logic_vector Define los tipos de datos y procedimientos de lectura y escritura std_logic_textio en archivos para std_logic y std_logic_vector

Package

Por ejemplo para realizar operaciones con signo sobre objetos std_logic_vector se usaran las siguientes instrucciones: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all;
10

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1.6 SIMULACION EN VHDL El modelo de simulacin tiene que considerar que el hardware opera concurrentemente y que las salidas del sistema solo pueden cambiar si hay algn cambio en sus entradas (eventos). VHDL entiende cada sentencia concurrente (PROCESS, asignacin concurrente de seal, instanciacin de componentes, etc..), como un PROCESO y los procesos se comunican entre ellos por medio de seales.

Definiciones: Tiempo Total de simulacin (T) Tiempo durante el cual vamos a observar el funcionamiento de nuestro circuito (100 ns) Tiempo (actual) de simulacin (Tc) Tiempo especifico para el cual estamos realizando la simulacin por haberse producido un evento Supone un avance de tiempo fsico en el tiempo total de simulacin, su valor no es fijo ( Ti). Ciclo (paso) de simulacin () El tiempo fsico (simulacin) no avanza, es equivalente a un retardo infinitesimal necesario para la asignacin de seales y comunicacin entre procesos en un mismo instante.Separa la excitacin de la respuesta en un sistema fsico (causalidad).

1.5.1 El modelo de simulacin El modelo de simulacin est controlado por eventos. Los procesos son evaluados nicamente cuando haya cambios en las seales que los activan (eventos). Las seales son actualizadas despus de la ejecucin de una sentencia WAIT (dentro de la sentencia concurrente PROCESS) o despus de la ejecucin de cualquier sentencia concurrente.

11

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo 1. Modelado con 2 procesos. Resultado de la simulacin del diseo OR-AND anterior suponiendo los estmulos abajo a la izquierda indicados
ENTITY modelo_simula IS PORT (a,b,c:IN BIT; s: OUT BIT); END modelo_simula; ARCHITECTURE flujo OF modelo_simula IS SIGNAL I: BIT; BEGIN I <= a OR b; s<= I AND c; END flujo;

Resultados de la simulacin

12

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo 2. Modelado con 1 proceso


ENTITY modelo_simula IS PORT (a,b,c:IN BIT; s: OUT BIT); END modelo_simula; ARCHITECTURE flujo OF modelo_simula IS BEGIN s<= (a OR b) AND c; END flujo;

Resultados de la simulacin

En cualquier caso la simulacin de las funciones de onda es siempre la misma

13

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

1. 7 VHDL concurrente y secuencial VHDL es un lenguaje que aprovecha las ventajas del SW en general, pero adems ha de ser capaz de modelar el HW correctamente. Una de las diferencias mas importantes entre HW y SW es el carcter concurrente del primero y generalmente secuencial del segundo. Un programa se ejecuta normalmente en secuencia, es decir existe un orden en la ejecucin de las instrucciones. As , en el siguiente ejemplo C adquiere su valor final de 5 slo tras la ejecucin de las sentencias 1 y 2: Valores iniciales: Sentencia 1: Sentencia 2: Sentencia 3: A=B=C=0 A=1 B=4 C=A+B

Sin embargo este carcter secuencial no refleja adecuadamente el Hardware. Un circuito fsico funciona concurrentemente, es decir, todas sus partes estn activas simultneamente interaccionanado entre s a lo largo del tiempo. El mismo ejemplo anterior dara lugar a una evolucin temporal distinta si se supone una ejecucin concurrente: cuando el tiempo avanza una unidad, los valores de A y B cambian, pasando a 1 y 4, respectivamente pero C sigue en 0, dado que todas las sentencias se estn evaluando concurrentemente; en la unidad de tiempo posterior C adquiere finalmente el valor 5 . En definitiva: TIPO DE EJECUCION TIEMPO 0 1 2 3 A 0 1 1 1 SECUENCIAL B 0 0 4 4 C 0 0 0 5 A 0 1 1 CONCURRENTE B 0 4 4 C 0 0 5

VHDL admite descripciones en las que el cdigo se ejecuta o bien secuencialmente o bien concurrentemente.

14

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2. OBJETOS TIPOS DE DATOS Y OPERADORES


Un objeto VHDL es un elemento del lenguaje que tiene un valor de un tipo de datos concreto. Este tipo de datos determina el conjunto de valores posibles que el objeto puede contener as como la clase de operaciones que se podra aplicar. En general no ser posible realizar operaciones entre dos objetos de distinto tipo si no se le aplica explcitamente una funcin de conversin de tipo a los operadores.

2.1 ELEMENTOS LEXICOS


Antes de empezar a hablar de los objetos de VHDL resulta adecuado introducir los elementos lxicos del lenguaje que bsicamente son los identificadores, las palabras reservadas, los smbolos especiales y los literales. 2.1.1 IDENTIFICADORES:

Se usan para denominar elementos de VHDL No hay longitud mxima pero evitar nombres muy largos. Caracteres A a Z, a a z, 0 a /9/ y el carcter subrayado. No hay diferencia entre maysculas y minsculas. Deben empezar por un carcter alfabtico, no pueden terminar con subrayado y no pueden tener dos subrayados seguidos. No se permite utilizar palabras reservadas.

15

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.1.2 PALABRAS RESERVADAS

16

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.1. 3 SIMBOLOS ESPECIALES Tienen diferentes funciones que se irn analizando en puntos posteriores.

+ - / ( ).,:;& < > = | => ** := /= >= <= <> - -- se utiliza para introducir comentarios Cualquier sentencia VHDL debe terminar con ;

2.1.4 LITERALES Smbolos cuyo valor se obtiene directamente de la representacin

2.2 OBJETOS DE VHDL


Un objeto es un elemento que tiene asignado un valor de un tipo determinado. Un objeto debe declararse antes de ser utilizado. Los objetos pasan datos de un punto a otro del modelo VHDL. El tipo de dato del objeto define el conjunto de valores que el objeto puede asumir y el conjunto de operaciones que puedwen realizarse con esos valores.

2.2.1 CONSTANTES Es un objeto que mantiene siempre su valor inicial Sintaxis: Constant identificador {,}:tipo[:=expresin]; Ejemplos: constant Pi : real:= 3.1415927; constant Bitspalabra : integer := 8; constant NmeroPalabras : integer := 64; .
17

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

constant NmeroBits : integer := Bitspalabra * NmeroPalabras; constant RetardoAND2, RetardoOR2 : time: = 2 ns;

2.2.2 VARIABLES Objetos que pueden cambiar su valor mediante una sentencia de asignacin Sintaxis: variable identificador{,}: tipo[:=expresin]; Ejemplos: variable Indice1, Indice2, Indice3 : integer := 0; variable Resultado: real; Cambio de valor mediante una sentencia de asignacin: Identificador:=expresin; La declaracin de variables es local a un proceso.

2.2.3 SEALES Objetos que pueden modificar su valor y que tiene una analoga directa con el Hardware. Se utilizan para interconectar componentes de un circuito y para sincronizar la ejecucin y suspensin de procesos. Los objetos de esta clase contienen una lista de valores que incluye el valor actual y un conjunto de posibles valores futuros. Sintaxis: signal identificador {,}:tipo[:=expresin];. Se declaran en la arquitectura y no en la parte declarativa de un proceso como ocurre con las variables. Los puertos de una entidad son seales que se utilizan para interconectar unos dispositivos con otros. Sintaxis de los puertos: Port ({identificador {,}:direccin tipo[:=expresin];} signal Reloj: std_logic := '0'; signal Comparacion : bit; signal Resultado: integer range 0 to 7; port ( a, b : in integer range 0 to 7; c : out integer range 0 to 7; d : inout std_logic);

18

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Un puerto de salida slo puede ser utilizado como destino de una expresin: entity puerto is port (a,b : in bit; z,znot: out bit); end puerto architecture incorrecta of puerto is begin z<= a and b; znot <= not z; end incorrecta; architecture correcta of puerto is signal resultado:bit; begin resultado <= a and b; z <= resultado; znot <= not resultado; end correcta;

Las seales se modifican mediante sentencias de asignacin pero no se hace efectiva hasta que todos los procesos acaban su ejecucin para que en una simulacin el resultado no dependa del orden de ejecucin de los procesos.

FF1: process begin If CK=1 then Q1<=D1 end if; wait on CLK; end process FF1; FF2: process begin If CK=1 then Q2<=Q1 end if; wait on CLK; end process FF2; FF2 siempre recibe el valor correcto de FF1 ya que aunque se haya ejecutado antes FF1 la asignacin que este proceso realiza sobre Q1 no ha tenido lugar.

19

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

La simulacin de un modelo VHDL es una simulacin dirigida por eventos.

10ns 10ns +

20ns 20ns +

Actualiza seales Ejecuta procesos Actualiza seales Ejecuta procesos Actualiza seales Ejecuta procesos Actualiza seales Ejecuta procesos

Valor seales Cola de eventos D Q1 Q2 D Q1 Q2 (1) (0) (0) (1) 1 0 (1) 1 0 (0) 1 0 (0) 1 1 (0) 1 1 -

Ciclo de simulacin en VHDL 2.2.4 FICHEROS

Objetos que permiten comunicar un diseo VHDL con un entorno externo (fichero con datos de entrada o cargar datos de un fichero externo). Sintaxis: file identificador {,.}:tipo_fichero[is direccin nombre]; Ejemplos: file Estimulos : FicheroEnteros is in datos.in; file Salida: FicheroEnteros is out datos. out;

Sintaxis VHDL-93 file identificador {,.}: tipo[open tipo acceso] is nombre]; Tipo de acceso read_mode write_mode append_mode Ejemplos: file Estimulos : FicheroEnteros open read_mode is in datos.in; file Salida: FicheroEnteros open write_mode is datos. out;
20

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.3 TIPOS DE DATOS


Cada objeto declarado debe ser de un tipo concreto. VHDL tiene tipos definidos (boolean, bit, character, integer, natural, real, time, string, bit_vector) y permite declarar nuevos tipos.

21

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.3.1 DECLARACION DE TIPOS DE DATOS Sintaxis: type identificador is definicion tipo Ejemplos type DiaMes is range 1 to 31; type PuntosCardinales is (norte,sur,este,oeste); Ejemplo de objetos declarados con los tipos anteriores: Constant DiasEnero : DiaMes:31; variable DiaHoy : DiaMes; signal Direccion : PuntosCardinales; port (Entrada: in PuntosCardinales; Salida: out PuntosCardinales)

Aclaracin: type De1a31 is range 1 to 31 No es posible asignar el valor de un objeto tipo DiaMes a un objeto tipo De1a31 aun siendo iguales en su declaracin.

2.3.2 TIPOS DE DATOS ESCALARES Son aquellos cuyos valores estn formados por una sola unidad indivisible.

2.3.2.1 TIPOS ENTEROS Y TIPOS REALES

Definen un rango de nmeros enteros y reales. Sintaxis: Type identificador is range literal to\down literal;definicion tipo Ejemplos: type Precioproducto is range 1 to 1_000_000; type Puntuacion is range 0.0 to 10.0; variable PrecioMesa : PrecioProducto; variable MiNota : Puntuacion;

2.3.2.2 TIPOS FISICOS

Sirven para representar medidas como pueden ser distancia, tiempo o peso. Sintaxis: type identificador is range literal to downto literal units identificador; { identificador = literal_fsico; end units [identificador];
22

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

En VHDL el tipo fisico ms utilizado es el tiempo (time) declarado en el paquete estndar de la biblioteca std que sirve para especificar retardos. type time is range 0 to 1E20 units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; rns = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units; En tipos fsicos la suma, resta y la divisin estn permitidas. La multiplicacin no.

2.3.2.3 TIPOS ENUMERADOS Se define el conjunto de posibles valores del tipo especificado Sintaxis: type identificador is (identificador|carcter {,}; Ejemplos: type Comandos is (izquierda, derecha, arriba, abajo, disparar); type Teclas ('a', 'd', 'W', 'x', " ); type Mezcla ('a', izquierda 'd', derecha); Declaracin de objetos de estos tipos: variable ComandoActual : Comandos : = abajo; variable TeclaActual : Teclas := 'a'; En el paquete estndar de la biblioteca std se definen algunos tipos enumerados de uso comn: type boolean is (false, true); type bit is ('0', '1'); El paquete IEEE std_logic.1164 incluye el tipo std_ulogic type std_ulogic is U No inicializado 'X' Desconocido fuerte, cortocircuito en simulacin '0' 0 lgico fuerte, equivalente a GND '1' 1 lgico fuerte, equivalente a Vdd 'Z' Alta impedancia W Desconocido dbil L 0 lgico dbil, resistencias de pull-down H 1 lgico dbil, resistencias de pull-up - No importa, se sintetiza en 0 o en 1
23

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.3.3 DECLARACION DE SUBTIPOS DE DATOS Definen subconjuntos de los valores de un tipo. Se permiten operaciones entre tipos y subtipos. Sintaxis: subtype identificador is id tipo [range literal to|down literal];. Ejemplos de declaraciones de subtipos: subtype Diames is integer range 1 to 31; subtype Digito is character range '0' to '9'; type Decimal is ('0', '1', '2', '3', '4'. '5',6,7,8,9); subtype Octal is Decimal range ' 0' to ' 7 ' ; Se pueden declarar subtipos de datos implicitamente en el momento de declarar un objeto. variable MesActual:integer range 1 to 12;

2.3.4 TIPOS DE DATOS COMPUESTOS Son aquellos cuyos valores se pueden dividir en unidades atmicas mas pequeas: vectores y registros:
2.3.4.1 VECTORES:

Conjunto de objetos del mismo tipo ordenados mediante uno o mas ndices que indican posicin de cada objeto dentro de un vector. Sintaxis: type identificador is range (rango {,} of tipo_obj Vectores Restringidos Ejemplos: type Byte is array (0 to 7) of bit; type Byte2 is array (7 downto 0) of bit; subtype De0a7 is integer range 0 to 7; type Byte3 is array (De0a7) of bit; type PuntosCardinales is (norte, sur, este, oeste); type Estado is array (PuntosCardinales range norte to este) of integer; Objetos de tipo vector: variable Operador1 : Byte; variable Operador2 : Byte2; variable Operador3 : Byte3; variable Operador4, Operador5 : Byte4; variable EstadoActual : Estado; Operadorl(3) := '1'; Operador2 := 1001001; Operador3(3 to 6) :=100; Operador4('5') := '1'; Operador5 : = Operador4; EstadoActual(norte) := 35:
24

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Vectores multidimensionales type Memoria is array (0 to 7, 0 to 63) of bit; variable RamA, RamB: Memoria; RamA :=RamB RamA(4,7):=1;

Palabra reservada others: sirve para asignar un valor a todas las posiciones a las que aun no se les haya dado valor: constant Origen: Punto := (others => 0.0); Punto1 := (2 => 7.3, others => 2.5); Vectores no restringidos sin rango especfico. Los lmites se fijan posterioirmente, la declaracin est diferida hasta que se declara una seal o una variable de ese tipo. Sintaxis: type identificador is array (tipo_indice rango <> of tipo_objeto) Ejemplos. type VectorReales is array (natural range<> of real) subtype Punto: VectorReales (0 to 2); constant Origen: Punto: (0.0, 0.0, 0.0); variable Muestras: VectorReales(0 to 9); Tipos no restringidos proporcionados por VHDL type string is array (positive range <>).of character; type bit_vector is array (positive range <>) of bit; type std_ulogic_vector is array (positive range <> )of std_ulogic; Declaracin de objetos de los tipos anteriores variable Mensaje : string (1 to 50) := (others => ); variable Operador1 : bit_vector (7 downto 0) := 01101011; variable BusDatos : std_ulogic_vector (31 downto 0):= (others => 'Z');

2.3.4.2 REGISTROS Tipos de datos compuestos por unidades atmicas de distinto tipo. Sintaxis type idendificador is record identificador {, ...; }: tipo; {...} end record { identificador}; Ejemplos:
25

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

type Fecha is record Dia : integer range 1 to 31; Mes: integer range 1 to 12; An_o : integer range 0 to 2100; end record; variable Hoy, Ayer : Fecha;

2.3.5 OTROS TIPOS DE DATOS 2.3.5.1 Tipos de acceso VHDL proporciona, al igual que el resto de los lenguajes de programacin, apuntadores a estructuras de datos dinmicas. Sintaxis: Type identificador is access tipo_datos Ejemplo type ApuntaEnteros is access integer; variable Entero_Ap: ApuntaEnteros

Para crear un nuevo objeto: Entero_Ap:= new integer; Para desalojar la memoria ocupada cuando ya no se requiere el objeto: deallocate(Entero_Ap)

2.3.5.2 Tipos fichero Un objeto fichero se utiliza en VHDL para almacenar datos de un tipo determinado. Antes de poder trabajar con un fichero es necesario declarar un tipo fichero que indique la naturaleza de los objetos que se van a almacenar. Sintaxis: Type identificador is file of tipo_objetos: Ejemplos: type FicheroEnteros is file of integer; file Estimulos:FicheroEnteros is in datos.in;

En la biblioteca std se define el paquete textio que proporciona el tipo fichero de texto y los subprogramas de lectura y escritura para trabajar con este tipo de ficheros. Concretamente define los dos tipos siguientes: type line is access string; -- apuntador a cadena de caracteres type text is file of string; -- conjunto de cadena de caracteres

26

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.4 EXPRESIONES Y OPERANDOS


Expresiones: frmula que indica la forma como debe calcularse un valor mediante operandos. En la tabla de abajo se muestran los Operadores predefinidos ordenados por orden descendiente de precedencia.

ejemplos: 011001 & 000111 011001000111 ; 000111 sll 2011100; 000111 sla 2011111; 000110 sla 2011000
011001 ror 3001011; 27

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.5 ATRIBUTOS
Caracterstica que se puede asociar a cualquier elemento de un modelo VHDL. El atributo de un objeto es diferente al valor que toma el objeto. Un objeto tiene un valor particular en un momento dado pero puede tener muchos atributos. Sintaxis: Identificador_elementoidentificador_atributo

2.5.1 ATRIBUTO DE RANGO DE VECTORES

Ejemplo: signal linea: bit_vector (15 downto 0) of bit; type tabla is array (1 to 5, 7 downto 0) of bit; signal matriz:tabla; linealeft lineahigh -- devuelve 15; linearight linealow -- devuelve 0; linearange -- devuelve 15 downto 0; lineareverse_range -- devuelve 0 downto 15; linealenght -- devuelve 16; matrizleft(1) -- devuelve 1, matrizleft(2) -- devuelve 7; matrizlenght(2) -- devuelve 8; matrizright(1) -- devuelve 5, matrizright(2) -- devuelve 0; matrizascending(2) -- devuelve false; Se aconseja utilizar atributos para hacer el cdigo mas portable type Palabra: bit_vector(0 to 7); signal Dato: Palabra; process (Dato) begin for i in 0 to 7 loop if Dato(i) = ... ... end loop; end process; type Palabra: bit_vector(0 to 7); signal Dato: Palabra; process (Dato) begin for i in Datorange loop if Dato(i) = ... ... end loop; end process;

con lo que un cambio en el rango de tipo palabra no provoca ninguna modificacin en el bucle

28

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

2.5.2 ATRIBUTOS DE TIPOS DE DATOS.

Ejemplos: type DIAS is (L,M,X,J,V,S,D); DIASleft=DIASlow=L; DIASright=DIAShigh=D; DIASpos(L) devuelve 1; Integerleft devuelve -231; natualleft devuelve 0;

2.5.3

ATRIBUTOS DE SEALES

Los atributos de seales delayed, stable, quiet y transaction devuelven una seal, mientras que los dems atributos siempre devuelven un valor de un tipo de datos, los mas comunes son el tipo fsico time y el tipo boolean.

29

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo de atributos de seales:

2.5.4

ATRIBUTOS DEFINIDOS POR EL USUARIO

VHDL permite definir atributos que se pueden asociar a cualquier elemento del lenguaje. Siempre son estticos (ctes). Sintaxis de Declaracin de un atributo attribute identificador:tipo_datos; Sintaxis de Especificacin de un atributo attribute identificador of id_elemento:clase_elemento is expresion;

La utilizacin sera: Identicador_elementoidentifcador_atributo

Ejemplo: signal Reloj:std_logic; attribute NumeroPin:natural; attribute NumeroPin of reloj:signal is 5; . RelojNumeroPin

30

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

3. SENTENCIAS SECUENCIALES
Se utilizan para modelar la funcionalidad de un componente. Pueden encontrarse en los procesos o en los cuerpos de los subprogramas. Tipos: Sentencias de asignacin Sentencias condicionales: if, case Sentencias iterativas: loop, exit, next Otras sentencias: wait, assert, null Llamadas a subprogramas 3.1 SENTENCIA WAIT Se utiliza para la suspensin de un proceso. Sintaxis: [etiqueta:] wait [on seal {,...)] [until expresin_booleana) [for expresion_tiempo ] Varias formas de utilizacin de la sentencia wait Sin ningn tipo de condicin: cuando el proceso llega a la sentencia wait se suspender indefinidamente. process begin sentencias_secuenciales wait; end process; Con lista de seales: esta forma establece a qu seal es sensible el proceso. Cuando en alguna de las seales se produzca un evento, el proceso se despertar. process begin c <= a and b; wait on a, b; end process;

Al suspender un proceso podemos fijar una condicin de reactivacin: wait until process begin q <= d; wait until Reloj='1'; end process;

31

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Al suspender un proceso se puede especificar un tiempo antes de que ste se reactive: wait for process begin Reloj <= not Reloj; wait for 10 ns; end process;

Se pueden mezclar las distintas opciones de la sentencia wait wait on a, b until c=1 wait on a, b for 10 ns

3.2 ASIGNACION A SEAL Se proyecta un valor en la cola de eventos que se actualiza cuando termina el proceso. Sintaxis: [etiqueta:]nombre..seal<=valor {after expresion tiempo} Ejemplo Process begin a <=b; b <=a; wait on a,b; end process; La asignacin a seal depende del modelo de retardo. VHDL permite escoger entre dos tipos de retardos: el transporte (transport) y el inercial (inertial) El modelo transporte propaga cualquier cambio que se produzca, mientras que el inercial filtra aquellos cambios de duracin inferior a un mnimo. Este es mas adecuado para modelar componentes y puertas en tanto que el de transporte es adecuado para modelar cableado. Sintaxis: nombre_seal <= [transport] valor [after expresin_tiempo]

32

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

33

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Veamos comportamientos peculiares cuando existen sucesivas asignaciones: Ejemplo del modelo transporte

Ejemplo del modelo inercial

34

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Cuando no se utiliza ningn modelo de propagacin en particular retardos infinitesimales son automticamente insertados por el Simulador para preservar la correcta ordenacin de los eventos. A este modelo se le conoce como Delta Delay.

In2 <= x s2 <= In2+In1 s3 <= In2-In1 Z <= s3

-- en t=10 se produce la asignacin

35

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

3.3 ASIGNACION A VARIABLE Se utiliza para reemplazar el valor actual de la variable por el valor especificado por una expresin. Sintaxis: [etiqueta:] nombre_variable:=expresion; La asignacin a variable no tiene ningn retardo asociado; la variable toma el valor en el momento de la asignacin. Consideraciones: Las variables son locales a los procesos o subprogramas donde se declaran. Las variables declaradas en un proceso nunca se reinicializan. Las variables definidas en un subprograma se reinicializan cada vez que se llame al subprograma. Diferencia entre variable y seal: Solo usaremos variables para modelos no sintetizables y en entornos de test o para describir circuitos aritmticos de forma iterativa, en ndices de bucles. Las seales se acercan mas al HW.

36

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Vemoslo simulado: Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity seniales is -- port () end seniales ; architecture arq_seniales of seniales is signal A:std_logic_vector(2 downto 0):="000"; signal B:std_logic_vector(2 downto 0):="001"; signal C:std_logic_vector(2 downto 0):="010"; signal X:std_logic_vector(2 downto 0):="011"; signal clk: bit:='0'; begin clk <= not clk after 10 ns; process begin wait until clk='1'; A<=B+C; X<=A+C; A<=X+C; end process; end arq_seniales ;

37

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

3.4 LA SENTENCIA IF Se utiliza para escoger en funcin de alguna condicin qu sentencia debe ejecutarse. Sintaxis: if condicion then sentencias_secuenciales {elsif condicion then sentencias_secuenciales} {else sentenclas_secuenciales} end if; Formas de utilizacin: Evaluacin de una nica condicin que permite o la ejecucin de una instruccin o de un conjunto de ellas. Ejemplo: Latch con entrada de datos (Dato) y seal de carga (Carga). entity Latch is port(Carga, Dato: in bit; biestable: out bit); end Latch; architecture Ejemplo of Latch is begin process begin if Carga=1' then Biestable <= Dato; end if; wait on Carga, Dato; end process; end Ejemplo; Seleccin entre dos grupos de sentencias a ejecutar, dependiendo de una condicin. Ejemplo:Modelado de un buffer triestado. entity Triestate is port( Habilitacion, entrada: in std_logic: Salida: out std_logic): end Triestate architecture Ejemplo of Triestate is begin process begin if Habilitacion='1' then Salida <= Entrada;
38

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

else Salida <= 'Z'; end if: wait on Habilitacion, Entrada; end process; end Ejemplo;

Seleccin entre dos o mas conjuntos de sentencias, cada una de ellas en funcin de distintas condiciones. Latch anterior con seal de inicializacin (Iniciar) process begin if Iniciar=0' then Latch <= '0' elsif carga=' 1' then Latch <= Dato; end if; wait on Iniciar, Carga, Dato; end process;

3.5 SENTENCIA CASE Los valores especificados para la seleccin en la sentencia case deben cumplir dos condiciones: Nunca puede haber una interseccin entre el rango de valores especificados en dos opciones distintas de la sentencia case. La unin de todos los valores especificados debe cubrir todos los valores posibles que pueda tomar la variable de seleccin.

Se puede especificar dos o mas valores dentro del rango de posibles valores que puede tomar la expresin de seleccin usando la unin lgica (|). Ejemplo: Multiplexor de tres entradas. process begin case Seleccion is when 00 | 01 => Salida <= Entrada1; when 10 => Salida <= Entrada2; when 11 => Salida <= Entrada3; end case; wait on Seleccin, Entrada1, Entrada2, Entrada3; end process;
39

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Se puede especificar un rango dentro de los valores posibles de la expresin de seleccin que en este caso deben tomar valores discretos. Ejemplo: multiplexor de dos Entradas: process begin case Seleccion is when "a to c => Salida <= Entradal; when d => Salida <= Entrada2; end case; wait on Seleccion, Entradal, Entrada2; end process; Se puede especificar como valor de seleccin la palabra clave others que debe ser la ltima process begin case Seleccion is when "a to c => Salida <= Entradal; when others => Salida <= Entrada2; end case; wait on Seleccion, Entradal, Entrada2; end process;

3.6 LA SENTENCIA LOOP Se utiliza para ejecutar un grupo de sentencias secuenciales de forma repetida. Sintaxis: [etiqueta]: [while condicion_booleana for control repeticion] loop sentencias secuenciales end loop [etiqueta];

40

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo de bucle infinito: contador de cuatro bits con valor inicial entity Contador_0_15 is port( Reloj: in bit; Cuenta: out natural); end Contador_0_15; architecture Ejemplo of Contador_0_15 is signal Contador: natural; begin process begin Contador <= 0; loop wait until Reloj='1'; Contador <= (Contador + 1) mod 16; end loop ; end process; Cuenta <= Contador; end ejemplo; Se puede definir una condicin de finalizacin mediante la sentencia while condicin_booleana.

Ejemplo: contador anterior sin usar la funcin mod process begin Contador <= 0; wait until Reloj='1'; while Contador < 15 loop Contador <= Contador + 1; wait until Reloj='l'; end loop; end process; Para controlar el nmero de iteracciones de la sentencia loop podemos utilizar la sentencia for process begin Contador <= 0; for I in 0 to 15 loop wait until Reloj =1; Contador <= Contador + 1; end loop; end process;

41

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

3.7 LA SENTENCIA EXIT Se utiliza para terminar la ejecucin de un bucle Sintaxis: [etiqueta] exit [etiqueta_loop] [when condicin_booleana]

La sentencia exit puede ir acompaada de dos opciones: La primera permite expresar una condicin que si se cumple, finaliza la ejecucn del lazo pasando a ejecutar la primera sentencia que se encuentre a continuacion. La segunda opcin permite especificar la etiqueta de una sentencia loop de forma que la ejecucin de exit fuerza la terminacin de bucle correspondiente a la etiqueta.

Ejemplo: Contador mdulo 16 con seal de inicializacin (Inicio) entity Contador_0_15 is port ( Reloj, Inicio: in bit; Cuenta: out natural); end Contador_0_15; architecture Ejemplo of Contador_0_15 is signal Contador: natural; begin process begin Contador <= 0; loop wait until (Reloj='1' and Reloj'event) or Inicio='0'; exit when inicio:' 0' ; Contador <= (Contador + 1) mod 16; end loop; end process; Cuenta <= Contador; end Ejemplo;

Ejemplo. Contador de 16 bits con Inicio y Carga process begin Contador <= 0; Carga_Datos: loop Incremento: loop wait until (Reloj='1' and Reloj'event) or Carga='1' or Inicio='0'; exit Carga_Datos when Inicio='0'; exit Incremento when Carga=' 1 ' ; Contador <= (Contador + 1) mod 16;
42

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

end loop Incremento; wait until Reloj='1'; if Carga=' 1' then Contador <= Datos; end if; end loop Carga_Datos; end process;

3.8 SENTENCIA NEXT Se utiliza para detener la ejecucin de una sentencia loop y pasar a la siguiente iteraccin de la misma Sintaxis: [etiqueta:] next [etiquea_loop] [when condicion booleana] Ejemplo: contador modulo 16 que no cuenta el valor 8 process begin Contador <= 0; for I in 0 to 15 loop next when i=8; Contador <= I; wait until Reloj:'1'; end loop; end process;

3.9 SENTENCIA ASSERT Permite reportar mensajes en funcin de si una determinada condicin se cumple o no, tambien permite interrumpir la simulacin en funcin de dicha condicin. Sintaxis: [etiqueta:] assert expresion_booleana [report cadena_caracteres} [expresion_severidad] La utilidad principal de esta sentencia estriba en ayudar a depurar un modelo de tiempo de simulacin. La expresin de severidad debe ser del tipo severity_level definido en el paquete standard. Este tipo enumerado puede tomar cuatro valores: note, warning, error, failure. Ejemplo: Comprobacin de tiempos en el modelado de dispositivos secuenciales. Modelado de un biestable process variable Inicio_Pulso: time; begin case Reloj is when '1' => q <= d; Inicio_Pulso := now; when '0' =>
43

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

assert (now - Inicio_Pulso) >= 5 ns report (pulso de reloj menor de 5 ns) severity warning; end case; wait on Reloj; end process;

3.10 SENTENCIA RETURN Se utiliza para terminar la ejecucin de un subprograma Sintaxis: [etiqueta:] return [expresion] La terminacin de los procedimientos no necesitan expresin alguna

3.11 SENTENCIA NULL Se utiliza para indicar que no se debe realizar ninguna operacin. Sintaxis: [etiqueta:] null Ejemplo de la sentencia null complementando a la sentencia case. case Valor is when 0|1 => null; when others => Valor: = Valor mod 2; end case; 3.12 LLAMADAS A SUBPROGRAMAS los subprogramas (procedimientos y funciones) que tengamos definidos en alguna parte del cdigo pueden ser llamados para su ejecucin en cualquier parte de un cdigo secuencial. Sintaxis de llamada a un procedimiento: [etiqueta:] nombre_procedimiento [{parmetros}]; Sintaxis de llamada a una funcin: nombre_funcin [{parmetros}];

44

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

4. SENTENCIAS CONCURRENTES
Sentencias concurrentes son aquellas que se ejecutan en paralelo. El oden en que se escriben es indiferente ya que no siguen un orden de ejecucin predefinido. Sirven para especificar: Estructuras jerrquicas Transferencias entre registros o Flujos de datos Interconexiones entre componentes Estructuras regulares 4.1 SENTENCIA PROCESS Un proceso es una sentencia concurrente que define su comportamiento a travs de sentencias secuenciales. Sintaxis: [etiqueta:] process [(lista de sensibilidad)] declaraciones --No se pueden declarar seales begin sentencias_secuenciales; end process; Se trata de un bucle infinito que al llegar a su final (end process) vuelve a su principio (begin). La ejecucin del proceso se detiene al llegar a la sentencia wait Ejemplos: process begin sentencias secuenciales; wait on lista de sensibilidad; end process; process (lista sensibilidad) begin sentencias secuenciales; end process;

Simulacin de un proceso con lista de sensibilidad y con sentencia wait

45

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

4.2 ASIGNACIN A SEAL CONCURRENTE Equivalente a la asignacin secuencial a seal excepto que se encuentra en las arquitecturas (architecture) en lugar de encontrarse en procesos o subprogramas Sintaxis: [etiqueta] nombre_seal<=[transport] forma_onda; La asignacin concurrente es sensible a las seales que se encuentran a la derecha de la asignacin. Por ello: a<=b; es equivalente a: process(b) begin a <= b; end process; 4.3 ASIGNACIN CONCURRENTE CONDICIONAL Se trata de una forma compacta de expresar asignaciones a seal similar a la sentecia if. Sintaxis: [etiqueta:] nombre_seal < = [ transport ]{forma_onda when expresion_booleana else} {forma_onda [when expresion_booleana}; El valor que se asigna a la seal es el que se especifica en condicin que se cumple. Ejemplo:modelado de un multiplexor 2-1 y proceso equivalente Salida <= Entrada1 when Sel='0' else Entrada2; Process (Sel,Entrada1,Entrada2) begin if Sel='0' then Salida <= Entrada1; else Salida <= Entrada2; end if; end process;

4.4 ASIGNACION CONCURRENTE CON SELECCION Se trata de una forma compacta de expresar asignaciones a seal utilizando la sentencia case. Sintaxis: [etiqueta: ] with expresion select nombre_seal <= (forma_onda when valor) (foma_onda when valor;} La forma de onda que se asigna a la seal es la que se especifica en la opcin correspondiente al valor que toma la expresin de seleccin.
46

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo: Modelado de una ALU. with Operacion select result <= Op1 + Op2 when suma, Op1 - Op2 when resta, Op1 and Op2 when andl, Op1 or Op2 when orl, Proceso equivalente a la asignacin process (Op1, Op2, Operacion) begin case Operacion is when suma => Result <= Op1 + Op2; when resta => Result <= Op1 -Op2; when andl => Result <= Op1 and Op2; when orl => Result <= Opl or Op2; end case; end process;

4.5 ASSERT CONCURRENTE Semejante a la sentencia assert secuencial. Sintaxis: [etiqueta:] assert expresion_booleana [report expresion] [ expresion_severidad] ;

4.6 LLAMADA CONCURRENTE A SUBPROGRAMA Llamada a subprograma, que puede existir por s sola en una arquitectura, y que se ejecuta cada vez que se produce un evento en alguno de sus parmetros. Sintaxis de la llamada a procedimiento (procedure) [etiqueta:] nombre_procedimiento [{parametros,}]; Sintaxis de la llamada a funcin (function) nombre_funcin [{parametros}]

47

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

4.7 SENTENCIAS ESTRUCTURALES Sentencias concurrentes dedicadas a la descripcin estructural del HW.

4.7.1 COMPONENTES:

Para realizar la descripcin estructural hay que definir los componentes y las interconexiones entre ellos. Sintaxis de la declaracin de un componente: component nombre_componente [is] [generic (lista_generic);} [port (lista_puetos);] end component [nombre_componente]; Una vez declarado el componente se puede realizar tantas copias como se quiera. La referencia a un componente es una sentencia concurrente que se ejecutar en paralelo con las dems sentencias concurrentes cada vez que se produzca un evento en algunas de las seales conectadas a sus puertos de entrada La sintaxis de la referencia a componente es: etiqueta_referencia: nombre_componente [generic map (lista_asc.);] [port map (lista_asociacin);] Ejemplo: Modelado de un sumador completo de un bit a partir de dos semisumadores de un bit. entity SumadorCompleto is begin port (X, Y, CIn : in bit; COut, Sum : out bit;); end SumadorCompleto; architecture Estructura of SumadorCompleto is component Semisumador port (I1, 12 : in bit; COut, Sum : out bit); end component component PuertaOr port (I1,I2: in bit; O : out bit); end component; signal A, B, C : bit; . begin U1 : Semisumador port map (X, Y, A, B); U2 : Semisumador port map (B, CIn, C, Sum); U3 : PuertaOr port map (A, C, Cout); end Estructura;

48

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

En el ejemplo anterior, los puertos locales se asocian posicionalmente a los puertos actuales. Una segunda forma es ms explcita: U2: semisumador port map (I1=>B, I2=>Cin, Cout=>C, Sum=>Sum); U2: semisumador port map (Cout=>C, I1=>B, I2=>Cin, Cout=>C); Usando la palabra clave open podemos dejar los puertos de salida desconectados. VHDL-93 permite referenciar un componente sin necesidad de haberlo declarado con anterioridad. La sintaxis de referencia a componente en este caso es:

Sintaxis: etiqueta_referencia: entity nombre_entidad [(nombre_arquitectura)][generic map (lista gen.)][port map (lista puertos);] La arquitectura del ejemplo del sumador completo puede escribirse de la siguiente forma: architecture Estructura of SumadorCompleto is signal a, b, c : bit; begin Ul : entity work.Semisumador port map (X, Y , A, B); U2 : entity work.Semisumador port map (B, CIn, C, Sum); U3 : entity work.PuertaOr port map (A, C, COut); end estructura; VHDL-93 pemite especificar la arquitectura a utilizar en la misma referencia al componente. U1 : entity work.Semisumador(Funcional) port map (X, Y, A, B); U2 : entity work.Semisumador (Estructural) port map (B, Cin, C, Sum); U3 : entity work.PuertaOr (Logica) port map (A, C, COut);

49

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

4.7.2 SENTENCIA GENERATE

Forma compacta de realizar descripciones que se basan en la repeticin de la misma estructura. Sintaxis: Etiqueta_generate:{ [for especificacion_for if condicion]} generate {sentencias concurrentes} end generate;

Ejemplo: registro de N bits formado a partir de N biestables tipo D. entity Registro is generic (N : positive); port( Reloj: in bit; Entrada: in bit_vector (0 to N-1); Salida: out bit_vector (0 to N-1)); end Registro; architecture Estructura of Registro is component DFF port (Reloj, D:in bit: Q: out bit): end component begin GeneraRegistro : for I in 0 to N-1 generate Reg : DFF port map (Reloj, Entrada(I) , Salida(I) end generate; end Estructura;

Ejemplo: Registro de Desplazamiento de n bits entity RegistroDesplazamiento is generic (N : positive); port( Reloj: in bit; SIn: in bit; SOut : out bit); end RegistroDesplazamiento; architecture Estructura of RegistroDesplazamiento is component DFF port (Reloj, D: in bit; Q: out bit); end component; signal X : bit_vector(0 to N-2); begin GeneraRegistro : for I in 0 to N-1 generate 61: if (I=0) generate CIzq: DFF port map (Reloj, SIn, X(I)); end generate; 62: if ((I>0) and (I<N-1)) generate
50

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

CCen : DFF port map (Reloj, X(I -1), X(I)); end generate; 63: if (I=N-1) generate CDer : DFF port map (Reloj, X(I -1), SOut); end generate; end generate; end Estructura;

4.7.3 CONFIGURACIN DE UN DISEO

Permite relacionar una entidad y su arquitectura. La configuracin de un diseo puede aparecer en dos entornos distintos: En una arquitectura: especificacin de la configuracin En una unidad de diseo independiente: declaracin de la configuracin. Sintaxis: for (ref_camponente {, ...} | others | all) : id_componente use entity id_entidad [ (id_arquitectura); { use configuration id_configuracin; } Ejemplo especificacin de la configuracin en el Sumador completo architecture Estructura of SumadorCompleto is ... declaracin de los componentes ...

for all : Semisumador use entity work.Semisumador(Estructural); for U3 : PuertaOr use entity work.PuertaOr (Logica) ; begin U1 : Semisumador port map (X, Y, A, B); U2 : Semisumador port map (B, CIn, C, Sum); U3 : PuertaOr port map (A, C, COut); end Estructura;

La configuracin usada como una unidad de diseo independiente se denomina declaracin de configuracin y su sintaxis es: configuration identificador of identificador_entidad is for identificador_arquitectura {for (ref_componente {, ...} | others I all) : id_componente use entity id_entidad [(id_arquitectura); use configuration id_configuracin;] end for; } end for; end [ configuration] [identificador];
51

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo declaracin de la configuracin en el Sumador completo configuration Primera of SumadorCompleto is for Estructura for U1 : Semisumador use entity work.Semisumador(Estructural); end for; for others : Semisumador use configuration work.Funcional; end for; for all : PuertaOr use entity Puertas.PuertaOr3 (Logica) ; port map(A=>I1, B=>I2, C=>'0', Y=>0); end for; end for; end Primera;

4.7.4 GENRICOS

VHDL permite generalizar un modelo aadiendo unos parmetros llamados genricos. El usuario fija el valor que deben tomar los genricos cuando el modelo se usa como un componente. Para que un modelo sea genrico hay que incluir en la entidad del mismo la clusula generic

Ejemplo: puerta or con tres parmetros genricos: - Tiempo de propagacin intrnseco de la puerta. - Retardo debido a la carga - Carga a la salida de la puerta entity ORN is generic (Retlner : time := 1 ns; RetCar : time := 0.2 ns; Carga: real := 0.25); port ( Entradas: in bit_vector; Salida: out bit); end ORN; architecture Funcional of ORN begin process (Entradas) variable Resultado: bit := '0'; begin for i in entradas'range loop if Entradas (i) =' 1' tben Resultado :='1'; exit; end if; end loop; Salida <= Resultado after (RetIner + (RetCar * Carga)); end process; end Funcional

52

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Utilizacin del modelo como componente PuertaOr : ORN generic map (2 ns, 0.4ns, 0.5) port map (VectEnt, Salida); La clusula generic map se utiliza para dar valores a un modelo utilizado como componente.

53

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

4.8 SENTENCIA BLOCK Varios usos: Se utiliza para agrupar sentencias concurrentes de manera que puedan compartir localmente declaraciones y objetos que sern visibles solamente dentro del cuerpo del block. Adems permite declarar un interfaz explcito entre el cuerpo del block y el resto de las sentencias concurrentes de la arquitectura. Permite el anidamiento con lo que se consigue jerarqua, aunque casi no se usa. Tambien permite realizar asignaciones a seal guardadas

Sintaxis: etiqueta: block [expresion-guarda] [is] -- la etiqueta es obligatoria [generic (lista-genricos); [generic map (lista_asociacin_genricos);] [port (lista_puertos); [port map (lista_asociacion_puertos);}] {parte declarativa} begin {sentencias concurrentes} end block [ etiqueta];

Su capacidad de reutilizacin es bastante limitada en comparacin con los componentes. Ejemplo de sentencia block con condicin de guarda.

54

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo del uso de la sentencia block como agrupamiento de sentencias concurrentes

entity A is port(clk,rst,x:in bit;z:out bit); end A; architecture dataFlow of A is signal y1,y0:bit; begin secuencial: block(clk='1' and not clk'stable) or rst='1') begin y1<=guarded '0' when rst='1' else x; y0<=guarded '0' when rst='1' else '1'; end block secuencial; combinacional: z <= y0 and ((not y1 and not x) or (y1 and x)); end dataFlow;

55

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo de anidamiento de sentencias block:

entity B is port(clk,rst,y2,y1:in bit;z:out bit); end B; architecture cajaBlanca of B is signal xint:bit; begin glue_logic:xint <=y2 and y1; instancia: block port(clk,rst,x:in bit;z:out bit); port map(clk,rst,xint,z); signal y1,y0; begin secuencial: block(clk='1' and not clk'stable) or rst='1') begin y1<=guarded '0' when rst='1' else x; y0<=guarded '0' when rst='1' else '1'; end block secuencial; combinacional: z<=y0 and ((not y1 and not x) or (y1 and x)); end block instancia; end cajaBlanca;

56

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

5. SUBPROGRAMAS
Se utilizan para escribir algoritmos reutilizables Caractersticas: Consta de una parte declarativa donde se definen las estructuras de datos locales al subprograma y una parte de sentencias secuenciales. Disponen de una lista de parmetros que se usa para especificar sobre qu datos externos al subprograma se debe implementar su funcionalidad. La definicin de un subprograma consta de dos partes: - Definicin del subprograma: se indica el nombre y su lista de parmetros. - Definicin del cuerpo: contiene la definicin de las estructuras de datos locales a ste y el algoritmo que realiza.

VHDL ofrece dos tipos de subprogramas Funciones Procedimientos

5. 1 FUNCIONES

Estn orientados a realizar clculos. Se utilizan para definir nuevos operadores que pueden aparecer en una expresin.

Sintaxis: Sintaxis para la definicin de una funcin function nombre_funcion ( lista-Parametros) return tipo_retorno Sintaxis para la definicin del cuerpo de una funcin function nombre_funcion [( lista-Parametros)] return tipo_retorno is {parte_declarativa} -- no se pueden declarar seales porque se reinicializa cada vez que es - llamado begin {sentencias secuenciales} end [function] [nombre_funcion]

Los parmetros formales de una definicin solamente pueden ser del tipo in y la clase de objetos que pueden formar parte de dichos parmetros, por defecto se asume que son constantes. En las sentencias secuenciales debe haber al menos, una sentencia return y no debe aparecer ninguna sentencia wait.

57

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo: Funcin que convierte un dato de tipo bit, vector sin signo en natural equivalente: Definicin de la funcin: function bv_to_natural (S: bit_vector(0 to 7)) return natural; Declaracin del cuerpo de la funcin function bv_to_natural(S: bit_vector(0 to 7)) return natural is variable Resultado: natural := 0; begin for I in 0 to 7 loop Resultado := Resultado * 2 + bit'pos (S(i)); end loop; return Resultado; end function bv_to_natural;

La llamada a una funcin no es una sentencia en si misma sino que forma parte de una expresin.

process variable Entrada: bit_vector (0 to 7); variable Salida: natural; begin ... Salida := bv_to_natural (Entrada); end process;

5.2 PROCEDIMIENTOS

Se utilizan para realizar cambios en los datos que tratan. Sintaxis: Sintaxis para la declaracin de un procedimiento. procedure nombre_procedimierlto [(lista_parametros)] Sintaxis de la definicin del cuerpo. procedure nombre_procedimiento [(lista_parametros)] is [parte_declarativa] -- no se pueden declarar seales, porque se reinicializa cada begin --vez que es llamado [sentencias secuenciales] end [procedure} [nombre_procedimiento] Los parmetros formales de un procedimiento pueden ser de tres tipos: in, out e inout. Un procedimiento retomar el flujo del programa al lugar donde fue llamado al llegar al final del mismo (sentencia end). Se puede usar la sentencia return para salir antes de llegar al final. Puede aparecer la sentencia wait
58

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

Ejemplo: procedure bv_to_natural ((S: bit_vector(0 to 7); X: out natural) is variable Resultado: natural := 0; begin for I in 0 to 7 loop Resultado : = Resultado *2 + bit 'pos(s(i)) end loop; X := Resultado; end procedure bv_to_natural;

Una vez definido se puede llamar utilizando las llamadas a procedimientos secuenciales o concurrentes. process variable Entrada: bit_vector (0 to 7); variable Salida : natural; begin ... bv_to_natural (Entrada, Salida); end process;

59

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

6. Bancos de pruebas
Un banco de pruebas es una entidad de diseo que engloba nuestro diseo y que se utiliza para verificar la correccin funcional de ste. Como slo es necesario para simulacin, se pueden usar construcciones no sintetizables. Elementos de un banco de Pruebas: Entidad a Testear (EUT) Generador de estmulos. stos se aplican a los puertos de entrada de la EUT. Monitor de resultados. Los resultados se pueden representar grficamente o volcarse a un archivo de datos para su posterior procesado.

Ejemplo Decodificador 2 a 4
library ieee; use ieee.std_logic_1164.all; entity DECODER is port( Entrada: in std_logic_vector(1 downto 0); Salida: out std_logic_vector(3 downto 0)); end DECODER; architecture behv of DECODER is begin process (Entrada) begin case Entrada is when "00" => Salida <= "0001"; when "01" => Salida <= "0010"; when "10" => Salida <= "0100"; when "11" => Salida <= "1000"; when others => Salida <= "XXXX"; end case; end process; end behv; architecture when_else of DECODER is begin Salida <= "0001" when Entrada "0010" when Entrada "0100" when Entrada "1000" when Entrada "XXXX"; end when_else;

= = = =

"00" "01" "10" "11"

else else else else

60

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

BANCO DE PRUEBAS del DECODER de antes library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity BP_DECODER is end BP_DECODER; -- declaracin de entidad

architecture BP of BP_DECODER is -- declaracin del componente a testear component DECODER port( Entrada: in std_logic_vector(1 downto 0); Salida: out std_logic_vector(3 downto 0)); end component; -- declaracin de seales para interconexin signal T_Entrada: std_logic_vector(1 downto 0):="00"; signal T_Salida: std_logic_vector(3 downto 0); -- seleccin de entidad y arquitectura asociadas al componente mediante -- especificacin de configuracin. Necesaria porque hay 2 arquitecturas for all:DECODER use entity work.DECODER(when_else); begin -- Instanciacin del componente a testear U_DECODER: DECODER port map (T_Entrada, T_Salida); -----------------Aplicacin de estmulos y monitorizacin de resultados una forma de onda no repetitiva, por ejemplo para una se al de reset, se genera mediante una sentencia de asignacin concurrente: RST <= 1,0 after 50 ns; una forma de onda peridica, por ejemplo una seal de reloj se puede generar mediante una sentencia de asignacin concurrente: CLK <= not CLK after 10 ns; mediante procesos: process begin CLK <= CLK 0,1 after 10 ns; wait for 20 ns; end process;

process begin CLK <= CLK 0; wait for 20 ns; CLK <= CLK 0; wait for 20 ns; end process;

process variable err_cnt : integer := 0; begin -- se inyectan estmulos y se compara la respuesta del diseo con el resultado -- correcto; si no coinciden por consola se presenta un error. La monitorizaci n -- de resultados no es necesaria. Es til en diseos complejos. -- case "00" wait for 10 ns; T_Entrada <= "00"; wait for 1 ns; assert (T_Salida="0001") report "Error Case 0" severity error; -- consola if (T_SALIDA/="0001") then err_cnt := err_cnt + 1; end if; 61

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Modelado y Simulacion VHDL 05-06

-- case "01" wait for 10 ns; T_Entrada <= "01"; wait for 1 ns; assert (T_SALIDA="0010") report "Error Case 1" severity error; if (T_SALIDA/="0010") then err_cnt := err_cnt + 1; end if; -- case "10" wait for 10 ns; T_ENTRADA <= "10"; wait for 1 ns; assert (T_SALIDA="0100") report "Error Case 2" severity error; if (T_SALIDA/="0100") then err_cnt := err_cnt + 1; end if; -- case "11" wait for 10 ns; T_ENTRADA <= "11"; wait for 1 ns; assert (T_SALIDA="1000") report "Error Case 3" severity error; if (T_SALIDA/="1000") then err_cnt := err_cnt + 1; end if; -- case "11" wait for 10 ns; T_ENTRADA <= "UU"; -- sumario de todos los test if (err_cnt=0) then assert false report "Diseo del Decoder es correcto!" severity note; else assert true report "Algo va mal!" severity error; end if; wait; end process; end BP; --------------------------------------------------------------configuration CFG_BP of BP_DECODER is for BP end for; end CFG_BP; ----------------------------------------------------------------

62

PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com

Vous aimerez peut-être aussi