87
VHDL M. C. Felipe Santiago Espinosa Instituto de Electrónica y Mecatrónica Abril - 2017

Breve Curso de VHDL - utm.mxfsantiag/Cir_Dig_Rec/04_VHDL_(parte_1).pdf · Su aplicación es directa en diferentes dispositivos programables: ... CPLD‟s. FPGA‟s : Arreglos de Compuertas

  • Upload
    vanhanh

  • View
    225

  • Download
    1

Embed Size (px)

Citation preview

VHDL

M. C. Felipe Santiago Espinosa

Instituto de Electrónica y Mecatrónica

Abril - 2017

Aspectos a revisar

1. Introducción al diseño con VHDL.

2. Unidades de diseño en VHDL.

3. Señales.

4. Especificación de la Interfaz.

5. Elementos de la Arquitectura.

6. Especificación del Comportamiento.

7. Múltiples procesos en una arquitectura.

8. Jerarquías de diseño en VHDL.

2 F. Santiago E.

3

I. Introducción al diseño con VHDL.

F. Santiago E.

4

VHDL es un lenguaje para la descripción de Hardware. Surge como una necesidad debido a que los métodos clásicos llegan a ser ineficientes en diseños complejos.

Antes de VHDL, los métodos de diseño se basaban en ecuaciones booleanas y esquemáticos.

Con ecuaciones Booleanas requiere de la escritura de una ecuación por cada flip-flop.

Es impráctico para circuitos con cientos de flip-flops.

Teóricamente cualquier sistema puede representarse con ecuaciones booleanas, pero tratar con miles de ellas no es factible.

Antes de VHDL

F. Santiago E.

5

El uso de esquemáticos amplía la capacidad de los métodos basados en ecuaciones, al aceptar bloques con funciones básicas (multiplexores, sumadores, memorias, etc.), además de compuertas y flip-flops.

Con la posibilidad de agregar nuevos módulos, se pueden manejar diseños jerárquicos acomodando más componentes con menos esfuerzo.

Es preferida por muchos diseñadores porque las representaciones gráficas muestran las relaciones entre diferentes bloques del diseño.

Fue considerado como un método óptimo para el diseño de sistemas digitales.

Antes de VHDL . . .

F. Santiago E.

6

El diseño de un sistema comienza con una descripción del comportamiento esperado. Con los métodos tradicionales, el resultado final no muestra los fundamentos sobre los cuales fue creado.

La verificación y modificaciones futuras llegan ser muy complicadas cuando un diseño sólo contiene información de sus interconexiones o se basa en un número grande de ecuaciones.

Tratar con cientos de ecuaciones es difícil, pero factible; sin embargo, si se trata de miles de ecuaciones llega a ser imposible.

Los sistemas actualmente contienen millones de compuertas (y sus densidades continúan creciendo), por lo que los métodos tradicionales ya no son suficientes.

Desventajas de los métodos tradicionales

F. Santiago E.

7

Los lenguajes para la descripción de Hardware eliminan la mayoría de las desventajas.

Su aplicación es directa en diferentes dispositivos programables:

PLD‟s de diferentes complejidades, desde los simples PALs hasta los complejos CPLD‟s.

FPGA‟s : Arreglos de Compuertas Programables en Campo.

Actualmente hay diferentes lenguajes HDL, los más populares son: CUPL, VHDL, Verilog y ABEL.

Lenguajes para la descripción de Hardware

F. Santiago E.

8

Descripción

Informal

Ecuaciones

Booleanas

Esquemático

Sintésis del

Circuito

Especificación en

VHDL

AN

TE

S D

E V

HD

L

CO

N V

HD

L

F. Santiago E.

9

Niveles de Descripción de Sistemas

ESTRUCTURA

SISTEMA

CHIPS

REGISTROS

COMPUERTAS

CIRCUITOS

SILICIO

COMPORTAMIENTO

Leyes de la física Objetos Geométricos

Ecuaciones diferenciales Transistores, R, L, C

Ecuaciones booleanas Compuertas, Flip-Flops

Tablas de transición de estados,

Tablas de verdad

Registros, multiplexores, ALU’s

Algoritmos, micro-operaciones

Respuesta I/O

mProcesadores, memorias,

dispositivos I/O

Especificación del rendimiento Sensores, elementos analógicos

o mecánicos

Se han sombreado los niveles que pueden ser descritos en VHDL.

F. Santiago E.

10

Es un acrónimo: “V” se toma por Very High Speed Integrated Circuit ( Circuito Integrado de muy alta velocidad), y HDL significa Lenguaje para la Descripción de Hardware.

VHDL es un lenguaje estandarizado (IEEE 1076-1993) utilizado para el diseño de sistemas digitales.

El lenguaje VHDL fue desarrollado por el DoD de USA, con el propósito de contar con un estándar para documentación, modelado y simulación de dispositivos electrónicos.

Los simuladores de VHDL surgen en los 90‟s.

VHDL no fue creado para síntesis, esta propiedad se le agregó al buscar formas que ayuden a automatizar los procesos de diseño.

¿ Qué es VHDL ?

F. Santiago E.

11

II. Unidades de Diseño en VHDL

F. Santiago E.

12

Cualquier sistema debe poder comunicarse con su ambiente....

Representaciones en VHDL

I / 0 Sistema

INTERFAZ CUERPO

F. Santiago E.

13

Un sistema sin interfaz es INÚTIL.

INTERFAZ CUERPO

La interfaz de un sistema en VHDL es descrita por su Entidad (Entity).

Así como no es posible tener un sistema sin Interfaz; en VHDL tampoco es posible tener un sistema sin una Entidad.

La Entidad de un sistema es Primordial para VHDL.

La Interfaz

F. Santiago E.

14

El Cuerpo

La funcionalidad del sistema se completa con el procesamiento de los datos de entrada, para la generación de resultados. Esta tarea se realiza en el cuerpo del sistema.

El cuerpo de un sistema es conocido en VHDL como su Arquitectura (Architecture).

La funcionalidad puede ser muy simple, como el encendido/apagado de un interruptor, o muy complicada, como el piloto automático de un avión.

Sin embargo, sin importar la sofisticación de un sistema, éste puede ser considerado como una composición de Interfaz y Cuerpo (Entidad y Arquitectura, en VHDL).

F. Santiago E.

15

A algunos sistemas se les pueden incorporar nuevas características por medio de elementos de soporte.

Un paquete ( Package ) incorpora nuevas definiciones o características a varios sistemas. Pueden re-utilizarse, por ello no se consideran como parte del cuerpo del sistema.

En conclusión, se tienen 3 unidades independientes de diseño: La interfaz, el cuerpo y los paquetes.

Paquetes

INTERFAZ

CUERPO

PAQUETE

F. Santiago E.

16

El diseño de un sistema inicia con el análisis de la relación que éste tendrá con su ambiente, es decir, inicia con la descripción de la Entidad.

En VHDL no es posible especificar un sistema si no se ha declarado su Entidad.

Todo lo que se especifique en una entidad es visible para las Arquitecturas asociadas con esa entidad.

El nombre del sistema corresponde con el nombre de la Entidad.

Unidad Principal de Diseño: La Entidad

Disco_duro

Entity Disco_duro is

. . . .

End Entity Disco_duro;

Cámara

Entity Camara is

. . . .

End Entity Camara;

F. Santiago E.

17

La entidad puede contener dos elementos:

Parámetros que serán conocidos por todo el sistema, por ejemplo: El ancho de un bus, la frecuencia máxima de operación, etc.

Conexiones a través de las cuales se transferirá la información hacia el exterior o interior del sistema.

Contenido de la Entidad

D0 D1 D2 D3 D4 D5 D6 D7

CLK

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

Entity Registro is

Ancho_Bus = 8

Fmax = 50 MHz

D : entrada ocho_bits

Q : salida ocho_bits

CLK : entrada un_bit

End Entity Registro;

Parámetros

Conexiones

F. Santiago E.

18

Los dos elementos de una interfaz (parámetros y conexiones) se declaran por separado en cada entidad :

Los Parámetros son datos “genéricos” y son conocidos automáticamente por el cuerpo del sistema.

Las Conexiones forman los “puertos” de entrada/salida.

Parámetros y Conexiones

D0 D1 D2 D3 D4 D5 D6 D7

CLK

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

Entity Registro is

generic (

Ancho_Bus = 8

Fmax = 50 MHz

);

port (

D : entrada ocho_bits

Q : salida ocho_bits

CLK : entrada un_bit

);

End Entity Registro;

F. Santiago E.

19

El Sistema A contiene 3 subsistemas: B, C y D. Y 8 líneas de conexión: TL1 a TL8:

Comprensión de la Interfaz

A

B

C D

TL7

TL6 TL8 TL5

TL4

TL3

TL2

TL1

1. ¿ Cuáles líneas son parte de la Interfaz de A ?

2. ¿ Qué líneas están en la interfaz de C y no están en la de A ?

3. ¿ Cómo sería la entidad de D ? (notar que no hay parámetros)

F. Santiago E.

20

Entity TVSet is

. . . . .

End Entity TVSet;

Architecture TV2000 of TVSet is

. . . . .

End architecture TV2000;

El cuerpo de un sistema siempre está ligado a su interfaz, similarmente en VHDL cada Arquitectura debe estar ligada con una Entidad.

VHDL le da mayor importancia a la Entidad, de modo que las Arquitecturas se asocian con una Entidad y no viceversa.

La arquitectura

ENTIDAD

ARQUITECTURA

F. Santiago E.

21

Cada sistema puede describirse en términos de su funcionalidad (comportamiento) o estructura (construcción), y en cada caso se requiere diferente información.

Tipos de Arquitectura

¿QUÉ HACE? ¿CÓMO ESTÁ COMPUESTA?

Funcionalidad Estructura

Muchas herramientas de Síntesis trabajan con ambas descripciones.

La descripción estructural es más adecuada para síntesis.

En sistemas jerárquicos, de acuerdo con el nivel de cada módulo, se emplea una u otra descripción (Metodología TOP-DOWN).

F. Santiago E.

22

Descripción Funcional

Entity TVSet is

port (

ON : entrada un_bit

VOL_UP, VOL_DOWN : entrada un_bit

CHAN_UP, CHAN_DOWN : entrada un_bit

. . . .

)

End Entity TVSet;

Architecture TV2000 of TVSet is

. . . .

if ON then enciende al sistema

if not - ON then apaga al sistema

. . . .

if VOL_UP then volumen = volumen + 1

if VOL_DOWN then volumen = volumen - 1

. . . .

if CHAN_UP then canal = canal + 1

if CHAN_DOWN then canal = canal -1 1

. . . .

End architecture TV2000;

Debe especificar lo que el

sistema va a hacer como una

respuesta a los diferentes

eventos que vayan ocurriendo.

En general, es una descripción

de la generación de las salidas,

como una respuesta a los

cambios en las entradas.

Es una descripción algorítmica.

F. Santiago E.

23

Descripción Estructural

Entity TVSet is

port (

. . . .

)

End Entity TVSet;

Architecture TV2000 of TVSet is

. . . .

U1, U5 -> U2

U2 -> U4

U1 -> U3

U3 -> U5

. . . .

End architecture TV2000;

No especifica la funcionalidad

del sistema, en lugar de ello

especifica los componentes

que lo integran y la forma en

que se deben conectar para

alcanzar los resultados

esperados.

En otras palabras, describe la

estructura interna del sistema.

Es para módulos con mayor

jerarquía.

U2

U3 U5

U4 U1

F. Santiago E.

24

Comparación de los tipos de Arquitectura

¿QUÉ HACE? ¿CÓMO ESTÁ COMPUESTA?

Decripción Funcional Descripción Estructural

La descripción estructural es mucho más fácil de sintetizar que la descripción

funcional por que se refiere a componentes físicos concretos.

Sin embargo es más difícil de desarrollar porque requiere de mayor

experiencia del diseñador, para hacer diseños más eficientes.

F. Santiago E.

25

Dado que diferentes tipos de arquitecturas pueden realizar la misma función, la interfaz de un sistema (una entidad) puede especificarse para diversas arquitecturas.

Ejemplo: Si se requiere de un procesador SIXTIUM, éste puede ser de diferentes fabricantes.

Una Entidad: ¿Cuántas Arquitecturas?

Entity Sixtium is

. . . . .

End Entity Sixtium;

Architecture IMTEL of Sixtium is

. . . . .

End IMTEL;

Architecture LYRIX of Sixtium is

. . . . .

End LYRIX;

Architecture AMC of Sixtium is

. . . . .

End AMC;

F. Santiago E.

26

El Concepto de “Paquete”

Los Paquetes incorporan conceptos (tipos de datos, operaciones, etc. ) que no son

estándares.

Se declaran por adelantado, antes de la Entidad, para ello se incluyen las clausulas:

Library y Use.

Con library se indica la biblioteca que será empleada.

Con use se especifica que paquete o unidad de la biblioteca se requiere.

F. Santiago E.

27

Paquetes Predefinidos :

Los tres paquetes más populares definidos por la IEEE son :

STANDARD : Contiene todas las declaraciones y definiciones básicas del lenguaje y está incluido en

todas las especificaciones de VHDL por default.

TEXTIO: Contiene las declaraciones de operaciones básicas de texto. Para usarlo, antes de la entidad

debe declararse:

library std;

use std.TextIO.all;

STD_LOGIC_1164: Contiene extensiones al estandar de VHDL, definidas en el Estandar 1164 de la

IEEE, algunas declaraciones importantes son: Variables y vectores lógicos, extensión de operadores y

algunas funciones. Para usarlo, las declaraciones son:

library IEEE;

use IEEE.std_logic_1164.all;

Nota: Aparte de los paquetes estándares, cada desarrollador de Software incluye sus propios paquetes.

F. Santiago E.

28

-- Las tres unidades de Diseño en VHDL :

-- Paquetes

Library New ConceptLib; -- Biblioteca a Usar

Use NewConceptLib.Arithm.Logarithm; -- Paquete a Usar

-- Entidad

Entity SomeSyst is -- La interfaz: Incluye parámetros

. . . . -- genéricos y puertos

End Entity SomeSyst;

-- Arquitectura

Architecture FirstArch of SomeSyst is -- El cuerpo del sistema:

. . . . -- Puede ser descrito de manera

-- Estructural o Funcional

. . . .

Logarithm -- Concepto no estándar en Uso

. . . .

End Architecture FirstArch;

Resumen . . . .

F. Santiago E.

29

III. Señales.

F. Santiago E.

30

Un fenómeno importante en el mundo es el proceso de comunicación, el cual

involucra transmitir información de un remitente a un destinatario.

Aunque hay muchas formas de establecer la comunicación, siempre tienen

algo en común: Las señales.

Las máquinas también se comunican, por ejemplo, un sensor de

temperatura puede informar a un circuito que este parámetro alcanzó cierto

nivel, para que el circuito encienda el aire acondicionado.

Introducción a las Señales . . .

F. Santiago E.

31

Las señales se pueden clasificar entre aquellas que llevan información dentro de un dispositivo y aquellas que comunican dispositivos (clasificación básica en VHDL).

Físicamente, una señal eléctrica es un flujo de electrones que está sujeto a complicadas leyes físicas, que determinan el tiempo de respuesta de un sistema.

Sin embargo, en VHDL estas leyes son ignoradas porque las herramientas de síntesis automáticamente realizarán el trazado físico del circuito.

El diseñador sólo se ocupa de la funcionalidad y el rendimiento del circuito.

Los diseños electrónicos se basan en componentes y líneas de señales que comunican estos componentes. Las líneas de señales pueden ser conexiones de un solo alambre o múltiples alambres (bus o vector).

Introducción a las Señales . . .

F. Santiago E.

32

Alambres y Buses

Data

Result

Z ExtBus

IntBus

a b c d e f g h i j Alambre : Señal de una sóla línea que

puede tener un valor binario en un

tiempo dado. VHDL adopta el nombre

de “bit” para estas señales.

Bus o Vector: Señal de múltiples

líneas, transmite información como una

combinación de valores binarios. Su

nombre en VHDL es “bit_vector”.

En los buses es importante definir el rango y cual será el bit más significativo

(MSB). El MSB siempre se indica primero:

X bit_vector( 0 to 7) X bit_vector( 7 downto 0)

0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0

MSB LSB MSB LSB

x y

F. Santiago E.

33

Señales Externas vs. Internas

Externas: Son Señales que conectan

al sistema con el exterior. En otras

palabras, forman la interfaz (entidad)

del sistema.

Internas: Son Señal que no están

visibles desde el exterior, están

completamente empotradas en el

sistema y son parte de su arquitectura

interna.

D

A

T

A

Result Z ExtBus

IntBus

a b c d e f g h i j

x y

Externas: Data, a, b, c, d , e, f, g, h, i, j, Result, Z y ExtBus (Entidad)

Internas: IntBus, X e Y (Arquitectura)

F. Santiago E.

34

Señales Externas

La sintaxis para la declaración de un puerto es: nombre : modo tipo;

Las señales externas se declaran en los puertos de la entidad, la declaración debe

incluir su nombre, tipo y modo. El modo se refiere a la dirección del flujo de datos y

puede ser: entrada (in), salida (out) y bidireccional (inout).

0 - 7

4 - 0

x y

z

R

Q

Sistema_Ejemplo Entity Sistema_Ejemplo is

Port (

Z : in bit;

Q : out bit_vector( 4 downto 0 );

R : inout bit_vector( 0 to 7 )

);

End Entity Sistema_Ejemplo;

Z : Puede ser leído en una arquitectura, pero no escrito.

Q : Puede ser generado (o escrito), pero no leído.

R : Puede ser leído o escrito.

F. Santiago E.

35

Señales Internas

Las señales internas se manejan dentro de la arquitectura, para distinguirlas de otros

objetos de VHDL se utiliza la palabra reservada signal.

0 - 7

4 - 0

x y

z

R

Q

Sistema_Ejemplo Architecture Unica of Sistema_Ejemplo is

Signal x, y: bit;

. . . . .

End Architecture;

La palabra reservada signal no es necesaria en la entidad dentro de la clausula

port, ya que por definición un puerto es una señal.

Las señales internas no requieren modo.

F. Santiago E.

36

Visibilidad de una Señal

Que tan visible es una señal, depende del lugar en donde se declaró:

• Una señal declarada en un paquete es visible en todas las unidades de diseño que

usan este paquete.

Package MyPack is

signal A

. . . .

• Una señal declarada como un puerto de una entidad es visible en todas las

arquitecturas asignadas a esa entidad.

Entity En1 is

port ( B _ _ _ _ )

. . . .

• Una señal declarada en la parte declarativa de una arquitectura es visible solo

dentro de esa arquitectura.

Architecture Arch1 of En1 is

signal C

. . . .

•Una señal declarada en un bloque localizado dentro de una arquitectura es visible

sólo dentro de ese bloque.

Nota: En todos los casos se cumplen con jerarquías, si algo se declara en un nivel jerárquico, será visible

en todas las construcciones de menor nivel jerárquico.

F. Santiago E.

37

IV. Elementos de la Interfaz

F. Santiago E.

38

Nombre y comentarios

El nombre de la Entidad es un identificador, y como tal tiene las siguientes reglas:

1. No puede ocupar más una línea.

2. Debe iniciar con una letra.

3. Solo puede incluir letras, números y guiones bajos.

4. Los guiones bajos solo pueden ser intermedios.

5. No se permiten espacios.

6. No se distingue entre mayúsculas y minúsculas.

7. No se pueden usar palabras reservadas.

Ejemplos:

Couter_4Bits,

Mux_4_to_1,

etc.

Los comentarios en VHDL inician con

dos guiones y terminan al final de la

línea, ayudan a una adecuada

documentación.

-- Unidad Diseñada : 8086 (Entidad y Arquitectura)

-- Nombre del archivo : P8086.vhd

-- Propósito : Modelo de un microprocesador 8086

-- para un módulo empotrado de un

-- “sistema en un chip”

-- Limitaciones : Se supone una frec. de 33 MHz

-- Errores : Ninguno conocido

-- Biblitecas : Numeric_STD, ALDEC.

-- Autor : - - - - - -

-- Simulador : ActiveVHDL

-- Notas : Modelo sintetizado con las herramien-

-- tas de ALDEC.

F. Santiago E.

39

Puertos

Los puertos son definidos en VHDL como: “Canales para comunicación dinámica

entre un bloque (una entidad) y su ambiente”. La declaración de un puerto contiene

los siguientes elementos:

1. Nombre del puerto seguido de dos puntos

2. El modo del puerto

3. El tipo del puerto

4. El valor inicial precedido por := (opcional, válido para simulación)

5. Un comentario que describa al puerto (opcional)

Cláusula END

Es el último elemento de una Entidad, opcionalmente

es seguido de la palabra reservada Entity y/o el

nombre de la entidad.

Entity Example is

generic ( . . . );

port ( . . . );

end entity Example;

Los puertos se declaran en una lista entre paréntesis, separados por ; y precedidos por la

palabra reservada port.

F. Santiago E.

40

Entity ALU is

Port (

In1 : in bit_vector (3 downto 0); -- Primer Operando

In2 : in bit_vector (3 downto 0); -- Segundo Operando

OpSel : in bit_vector (0 to 2); -- Selector de Operación

Cin : in bit; -- Acarreo de entrada

Result : out bit_vector (3 downto 0); -- Resultado

Cout : out bit; -- Acarreo de salida

Equal : out bit; -- Bandera de igual

Zero : out bit -- Bandera de cero

);

End Entity ALU;

ALU

In1 In2 OpSel

Cin Cout

Result Equal

Ejemplo: Una ALU de 4 bits

Zero

F. Santiago E.

41

Parámetros Genéricos

Los parámetros genéricos son definidos en VHDL como: “Canales de información

estática para ser comunicada a un bloque desde su mismo ambiente, en otras

palabras, son valores constantes para diferentes parámetros”.

Ejemplos de Uso:

1.- Para definir el tamaño de un objeto en VHDL

. . . .

generic ( AnchoBus : Integer := 8 );

port ( DataBus : InOut bit_Vector ( AnchoBus – 1 downto 0 ) );

. . . .

2.- Para determinar el número de Iteraciones en un lazo

. . . .

generic ( NumIt : Integer := 3 );

. . . .

for k in 1 to NumIt loop

. . . .

end loop;

. . . .

F. Santiago E.

42

3.- Para definir intervalos de tiempos

. . . .

generic ( Delay : Time := 5 s );

. . . .

y <= x after Delay;

. . . .

En todos los casos la declaración de parámetros genéricos debe incluir:

- Nombre del parámetro seguido de dos puntos

- Tipo del parámetro

- El valor del parámetro precedido de := (opcional)

- Comentarios de descripción del parámetro (opcional)

Los parámetros se declaran en una lista entre paréntesis, separados por ;

y precedidos por la palabra reservada generic.

Parámetros Genéricos

F. Santiago E.

43

V. Elementos de VHDL

F. Santiago E.

44

Todos los sistemas digitales manejan la información como bits o vectores de

bits. Sin embargo, no es posible ni conveniente usar sólo estos tipos para

todos los datos.

Tipos de Datos

Por ejemplo, para una memoria:

RAM

1k x 8

Tiempo de

Acceso

10 nS

Convendría usar

números Decimales

o Hexadecimales De

co

dific

ado

r

de

dire

ccio

ne

s

Arreglo

de

bits

Control

Convendría

usar un arreglo

de Bytes

Los tipos bit y

bit_vector no se

ajustan, el tipo

aplicable es Time

(que es un tipo físico)

Por lo tanto, VHDL debe incluir otros tipos de datos.

F. Santiago E.

45

Booleano :

Declarado como:

type BOOLEAN is (false, true);

Descripción:

Los valores Booleanos son TRUE/FALSE que no necesariamente son iguales a 0/1. Es decir , TRUE no es lo mismo que „1‟ y viceversa. Bit y Boolean son dos tipos diferentes.

Ejemplos: True, false

Caracter :

Declarado como:

type CHARACTER is (null, . . ., ‘a’, ‘b’, ‘c’, . . . );

Descripción:

Cubre todos los caracteres definidos en el conjunto que establece la definición ISO 8859-1 (Conocida también como Latín – 1).

Ejemplos: „0‟, „*‟, „¿‟, „A‟, „}‟

Tipos Escalares

F. Santiago E.

46

Entero :

Declarado como:

type INTEGER is range –2147483648 to 2147483647;

Descripción:

Un entero requiere de 32 bits, sin embargo, la mayoría de aplicaciones utilizan enteros con rangos menores. Con la siguiente declaración:

subtype ENTERO_CORTO is integer range 0 to 7;

Se declara un subtipo de entero que ocupa sólo 3 bits, luego pueden declararse señales o variables:

signal A: ENTERO_CORTO;

variable X: ENTERO_CORTO;

Si solo se va a usar una señal, la definición e instanciación pueden hacerse en una solo expresión, por ejemplo:

signal ENT_CORTO2: INTEGER range 0 to 31;

Ejemplos: 12, 0, 2147483646, -100, 16

F. Santiago E.

47

Real :

Declarado como:

type REAL is range 1.0 E`-308 to 1.0 E308;

Descripción:

También es conocido como Punto flotante, por lo general se maneja un sub-rango que depende de la aplicación.

Ejemplos: 0.0, 1.000001, -1.0 e5

Nota: La representación de los números reales es compleja, de manera que no se puede sintetizar directamente.

Bit :

Declarado como:

type BIT is (‘0’, ‘1’);

Descripción:

El tipo Bit es una enumeración que define dos valores lógicos estándares: „0‟ y „1‟. Es el único que puede usarse para operaciones lógicas.

Ejemplos: „0‟, „1‟

F. Santiago E.

48

Enumeraciones: Tipos definidos por el usuario.

Están disponibles para que el diseñador pueda contar con información personalizada, para un mayor entendimiento.

Una aplicación clásica de los Tipos Definidos por el Usuario se presenta en una Máquina de Estados Finitos (FSM), para representar un diseño secuencial, a cada estado se le asigna un nombre.

IDLE

FETCH

DECODE

EXECUTE

type EstadosFSM is (IDLE, FETCH, DECODE, EXECUTE);

signal Edo_Act, Edo_Ant: EstadosFSM;

Durante la síntesis, los estados se codifican con bits que serán manejados con flip-

flops.

F. Santiago E.

49

Tipos Fisicos

Los tipos físicos son únicos en VHDL, ya que no sólo especifican los valores de los

objetos sino también sus unidades.

El estándar de VHDL sólo incluye un tipo físico: El tiempo (Time), pero otros tipos

pueden también definirse.

Type time is range –2147483647 to 2147483647

units

fs; -- Primarias

ps = 1000 fs; -- Secundarias

ns = 1000 ps;

us = 1000 ns;

ms = 1000 us;

sec = 1000 ms;

min = 60 sec;

hor = 60 min;

end units;

Nota: El tipo físico time sólo es utilizado

para simulación, no puede ser sintetizado.

F. Santiago E.

50

Tipos Complejos

Arreglos:

Son tipos complejos con una estructura regular que contiene elementos del mismo tipo. El

número de elementos está especificado en el rango del arreglo.

El rango puede ser ilimitado: range < > (aunque no es lo más conveniente).

Hay dos arreglos pre-definidos en VHDL :

• Bit_Vector – Con elementos del tipo Bit, y

• String – Con elementos de tipo carácter.

Si estos arreglos se declaran con rango ilimitado, difieren en su limite inferior por default

en el bit_vector es 0 y en un string es 1.

F. Santiago E.

51

Arreglos . . .

Ejemplo: Signal DataBus : bit_vector ( 7 downto 0 );

0 1 0 0 1 1 0 1 7 6 5 4 3 2 1 0

MSB LSB

Único elemento (comilla simple):

DataBus( 7 ) = „0‟;

DataBus( 3 ) = „1‟;

Dos o mas elementos (comilla doble):

DataBus = “01001101”;

DataBus( 5 downto 3) = “001”;

Los vectores de bits se puede escribir en binario, octal, decimal y hexadecimal.

“01111” binario

O “17” octal

X “F” hexadecimal

F. Santiago E.

52

Es una especie de Vector de Vectores.

Arreglos . . .

Puesto que los arreglos sólo tienen una dimensión, también son conocidos como

vectores. El usuario puede declarar arreglos con dimensiones mayores, aunque tres o

mas son poco tratables.

Un ejemplo típico es una memoria:

0

1

2

3

1020

1021

1022

1023

1019

Type memory1k4 is Array ( 0 to 1023 ) of

Bit_Vector ( 3 downto 0 );

Signal Memory : memory1k4;

Memoria de 1 K x 4

F. Santiago E.

53

Registros (records)

También son tipos complejos, difieren de los arreglos en que sus elementos pueden ser

de diferentes tipos y son referenciados por su nombre y no por un índice.

Ejemplo :

Type Instr_T is record

mnemonico : String ( 1 to 14 );

opcode : Bit_Vector ( 3 downto 0 );

CiclosEx : Integer;

End record;

Signal Instr1, Instr2, Instr3 : Instr_T;

Instr1.mnemonico = “add reg1 reg2”;

Instr1.opcode = “0010”;

Instr1.CiclosEx = 2;

Instr2.mnemonico = “xor reg1 reg2”;

Instr2.opcode = “0001”;

Instr2.CiclosEx = 1;

Instr3.mnemonico = “mul reg1 reg2”;

Instr3.opcode = “1110”;

Instr3.CiclosEx = 8;

Nota : No todos los records son sintetizables, pero la

mayoría de herramientas que sintetizan cubren los

records que incluyen los tipos: bit, bit_vector, boolean e

integer.

F. Santiago E.

54

Operadores y Expresiones

Aparte de los sistemas triviales, las señales de entrada deben ser transformadas de

alguna forma para generar las señales de salida deseadas.

Outputs <- transformaciones( inputs )

Las transformaciones son realizadas por expresiones : Fórmulas que consisten de

operadores con un apropiado número de operandos.

La especificación del comportamiento de un sistema puede ser vista como un conjunto

ordenado de expresiones aplicadas sobre las señales de entrada.

Operadores Lógicos:

AND, OR, NAND, NOR, XOR y XNOR ( binarios )

NOT ( unario )

Aplicables en los tipos: Bit, Booleano y Bit_Vector (Ambos operandos deben ser del mismo tipo).

F. Santiago E.

55

Operadores Numéricos:

OPERADOR SIMBOLO EJEMPLOS DE USO

Suma + IntX1 + 17, RealX2 + 2.0

Resta - BusWidth – 1

Producto * A * B (ambos enteros o ambos reales),

Mult * 5nS (Mult entero o real)

División / CLK/2 , 10 ns / 2 ns (resultado sin Unidad)

Módulo Mod 6 mod 4 ( = 2 ), (-6) mod 4 ( = 2 ), 6 mod (-4) ( = -2)

Residuo Res 6 res 4 ( = 2 ), (-6) res 4 ( = - 2 ), 6 res (-4) ( = 2)

Exponenciación ** A**2 ( A*A ), B**3 ( B*B*B ), C*0.5 ( Ilegal )

Valor Absoluto Abs Abs 1 ( = 1 ), Abs ( - 1) ( = 1 ), Abs ( 5*(-2) ) ( = 10 )

Enteros Reales Tiempo

Todos +, -, /, abs

** con el 2o. Operando Entero

+, -, / (Ambos de Tiempo)

*, / (Uno entero o real)

Operadores aplicables en cada tipo de datos

F. Santiago E.

56

Operadores Relacionales :

OPERADOR SIMBOLO

Igual a =

No igual a /=

Menor que <

Menor o igual que <=

Mayor que >

Mayor o igual que >=

Estos operadores se aplican sobre los

tipos: Booleanos, Bits, Caracteres,

Enteros, Reales, Tiempo, Cadenas y

Bit_Vector (ambos del mismo tipo).

El resultado siempre es Booleano:

True o False

Operadores de Desplazamientos :

( Aplicables a Bit_Vector o Arreglos Booleanos )

SLL – Desplazamiento lógico a la Izquierda.

SLL

1 0 0 1 1 0 1 0

7 6 5 4 3 2 1 0

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

0

( )

SLR – Desplazamiento lógico a la Derecha.

SLR

0 0 1 0 0 1 1 0

7 6 5 4 3 2 1 0

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

0

( )

A <= B SLL 1;

F. Santiago E.

57

SLA – Desplazamiento Aritmético a la Izquierda.

SLA

1 0 0 1 1 0 1 1

7 6 5 4 3 2 1 0

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

( )

SRA – Desplazamiento Aritmético a la Derecha.

SRA

0 0 1 0 0 1 1 0

7 6 5 4 3 2 1 0

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

( )

ROL – Rotación a la Izquierda.

ROL

1 0 0 1 1 0 1 0

7 6 5 4 3 2 1 0

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

( )

ROR – Rotación a la Derecha.

ROR

0 0 1 0 0 1 1 0

7 6 5 4 3 2 1 0

0 1 0 0 1 1 0 1

7 6 5 4 3 2 1 0

( )

F. Santiago E.

58

Operador de Concatenación :

Facilita la creación de nuevos arreglos a partir de arreglos existentes, los arreglos pueden

ser de cualquier tipo, pero solo de una dimensión.

1 0 1 1 0 0 1 0

0 1 2 3 4 5 6 7

Ejemplo: Data1 : Bit_Vector ( 0 to 7 );

0 0 1 0 1 0 1 0

0 1 2 3 4 5 6 7

Data2 : Bit_Vector ( 0 to 7 );

1 BitOne : bit;

VecRes : Bit_Vector ( 0 to 7 );

VecRes <= ( Data1( 0 to 3 ) & Data2 (3 to 5) & BitOne );

1 0 1 1 0 1 0 1

0 1 2 3 4 5 6 7

F. Santiago E.

59

Asignación de Expresiones a Señales

El operador de asignación es : <=

Señal_Destino <= Expresión

Ejemplos:

k <= „1‟;

m <= “0101”;

n <= m & k;

a <= b or c;

x <= y <= z;

Una asignación puede ser retrasada, la

cláusula “after” permite definir esos retrasos

Retrazo

4 seg

Lamp <= switch after 4s;

RETRASO INERCIAL

La cláusula “after” impone un retraso inercial, es

decir, dos cambios subsecuentes de una entrada

son ignorados si el tiempo entre ellos es más corto

que el retraso especificado.

0 6 10

SWITCH

0 4 10 LAMP

12

0 2 10

SWITCH

0 4 LAMP

F. Santiago E.

60

RETRASO DE TRANSPORTE

El “retraso Inercial” es común en muchos sistemas electrónicos, pero no en todos. Por

ejemplo en una línea de transmisión los retardos en la propagación son independientes

del ancho de los pulsos.

Este tipo de retrasos se les conoce como retrasos de transporte y en VHDL se modelan

con la palabra reservada “transport”.

Retrazo

4 seg

Lamp <= transport switch after 4s;

0 2 10

SWITCH

0 4 LAMP

6 10

F. Santiago E.

61

Comparación de Retrasos

Out1 <= Input after 3s; -- Retraso inercial (default)

Out2 <= transport Input after 3s; -- Retraso de transporte

0 4 10

INPUT

0 3 OUT1

7 10

0 OUT2

10

12

3 7 13 15

Nota: Los retrasos son útiles para modelado y simulación, pero no se pueden sintetizar.

F. Santiago E.

62

Constantes

Juegan el mismo papel que los parámetros genéricos, excepto que las constantes se

declaran en la arquitectura (y no en la entidad).

La declaración de constantes requiere de la Sintaxis siguiente:

• Palabra reservada Constant

• Nombre de la constante (es un Identificador)

• Dos puntos

• Indicación del tipo de constante

• Valor de la constante después de :=

• Punto y coma al terminar la línea

Architecture Arch1 of Ent1 is

Constant t_prop : time := 10nS;

Begin

. . . .

End architecture Arch1;

Block_1 : block

Constant N : integer := 123;

Begin

. . . .

End block Block1;

P1 : process( A, B)

Constant t_hold : time := 5 ns;

Begin

. . . .

End process P1;

F. Santiago E.

63

Las constantes pueden utilizarse para :

• Especificar el tamaño de Objetos complejos (arreglos o buses)

• Controlar ciclos repetitivos

• Definir parámetros de tiempo como : retrasos, tiempos de conmutación, etc.

Nota: No pueden usarse para definir los tamaños de vectores en los puertos , por que los puertos son

declarados en las entidades y las constantes se definen en las arquitecturas (solo se puede hacer si la

constante está en un paquete usado por la entidad).

PARÁMETROS GENERICOS CONSTANTES

UBICACIÓN DE LA

DECLARACION

Sólo en la Entidad

( cláusula generic )

En una arquitectura o

En un paquete

DECLARACION

Es una lista:

Generic ( name : tipo := valor_op;

name : tipo := valor_op );

Una declaración por constante :

Constant name1 : tipo := valor1;

Constant name2 : tipo := valor2;

VISIBILIDAD

En la entidad, incluyendo los puertos y

en todas las arquitecturas asociadas

con esa Entidad

En la arquitectura (si ahí se declaro).

En cualquier Unidad de diseño que use el

paquete (si se declaró en un paquete),

esto incluye entidades y arquitecturas.

F. Santiago E.

64

VI. Especificación del Comportamiento

F. Santiago E.

65

Introducción

El objetivo de un sistema electrónico es transformar datos de entradas en resultados

como salidas, esta clase de actividad es conocida como Comportamiento o

Funcionalidad del sistema.

La especificación del comportamiento consiste en una lista de operaciones que han de

ejecutarse para obtener el resultado esperado.

KIWI FRUTAS LIMON

Comportamiento de la Máquina:

If hay_moneda then Botones <= habilitados

If Botones = habilitados then

If pres_kiwi then salida <= jugo_kiwi

Else if pres_frutas then salida <= jugo_frutas

Else salida <= jugo_limon

If Bebida_Entregada then

Botones := deshabilitados

El funcionamiento del distribuidor de bebidas depende de una secuencia de operaciones.

Esto es común en muchos sistemas.

F. Santiago E.

66

Procesos

Un proceso es una manera formal de hacer una lista de operaciones secuenciales.

Tiene un formato muy estructurado y representa el comportamiento de una sección de

un diseño.

Reglas para escribir un proceso:

Un proceso se especifica con la palabra reservada Process. Opcionalmente se le

puede asignar un nombre, éste debe ir antes de process seguido de dos puntos.

El fin del proceso se indica con end process y luego puede repetirse el nombre del

proceso.

El cuerpo del proceso está formado por una lista de proposiciones que debe iniciar con

la palabra reservada begin, la lista termina con el fin del proceso.

La declaración de variables o constantes se debe hacer antes de la palabra begin.

Plantilla : nom_op : process

declaración de variables o constantes

begin

proposiciones secuenciales

end process nom_op;

F. Santiago E.

67

Procesos . . .

MUX2_TO1 : process

Constant High : Bit := „1‟;

begin

Y <= A;

if SEL = High then

Y <= B;

end if;

End process MUX2TO1;

A

B

Y

SEL

EJEMPLO : Puesto que VHDL es para representar sistemas, la

terminación de un proceso se debe analizar a

detalle. Un sistema no realiza sus funciones sólo

una vez y termina; más bien, debe repetir sus

actividades en un ciclo infinito.

Por eso, un proceso asegura que terminada la

ejecución de la última proposición,

inmediatamente iniciará nuevamente con la

primera.

Como resultado Un proceso Nunca Termina.

SomeProcess : Process

Begin

Some Statement1;

Some Statement2;

Some Statement3;

Some Statement4;

End process SomeProcess

F. Santiago E.

68

Necesidad de Suspender y Reanudar un Proceso

Los dispositivos electrónicos operan en un ciclo infinito; después de su activación

ejecutan una lista de tareas para después regresar a esperar una condición de

repetición.

En otras palabras, los dispositivos suspenden su operación cuando completan sus

tareas y las reanudan cuando se dan nuevamente las condiciones.

KIWI FRUTAS LIMON

La inserción de una moneda dará inicio a las

actividades de la máquina, que se “suspenderán”

después de que la máquina proporcione el jugo

deseado.

Las actividades se “reanudarán” cuando ocurra la

inserción de otra moneda.

Esta suspensión temporal en VHDL se puede realizar con la sentencia wait.

La sentencia wait sirve para suspender un proceso una vez que ha completado su

tarea y reanudarlo cuando se da la condición que finaliza la espera.

F. Santiago E.

69

Wait puede usarse para:

- Detener incondicionalmente la ejecución temporal de un proceso.

- Listar las condiciones necesarias para que el proceso se reanude.

Si un proceso contiene una sentencia Wait, ejecutará todas sus proposiciones hasta que

el wait sea encontrado, ahí esperará hasta que se cumplan las condiciones establecidas

en el wait.

Tipos de Wait :

1.- Wait for cierto_tiempo : Suspende el proceso por una cantidad específica de tiempo,

el tiempo se puede expresar explícitamente:

Wait for 10 ns;

O bien como una expresión:

Wait for CLK_Periodo / 2;

Sentencia Wait

F. Santiago E.

70

Sentencia Wait

2.- Wait until condición : El proceso se suspende hasta que una condición llega a ser

verdadera, debido a algún cambio en las señales involucradas.

Ejemplos: Wait until CLK = „1‟;

Wait until CE and (not RESET);

Wait until IntData > 16;

3.- Wait on lista de sensibilidad : El proceso se suspende hasta que ocurre un evento en

cualquiera de las señales que integran la lista de sensibilidad

Ejemplos: Wait on CLK;

Wait on Enable, Data;

4.- Wait complejo : Contiene una combinación de más de uno de los 3 tipos mencionados

anteriormente.

Ejemplos: Wait on Data until CLK = „1‟;

Wait until CLK = „1‟ for 10 ns;

F. Santiago E.

71

La sentencia wait puede ubicarse en cualquier parte del proceso, en realidad depende del

comportamiento deseado.

Process

Begin

wait on sigA;

proposiciones 1;

proposiciones 2;

proposiciones 3;

End process;

Process

Begin

proposiciones 1;

proposiciones 2;

proposiciones 3;

wait on sigB;

End process;

El wait sobre la lista de sensibilidad es probablemente la forma más frecuente de reanudar

procesos en VHDL, es por eso que el lenguaje permite colocar la lista de sensibilidad entre

paréntesis, justo después de la palabra process. Su funcionamiento es similar a un wait on

lista al final del proceso.

Process

Begin

proposiciones 1;

proposiciones 2;

proposiciones 3;

wait on señales;

End process;

Process ( señales )

Begin

proposiciones 1;

proposiciones 2;

proposiciones 3;

End process;

F. Santiago E.

72

Un proceso puede tener múltiples wait‟s, pero si tiene una lista de sensibilidad, no es

necesario que tenga un wait explícito para suspender su ejecución.

Cuando la ejecución de un proceso inicia, ésta se realiza una vez, posteriormente el proceso

es suspendido hasta que alguna señal en su lista de sensibilidad cambia de valor.

Aunque sólo una de las señales de la lista cambie, con ello todas las proposiciones del

proceso se ejecutan en forma secuencial, no solo aquellas que involucran a la señal que

cambió.

Process ( signal1, signal2, signal3 )

Begin

signal1 <= expresion 1 ;

signal2 <= expresion 2;

signal3 <= expresion 3;

End process;

F. Santiago E.

73

El propósito de una implementación en VHDL es describir la reacción de las salidas ante las

entradas. Tanto entradas como salidas son señales, de modo que tal reacción básicamente

esta dada por asignaciones de señales.

Las señales y sus asignaciones se manejan en procesos, sin embargo, su uso está

gobernado por 3 restricciones:

Señales en Procesos

1. Las señales no pueden declararse dentro de procesos.

2. Cualquier asignación de una señal tomará efecto cuando el proceso se suspende.

Mientras esto no ocurra, todas las señales mantendrán sus previos valores.

3. Sólo la última asignación de una señal dentro de un proceso es efectivo. No tiene

sentido asignar mas de un valor a una señal en un proceso dado.

Ejemplo: Process ( signal1, signal2, signal3 )

Begin

Proposición 1;

Proposición 2;

signal3 <= signal1 + 3;

End process;

Signal1 = 0 -> 1

Signal2 = 0

Signal3 = 5

F. Santiago E.

74

Las restricciones en el uso de señales impactan en sus aplicaciones prácticas. Dado que

sólo pueden almacenar el valor de su última asignación, no pueden usarse para

almacenamientos intermedios o de datos temporales (dentro de un proceso).

Otro inconveniente es el siguiente, como los nuevos valores se asignan sólo al suspender el

proceso, el análisis llega a ser complicado.

Ejemplo: Process ( C, D )

Begin

A <= 2;

B <= A + C;

A <= D + 1;

E <= A*2;

End process;

A = 1

B = 1

C = 1

D = 1

E = 1

Si D cambia a 2 ¿Qué pasa?

Es necesario contar con otro tipo de objetos que permitan almacenar datos temporales.

Estos objetos son las variables, cuya única diferencia con las señales es que se pueden

utilizar donde una señal no es aplicable.

F. Santiago E.

75

Ejemplo: Process ( C, D )

variable Av, Bv, Ev : integer := 0;

Begin

Av := 2;

BV := Av + C;

Av := D + 1;

Ev := Av*2;

A <= Av;

B <= Bv;

E <= Ev;

End process;

A = 1

B = 1

C = 1

D = 1

E = 1

Av = 0

Bv = 0

Ev = 0

Si D cambia a 2 ¿Qué pasa?

Una señal tiene 3 propiedades asociadas: Tipo, valor y tiempo. Con una relación cerrada

entre valor y tiempo, ya que cada señal tiene una trayectoria de valores a través del tiempo.

Una variable sólo tiene 2 propiedades: tipo y valor, por lo que solo se puede conocer su

valor actual.

Si las señales y variables son del mismo tipo, indistintamente puede haber asignaciones

ente ellas.

F. Santiago E.

76

SEÑALES VARIABLES

Se declaran como puertos en las entidades o en

las partes declarativas de las arquitecturas, pero

no en los procesos.

Como tienen carácter local, solo pueden

declararse en procesos o subprogramas. No

fuera de ellos.

La asignación de un nuevo valor a una señal

solo tiene efecto cuando el proceso es

suspendido. Por lo que sólo la última asignación

es válida. Las auto-asignaciones como:

Sig1 <= Sig1 + 1

Sólo son posibles con señales internas o del

tipo inout, si son externas.

Toman sus nuevos valores inmediatamente.

Todos son efectivos, de modo que en un

proceso puede haber múltiples asignaciones a

una variable. Las auto-asignaciones como:

Var1 := Var1 + 1

Son válidas y muy usadas en ciclos repetitivos.

Es posible retrasar la asignación de una señal

(con la cláusula after ), hay dos tipos de

retrasos: El retraso inercial y el de transporte.

No es posible retrasar la asignación de una

variable.

F. Santiago E.

77

Control de Flujo

Para el control de flujo VHDL tiene las siguientes proposiciones :

- Condicionales : If . . . . Then . . . . .

- Condicionales con alternativas: If . . . . Then . . . . . Else . . .

If . . . . Then . . . . . Elsif . . . Then . . . . . Else . . .

- De elección múltiple: Case . . . . Is

when . . . .

-Ciclos repetitivos: While . . . . Loop . . . . ( Repetitivo por condición )

for . . . . Loop . . . . ( Repetitivo por contador )

Con estas estructuras de control, el flujo de la ejecución de las instrucciones ya no sólo es

secuencial.

F. Santiago E.

78

ExProc : Process ( Lista_de_sensibilidad )

Begin

if Cond1 then

. . . .

case Cond2 is

when val1 => . . . .

when val2 => . . . .

when others =>

for l in 1 to 4 loop

. . . .

end loop;

end case;

else

while Cond3 loop

. . . .

end loop;

. . . .

end if;

. . . .

End process

. . . .

End process

if Cond1

. . .

case Cond2 is

val1 val2

for l in 1 to 4 loop . . . .

others

. . . . . . . .

end case;

end if;

while Cond3 loop . . .

then else

. . . .

F. Santiago E.

79

Ejemplo: Estructura if - then

D

CLK

Q

FLIP FLOP TIPO D

-- Descripción de la Entidad

Entity Flip_flop_D is

port (

D : in Bit;

CLK : in Bit;

Q : out Bit

);

End Flip_flop_D;

-- Descripción de la Arquitectura

Architecture unica of Flip_flop_D is

Begin

process ( CLK )

begin

if CLK = „1‟ then

Q <= D;

end if;

end process;

End unica;

F. Santiago E.

80

if – then

(anidados)

D

CLK

Q

FLIP FLOP TIPO D

CON RESET SÍNCRONO

-- Descripción de la Entidad

Entity FFD_SR is

port (

D , CLK, RST : in Bit;

Q : out Bit

);

End FFD_SR;

-- Descripción de la Arquitectura

Architecture unica of FFD_SR is

Begin

process ( CLK )

begin

if CLK = „1‟ then

if RST = „1‟ then

Q <= „0‟;

else

Q <= D;

end if;

end if;

end process;

End unica;

RST

F. Santiago E.

81

if – then – elsif

-- Descripción de la Entidad

Entity FFD_AR is

port (

D, RST, CLK : in Bit;

Q : out Bit

);

End FFD_AR;

-- Descripción de la Arquitectura

Architecture unica of FFD_AR is

Begin

process ( RST, CLK )

begin

if RST = „1‟ then

Q <= „0‟;

elsif CLK = „1‟ and CLK‟event then

Q <= D;

end if;

end process;

End unica;

D

CLK

Q

FLIP FLOP TIPO D

CON RESET ASÍNCRONO

RST

F. Santiago E.

82

Ejemplo: Estructura de múltiples decisiones

-- Descripción de la Entidad

Entity Gate_Prog is

port (

Dato1, Dato2 : in Bit;

Modo : in Bit_Vector ( 2 downto 0 );

Salida : out Bit

);

End Gate_Prog;

-- Descripción de la Arquitectura

Architecture Gate_Prog of Gate_Prog is

Begin

process ( Modo, Dato1, Dato2 )

begin

case Modo is

when “000” => Salida <= Dato1 and Dato2;

when “001” => Salida <= Dato1 or Dato2;

when “010” => Salida <= Dato1 nand Dato2;

when “011” => Salida <= Dato1 nor Dato2;

when “100” => Salida <= not Dato1;

when “101” => Salida <= not Dato2;

when others => Salida <= „0‟;

end case;

end process;

End Gate_Prog;

Dato1

Salida

Dato2 Modo

COMPUERTA PROGRAMABLE

Modo Salida

0 0 0 Dato1 AND Dato2

0 0 1 Dato1 OR Dato2

0 1 0 Not ( Dato1 AND Dato2)

0 1 1 Not ( Dato1 OR Dato2)

1 0 0 Not ( Dato1 )

1 0 1 Not ( Dato 2 )

1 1 0 o 1 1 1 0

F. Santiago E.

83

Ejemplo: Ciclo repetitivo por Condición

-- Descripción de la Entidad

Entity Conta_Pulsos is

port (

CLK : in STD_LOGIC;

Level : in STD_LOGIC;

Q : out STD_LOGIC_VECTOR ( 3 downto 0 )

);

End Conta_Pulsos;

-- Descripción de la Arquitectura

Architecture Conta_Pulsos of Conta_Pulsos is

Begin

process

Variable cuenta : STD_LOGIC_VECTOR (3 downto 0) := “0000”;

begin

Q <= cuenta;

wait until level = „1‟;

cuenta := “0000”;

while level = „1‟ loop

wait until clk = „1‟;

if level = „1‟ then cuenta := cuenta + 1; end if;

wait until clk = „0‟;

end loop;

end process;

End Conta_Pulsos;

Un contador de Pulsos cuya salida (en

binario) indique cuantos pulsos ocurrieron

mientras una señal (Level) estuvo en alto.

CLK

Level

Contador de Pulsos

Q(0)

Q(1)

Q(2)

Q(3)

0

1

0

0

F. Santiago E.

84

Ejemplo: Ciclo repetitivo por Contador

-- Descripción de la Entidad

library IEEE;

use IEEE.std_logic_1164.all;

entity inv_vec is

generic ( ancho_bus : integer := 8 );

port (

ent: in STD_LOGIC_VECTOR (ancho_bus - 1 downto 0);

sal: out STD_LOGIC_VECTOR (ancho_bus - 1 downto 0)

);

end inv_vec;

-- Descripción de la Arquitectura

Architecture inv_vec of inv_vec is

begin

process ( ent )

variable cont : integer;

begin

for cont in 0 to ancho_bus - 1 loop

sal( cont ) <= ent (ancho_bus - cont - 1);

end loop;

end process;

end inv_vec;

Circuito que invierte un vector (Bit por Bit)

7 - 0 7 - 0 Ent Sal

0 1 0 0 1 1 0 1 7 6 5 4 3 2 1 0

Ent :

0 1 0 0 1 1 0 1 7 6 5 4 3 2 1 0

Sal :

F. Santiago E.

85

Ruptura de ciclos

Los ciclos while y for ejecutarán sus proposiciones siempre que sus condiciones de

evaluación sean verdaderas. Sin embargo, en ocasiones es deseable una salida obligada

del ciclo o bien saltarse una iteración e ir a la siguiente.

Por ejemplo, en un contador de bits con valor „1‟ en un vector, si el bit a evaluar contiene

cero, inmediatamente se puede pasar a la iteración siguiente, esto se hace con la cláusula

next :

process ( DataBus )

variable NumOfOnes : integer := 0;

begin

for Cont in 0 to 7 loop

next when DataBus( Cont ) = „0‟;

NumOfOnes := NumOfOnes + 1;

end loop;

Ones <= NumOfOnes;

end process;

F. Santiago E.

86

Cuando se quiere terminar con el ciclo, la cláusula a usar es exit.

En el proceso mostrado en el anterior ejemplo, si se quisieran contar los 1‟s menos

significativos, antes de que aparezca el primer cero, el proceso cambia a :

process ( DataBus )

variable NumOfOnes : integer := 0;

begin

for Cont in 0 to 7 loop

exit when DataBus( Cont ) = „0‟;

NumOfOnes := NumOfOnes + 1;

end loop;

Ones <= NumOfOnes;

end process;

F. Santiago E.

Ejercicios

Multiplexor de 1 bit, de 4 canales a 1

Comparador de 4 bits

Registro de 8 bits con carga paralela, con habilitación

externa y reset asíncrono.

Sumador completo de 4 bits

Decodificador de binario a 7 segmentos.

87

Nota: Acondicionar para implementar en la tarjeta Nexys 2.

F. Santiago E.