DDVHDL c1 Prog VHDL 23ad

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

DISEÑO DIGITAL

DISEÑO DIGITAL CON VHDL


CON

C1
Programación con VHDL
C1 PROGRAMACIÓN VHDL

.1.0 Antecedentes
1.1 Elementos del lenguaje VHDL
1.2 Declaración de objetos
1.3 Declaraciones concurrentes
1.4 Ejemplos de declaraciones concurrentes
1.5 Funciones y subprogramas
1.6 Programación de FPGA o CPLD en diferentes aplicaciones

2
1.1 Elementos del lenguaje VHDL

3
C1 Introduction

C1 Introduction
VHDL es un lenguaje para describir sistemas electrónicos
digitales.
• Surgió de los circuitos integrados de muy alta velocidad del
gobierno de los Estados Unidos (VHSIC), iniciado en 1980.

Al desarrollarse este programa, quedó claro que había una


necesidad de un lenguaje estándar para describir
• La estructura y función de los circuitos integrados (CI).

Para VHSIC se desarrolló el lenguaje de descripción de


hardware (VHDL)
• VHDL fue adoptado como norma por el Instituto de
Electricidad y Electrónica Ingenieros (IEEE) en los EU. 4
C1 Introduction

VHDL está diseñado para satisfacer una serie de necesidades


en el proceso de diseño, figura 1.1.
• 1º. Permite describir la estructura de un diseño
-> El diseño se descompone en subdiseños
-> Luego se interconectan los subdiseños.
• 2º. Permite especificar la función de los diseños utilizando
formas familiares de los lenguajes de programación.
• 3º. Permite simular un diseño antes de fabricarlo
-> Los diseñadores pueden comparar alternativas
rápidamente.
-> Pueden corregir y probar
-> El costo de los prototipos de hardware se reducen

Fig. 1.1 Áreas de aplicación de VHDL


5
C1 Introduction

Fig. 1.1 Áreas de aplicación de VHDL


6
C1 Introduction

El propósito de esta unidad es brindarle una introducción


rápida a VHDL.
• Se describe informalmente las ventajas provistas por el
lenguaje.
VHDL

No se describen completamente todos los aspectos del


lenguaje.
• Para detalles finos, consulte el Manual de referencia del
lenguaje VHDL estándar IEEE.

En la figura 1.2 se muestra el alcance de VHDL para describir


sistemas digitales.
Fig. 1.2 Niveles de Resolución de
un sistema digital con VHDL
7
C1 Introduction

VHDL

Niveles de Resolución de un sistema digital con VHDL


8
C1 Introduction

Se cubre lo suficiente del lenguaje para una escritura


sustancial.
• Se sabe que escribe programas para computadora usando
lenguajes de programación como C, Pascal, Ada o Python.

A lo largo de la guía
• La sintaxis de las características del lenguaje se presenta en
la Forma de Backus-Naur (BNF).
• Las especificaciones de la sintaxis se extraen de la Estándar
IEEE VHDL.
• Se dan ejemplos concretos para mostrar las características
del lenguaje.
• En algunos casos, se omiten algunas alternativas de BNF.
9
C1 Introduction

-> Describing Structure – Descripción estructural


Un sistema electrónico digital se puede describir como un
módulo con entradas y/o salidas, figura 1-3.
• Los valores eléctricos en las salidas son una función de los
valores de las entradas.

La Figura 1-3(a) muestra un ejemplo de un sistema digital


• El módulo F tiene dos entradas, A y B, y una salida Y.
• Usando la terminología VHDL, llamamos al módulo F como
una entidad de diseño, las entradas y salidas se llaman
puertos.

Fig 1-3. Descripción estructural


10
C1 Introduction

Fig 1-3. Descripción estructural


11
C1 Introduction

Una forma de describir la función de un módulo es


describirlo como un arreglo de submódulos.
• Cada submódulo es una instancia de alguna entidad
• Los puertos de las instancias se conectan mediante
señales.

La figura 1-3(b) muestra cómo la entidad F podría estar


compuesta de instancias de entidades G, H e I.
• Este tipo de descripción se llama descripción estructural.
• Cada una de las entidades G, H e I también podrían tener
una descripción estructural.

La descripción estructural se utiliza a nivel de chip, figura 1.4 Figura 1.4 Descomposición estructural
de un diseño a nivel de chip
12
C1 Introduction

Figura 1.4 Descomposición estructural de un diseño a nivel de chip


13
C1 Introduction

-> Describing Behaviour – Descripción funcional Hardware


En muchos casos, no es apropiado describir un módulo
estructuralmente.
• Uno de esos casos es un módulo que está en la parte Descripción Estructural
inferior de la jerarquía de alguna descripción estructural, .
.
figura 1-5. .
.
Por ejemplo, diseña un sistema usando paquetes de IC
comprados en una tienda Descripción
Funcional
• No es necesario describir la estructura interna de un IC.
• En tales casos, una descripción funcional basta para cada
módulo, sin considerar su estructura interna real.
• Tal descripción se llama descripción funcional o conductual.
Fig 1-5 Niveles de descripción de HW
14
C1 Introduction

Suponga que la función de la entidad F en la figura 1-1(a) es


la función “o” exclusiva.
• La descripción del comportamiento de F podría ser la
función booleana
Y = A’B + AB’

Comportamientos más complejos no pueden ser descritos


como una función sólo de las entradas.
• En sistemas con retroalimentación, las salidas también son
una función del tiempo.
• VHDL resuelve este problema al permitir la descripción del
comportamiento en la forma de un programa ejecutable.

15
C1 Introduction

Un ejemplo de descripción funcional sería una compuerta


and de 2 entradas

16
C1 Introduction

Un ejemplo de descripción funcional sería una compuerta


and de 2 entradas

17
C1 Introduction

-> Concepto de Señal

18
C1 Introduction

-> Modelo de un evento en tiempo discreto


Una vez especificada la estructura y el comportamiento de un
módulo, es posible simular el módulo ejecutando la
descripción de comportamiento.
• Este se realiza simulando por pasos en tiempo discreto.

En algún tiempo de simulación, una entrada del módulo


puede ser estimulada cambiando el valor en un puerto de
entrada.
• El módulo reacciona ejecutando el código de descripción
del comportamiento.

19
C1 Introduction

En la fase de inicialización
• Las señales reciben valores iniciales
• El tiempo de simulación se establece en cero
• Cada programa ejecuta el comportamiento de su módulo.

Puede dar nuevos valores a las señales que conectan a los


puertos de salida en algún momento posterior de la
simulación.
• A esto se llama programar una transacción (operación) de
la señal.
• Si un nuevo valor es diferente del valor anterior de la señal,
al ocurrir un evento, es porque los puertos de entrada de
los módulos, conectados a las señales, se activaron.
20
C1 Introduction

La simulación comienza con una fase de inicialización, luego


continúa repitiendo un ciclo de simulación en dos fases.
• Esto generalmente resulta en programar las transacciones
en las señales de salida para usarse un tiempo posterior.

En la 1ª fase de un ciclo de simulación


• El tiempo de simulación avanza al primer tiempo, en el
cual, se ha programado una transacción.
• Todas las transacciones programadas para ese momento se
ejecutan
• Esto puede causar que ocurran eventos en ciertas señales.

21
C1 Introduction

En la 2ª fase
• Los módulos que reaccionan a los eventos, que ocurrieron
en la 1ª fase, se debió a que se ejecutó su programa de
comportamiento.
• Estos programas por lo general programan más
transacciones en sus señales de salida.
• Cuando todos los programas de comportamiento
terminaron de ejecutarse, el ciclo de simulación se repite.
• Si no hay más transacciones programadas, la simulación se
ha completado.

22
C1 Introduction

El propósito de la simulación es recopilar información sobre


los cambios en el estado del sistema a lo largo del tiempo.
• Esto se hacer ejecutando la simulación bajo el control de
un monitor de simulación.

El monitor permite señales y otra información de estado para


ser visto o almacenado en un archivo de seguimiento para
análisis posterior.

También permite realizar pasos interactivos de la simulación,


proceso muy parecido a un depurador de programa
interactivo.

23
C1 Introduction

-> A Quick Example


Se da una descripción en VHDL de un contador de dos bits
para darle una idea del lenguaje y cómo se usa.
• Se comienza con la descripción de una entidad
especificando su interfaz externa, que incluye una
descripción de sus puertos.

El contador podría definirse como:


ENTITY count2 Is
GENERIC (prop_delay : Time := 10 ns);
PORT (clock : in bit;
q1, q0 : out bit);
END count2;

24
C1 Introduction

De manera explícita, en la descripción se da un valor


predeterminado de 10ns a Time.

La implementación u operación de la entidad se describe en


el cuerpo de la arquitectura.
• Puede haber muchos cuerpos de arquitecturas.
• Una entidad puede ser referida por varias arquitecturas.

Cada cuerpo de arquitectura


• Corresponde a una sola entidad.
• Describe una vista diferente de la entidad.

Por ejemplo, una descripción del comportamiento del


contador podría escribirse como: 25
C1 Introduction

architecture behaviour of count2 is


begin
count_up: process (clock)
variable count_value : natural := 0;
begin
if clock = '1' then
count_value := (count_value + 1) mod 4;
q0 <= bit'val(count_value mod 2) after prop_delay;
q1 <= bit'val(count_value / 2) after prop_delay;
end if;
end process count_up;
end behaviour;

26
C1 Introduction

De la descripción del contador:


• El comportamiento se implementa en un proceso llamado
count_up, el cual, es sensible al reloj de entrada (clock).

El cuerpo de un proceso es código


• Este se ejecuta cada vez que cualquier señal a las que es
sensible cambia de valor.

El proceso tiene una variable llamada count_value para


almacenar el estado actual del contador.

La variable se inicializa a cero al comienzo de la simulación


• Retiene su valor entre activaciones del proceso.
27
C1 Introduction

Cuando la entrada del reloj cambia de '0' a ‘1’


• La variable de estado se incrementa
• Las operaciones de los puertos de salida se programan en
función del nuevo valor, ver Figura 1-6.

Las asignaciones usan la constante genérica prop_delay para


determinar cuánto tiempo, después del cambio de reloj, se
debe programar la operación.

Cuando el control llega al final del cuerpo del proceso


• El proceso se suspende hasta que otro cambio se produce
en el reloj.
Fig 1-6. Structure of count2
28
C1 Introduction

El contador de dos bits también podría describirse como un


circuito compuesto por dos Flip-flops T y un inversor, como el
mostrado en la figura 1.6.

Su descripción en VHDL es:


architecture structure of count2 is
component t_flipflop
port (ck : in bit; q : out bit);
end component;

component inverter
port (a : in bit; y : out bit);
end component;

29
C1 Introduction

signal ff0, ff1, inv_ff0 : bit;


begin
bit_0 : t_flipflop port map (ck => clock, q => ff0);
inv : inverter port map (a => ff0, y => inv_ff0);
bit_1 : t_flipflop port map (ck => inv_ff0, q => ff1);
q0 <= ff0;
q1 <= ff1;
end structure;

30
C1 Introduction

En esta arquitectura, se declaran dos tipos de componentes y


tres señales:
• Componente t_flipflop
• Componente Inversor
• Señales: FF0, INVFF0, FF1

Cada uno componente se instancia y los puertos de las


instancias se asignan a señales y puertos de la entidad.

Por ejemplo, bit_0 es una instancia del componente t_fliflop,


con su puerto CK conectado al puerto de reloj de la entidad
count2, y su puerto q conectado a la señal interna FF0.
Fig 1-6. Structure of count2
31
C1 Introduction

Las dos últimas asignaciones de señales actualizan los


puertos de la entidad cada vez que los valores internos de las
señales cambian.

Esta descripción, estructural, es como describir las


conexiones a nivel protoboard.

32
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

1.1.1 Elementos sintácticos en VHDL


VHDL es un lenguaje de programación de propósito
específico.
• El comportamiento de un módulo digital se puede describir
en forma de lenguaje de programación.

Como todo lenguaje tiene:


• Elementos sintácticos
• Tipos de datos
• Estructuras.
• …

33
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

ELEMENTOS SINTÁCTICOS
Los elementos sintácticos de VHDL son:
• Comentarios
• Símbolos especiales
• Identificadores
• Números
• Caracteres
• Cadenas
• Cadenas de Bits
• Palabras reservadas

34
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Comentarios
Los comentarios en VHDL comienzan con dos guiones
adyacentes ('--') y se extienden a el fin de la línea.
• No tienen significado de una descripción VHDL

Ejemplo:
-- This is a comment

35
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Símbolos especiales o delimitadores.


• De un solo carácter o simples:
+ - / * () . , : ; &´ “ < > = | #
• De dos caracteres o compuestos:
** => := /= >= <= --
• Ejemplo de uso de delimitadores
ARCHITECTURE Siren_Behavioral OF Siren IS
SIGNAL term_1: BIT;
BEGIN
PROCESS (D, V, M)
BEGIN
term_1 <= D OR V;
S <= term_1 AND M;
END PROCESS;
END Siren_Behavioral; 36
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Identificadores
Los identificadores en VHDL
• Se utilizan como palabras reservadas y como nombres
definidos para programar.
• Se deben ajustarse a la regla:
identifier ::= letter { [underline ] letter_or_digit}
letra o dígito::= letra | digito
letra::= letra_mayúscula | letra_minúscula

VHDL no es sensitivo a mayúsculas y minúsculas.


• Identificadores cat y Cat son iguales, al igual que Bit, bit, BIT

Caracteres subrayados en los identificadores son significativos


• Los identificadores This_Name y ThisName son diferentes.
37
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

El identificador
• Da nombre a variables, señales, rutinas, ...
• Es un nombre compuesto por letras, números y símbolo de
subrayado “_”.
• No debe contener símbolos especiales
• No debe contener palabras claves del VHDL
• No debe empezar por un número o subrayado.
• No debe acabar con un subrayado
• No debe haber dos subrayados seguidos.
• Las mayúsculas o minúsculas son consideradas iguales.
• Ejemplo
SIGNAL x: STD_LOGIC;
SIGNAL y: STD_LOGIC_VECTOR(7 DOWNTO 0);
x <= 'Z’;
38
y <= "001-";
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Números
Números
Los literales números pueden expresarse en decimal o en una • Base 10
base entre dos y dieciséis. • Notación científica
• Si el literal incluye un punto, representa un número real • Base hexadecimal 16#82
• Si el literal no tiene punto, representa un número entero. • Base Binaria 2#10000010

Los literales de base decimal tienen la sintaxis:


decimal_literal ::= integer [ . integer ] [ exponent ]
integer ::= digit { [ underline ] digit }
exponent ::= E [ + ] integer | E - integer

Algunos ejemplos son:


0 1 123_456_789 987E6 -- integer literals
0.0 0.5 2.718_28 12.4E-9 -- real literals
39
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

Los literales de número con base no decimal su sintaxis es:


based_literal ::= base#based_integer[.based_integer ]# [exponent]
base ::= integer
based_integer ::= extended_digit { [ underline ] extended_digit }
extended_digit ::= digit | letter

La base y el exponente se expresan en decimal,


• El exponente indica la potencia de la base por la que se
multiplica el literal.
• Las letras A a F (mayúsculas o minúsculas) se utilizan como
dígitos extendidos para representar 10 a 15.

40
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

Algunos ejemplos son:


Números
2#1100_0100# 16#C4# 4#301#E1 – Entero 196
• Base 10
2#1.1111_1111_111#E+11 16#F.FF#E2 – Entero real 4095.0 • Notación científica
• Base hexadecimal 16#82
Cualquier número se considera que se encuentra en base 10. • Base Binaria 2#10000010
• Se admite la notación científica convencional para números
en punto flotante.
• Es posible manejar números en otras bases utilizando el
símbolo del sostenido “#”, ejemplo: 2#11000100# y 16#c4#
representan el entero 196.

41
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Caracteres.
Los literales de caracteres se forman encerrando un carácter
ASCII en comillas simples como ´1´, ´3´, ´t´ .

Ejemplo
'A’ '*’ ‘’’ ‘ ‘
x <= '1’;
y <= ‘Z’;

42
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Cadenas.
Cadenas
Las cadenas de caracteres se forman encerrando los
caracteres en comillas dobles. “ Esto es una cadena: Base 10”
• Para incluir una comilla doble en una cadena, se deben
juntar dos comillas dobles.
• Ejemplo “Mi cadena”

Una cadena se puede utilizar como valor para un objeto que


es una matriz de caracteres.

Ejemplos de cadenas:
"A string"
"" -- empty string
"A string in a string:“"A string"". “ -- contains quote marks
43
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

Las Cadenas de bits. Cadena de bits


VHDL proporciona una forma conveniente de especificar B”11101001”
valores literales para matrices del tipo bit ('0's y '1’s), O”126”
X”FE”.
Sintaxis
bit_string_literal ::= base_specifier " bit_value "
base_specifier ::= B | O | X
bit_value ::= extended_digit {[underline] extended_digit }

El especificador de base B es para binario, O octal y X


hexadecimal, algunos ejemplos son:
B"1010110" -- length is 7
O"126" -- length is 9, equivalent to B"001_010_110"
X"56" -- length is 8, equivalent to B"0101_0110"
44
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

Los tipos bit y bit_vector son de tipo carácter y matriz de


caracteres respectivamente.

En VHDL la forma elegante de definir números con estos tipos


es mediante la cadena de bits
• Según la base en que se especifique el número, se pone un
prefijo B (binario), O (octal), o X (hexa).
• Ejemplos: B”11101001”, O”126”, X”FE”.
• Ejemplo
y <= “0010”;
TYPE byte IS ARRAY(7 DOWNTO 0) OF BIT;
TYPE memory_type IS ARRAY(1 TO 128) OF byte;
SIGNAL memory: memory_type;
memory(3) <= "00101101";
45
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

-> Palabras reservadas


Son aquellas que tienen un significado especial en el
lenguaje.
• Son instrucciones, órdenes y elementos que permiten
definir sentencias.

La tabla 1.1 muestra las palabras clave del VHDL`87

Ejemplo
ENTITY Siren IS
PORT ( M: IN BIT;
D: IN BIT;
V: IN BIT;
S: OUT BIT);
END Siren;
46
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

Tabla 1.1 Palabras clave del VHDL`87

47
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.1 Elementos sintácticos en VHDL

La tabla 2 muestra las palabras que se agregaron a VHDL`87


surgiendo la tabla VHDL`93.

La sintaxis del VHDL es estricta con respecto a los tipos de Tabla 1.2 Palabras clave agregadas, VHDL’93
datos.

48
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

1.1.2 Operadores y expresiones en VHDL

-> Expresiones en VHDL


En VHDL, las expresiones son muy parecidas a las expresiones
de otros lenguajes de programación.
• Realizan cálculos aritméticos o lógicos

Una expresión aritmética representa fórmulas matemáticas y


utiliza operadores aritméticos

Una expresión lógica representa funciones lógicas y utiliza


operadores lógicos.

49
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Una expresión es una fórmula o relación que combina


operandos y operadores.
• El operador especifica el cálculo a realizar
• Los operandos son los datos para el cálculo.

Ejemplo 1

ARCHITECTURE Siren_Dataflow OF Siren IS


SIGNAL term_1: BIT;
BEGIN
term_1 <= D OR V; -- expresión
S <= term_1 AND M; -- expresión
END Siren_Dataflow

50
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Ejemplo 2
-- outputs a “1” if the 4-bit input is a prime number, “0” otherwise.
ENTITY Prime IS PORT (
number: IN BIT_VECTOR(3 DOWNTO 0);
yes: OUT BIT);
END Prime;

ARCHITECTURE Prime_Dataflow OF Prime IS


BEGIN
WITH number SELECT
yes <= '1' WHEN "0001" | "0010“ | '1' WHEN "0011" | "0101" |
"0111" | "1011" | "1101“;
'0' WHEN OTHERS;
END Prime_Dataflow;
51
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Las expresiones se utilizan en las descripciones de diseño


como:
• Asignación de variables o señales
• Inicialización de valores de constantes
• Operandos para otros operadores
• Retornar de valor de las funciones
• Parámetros de IN en el llamado a un subprograma
• Parámetros de OUT de un cuerpo de un procedimiento
• Controlar las acciones en las declaraciones if, loop y case

52
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-> OPERADORES
Un operador en VHDL se caracteriza por:
• Nombre
• Función o cómputo
• Número de operandos
• Tipos de operandos
• Tipo del valor resultado

Puede definer nuevos operadores como funciones para


cualquier tipo de operando y valor del resultado.

53
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Operadores en VHDL predefinidos


Los operadores predefinidos en VHDL que se utilizan en las
expresiones son:
• Operadores lógicos
• Operadores de relación
• Operadores de suma
• Operadores unarios (Signo)
• Operadores de multiplicación
• Miscelánea de operadores aritméticos

54
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Cada fila de la tabla enumera operadores con la misma


precedencia.
• Cada una de las filas tienen mayor precedencia que los de la
fila anterior.
• La precedencia de un operador determina si se aplica antes
o después de operadores contiguos.

El siguiente ejemplo muestra varias expresiones y sus


interpretaciones

A+B*C = A + (B * C)
not BOOL and (NUM = 4)= (not BOOL) and (NUM = 4)

55
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

VHDL permite que los operadores existentes se


sobrecarguen, es decir, se apliquen a nuevos tipos de
operandos.

Por ejemplo, el operador AND puede estar sobrecargado para


trabajar con un nuevo tipo de lógica.

56
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operadores Lógicos
Los operadores lógicos AND, OR, NAND, NOR, XOR y NOT
operan:
• Sobre valores de tipo bit o booleano
• Sobre arreglos unidimensionales de estos tipos.
• Para operandos de matriz, la operación se aplica entre los
elementos correspondientes de cada matriz, produciendo
una matriz de la misma longitud que el resultado.

Para operandos de bit y booleanos


• AND, OR, NAND, y NOR son operadores de 'corto circuito’,
es decir, solo evalúan su operando derecho si el operando
izquierdo no determina el resultado.
57
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

• AND y NAND solo evalúan el operando derecho si el ARCHITECTURE Siren_Structural


operando izquierdo es verdadero o ‘1’, OF Siren IS
• O y NOR solo evalúan el operando derecho si el operando COMPONENT myOR PORT (
izquierdo es falso o '0’. in1, in2: IN BIT;
out1: OUT BIT);
END COMPONENT;
Los operandos de un operador lógico deben ser del mismo
tipo. SIGNAL term1: BIT;
BEGIN
U0: myOR PORT MAP (D, V,
Los operadores lógicas AND, OR, NAND, NOR, XOR y NOT term1);
aceptan operandos del tipo: S <= term1 AND M;
• BIT --ver código END Siren_Structural;
• BOOLEAN
• Matrices unidimensionales de BIT o BOOLEAN.
58
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Los operandos de matriz deben tener el mismo tamaño.


• Un operador lógico aplicado a dos operandos de matriz se
aplica a pares de los dos elementos de las matrices.

59
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

El siguiente ejemplo muestra declaraciones de señales lógicas


y sus operaciones.
signal A, B, C: BIT_VECTOR(3 downto 0);
signal D, E, F, G: BIT_VECTOR(1 downto 0);
signal H, I, J, K: BIT;
signal L, M, N, O, P: BOOLEAN;
A <= B and C;
D <= E or F or G;
H <= (I nand J) nand K;
L <= (M xor N) and (O xor P);

Si tiene más de dos operandos en una expresión, utilice


paréntesis para agrupar los operandos.
Esquemáticos de operadores lógicos
60
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Esquemáticos de operadores lógicos


61
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Una excepción es que puede combinar una secuencia de


operadores AND, OR, XNOR o XOR sin paréntesis, como la
siguiente secuencia que usa el mismo operador: Y.
A and B and C and D.

Sin embargo, una secuencia que contiene más de uno de


estos operadores requiere paréntesis para indicar que dos
operandos se van a emparejar.

En la siguiente sentencia, AND es el primer operador y OR es


el segundo.
A and B or C

62
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Un paréntesis debe ser usado en una de las siguientes dos


formas:
(A and B) or C
o
A and (B or C)

63
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operadores de relación
Los operadores relacionales son: =, /=, <, <=, > y >=
• Deben tener ambos operandos del mismo tipo
• Producen resultados booleanos.

Los operadores de (=) o (>)


• Comparan dos operandos del mismo tipo
• Devuelve un valor BOOLEANO.

IEEE VHDL define los operadores de igualdad (=) y desigualdad


(/ =)
• Pueden tener operandos de cualquier tipo.

64
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Dos operandos son iguales si representan el mismo valor.

Para tipos compuestos,


• Dos valores son iguales si todos sus elementos
correspondientes son iguales.
• En tipos matrices y registros, IEEE VHDL compara los
correspondientes elementos de los operandos.

Los operadores restantes


• Deben tener operandos que sean tipos escalares o arreglos
unidimensionales de tipos discretos

65
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

IEEE VHDL define los operadores de orden (<, <=, > y > =)
para:
• Todos tipos enumerados
• Tipos enteros
• Matrices unidimensionales de enumeración o tipos enteros.

El orden interno de los valores de un tipo determina el


resultado de los operadores pedidos.
• Los valores enteros se ordenan desde el infinito negativo al
infinito positivo.
• Los valores enumerados están en el mismo orden que
fueron declarados, a menos que haya cambiado la
codificación.
66
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Si un par de elementos de la matriz no es igual


• El orden de los diferentes elementos, determinan el orden
de las matrices.
• Ejemplo, el vector de bits "101011" es menor que "1011"
porque el cuarto bit de cada vector es diferente y "0" es
menor que "1".

Si las dos matrices tienen diferentes longitudes y la matriz


más corta coincide con la primera parte de la matriz más larga
• La más corta está ordenada antes de que pase más tiempo.
• Por lo tanto, el vector de bits "10" es menor que "101000".

67
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Las matrices están ordenadas alfabéticamente.


• Las matrices se comparan de izquierda a derecha,
independientemente del rango de sus índices (to or down).

El siguiente ejemplo muestra varias expresiones que evalúan


CIERTO.
’1’ = ’1’
"101" = "101"
"1" > "011" -- Comparación con signo
"101" < "110“

68
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Para interpretar vectores de bits como "011" números


binarios con o sin signo, use los operadores relacionales
definidos en el paquete std_logic_arith

La tercera línea en el ejemplo anterior evalúa FALSO si los


operandos son del tipo sin signo.

unsigned’ "1" < unsigned’ "011" -- comparación numérica

El siguiente ejemplo muestra algunas expresiones


relacionales.
• Los circuitos sintetizados resultantes sintetizado se
muestran
69
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

signal A, B: BIT_VECTOR(3 downto 0);


signal C, D: BIT_VECTOR(1 downto 0);
signal E, F, G, H, I, J: BOOLEAN;
G <= (A = B);
H <= (C < D);
I <= (C >= D);
J <= (E > F);

Circuitos Operadores de Relación


70
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operadores de suma
Los operadores de adición incluyen
• Operadores aritméticos
• Operadores de concatenación.

Los operadores aritméticos (+) y (-) están predefinidos para


todos los operandos enteros.
• Estos operadores de suma y resta realizan operaciones
convencionales aritméticas.

El operador de concatenación (&) está predefinido para todos


los operandos de arreglos unidimensionales.

71
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

El operador de concatenación construye arreglos al combinar


operandos.

Cada operando de la concatenación (&) puede ser una matriz


o un elemento de una matriz.

Use (&) para agregar un elemento al principio o final de una


matriz, para combinar dos matrices, o para construir una
matriz de elementos, como se muestra en los siguientes
ejemplos.

Los circuitos esquemáticos se muestran.

72
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

signal A, D: BIT_VECTOR(3 downto 0);


signal B, C, G: BIT_VECTOR(1 downto 0);
signal E: BIT_VECTOR(2 downto 0);
signal F, H, I: BIT;
signal J, K, L: INTEGER range 0 to 3;

A <= not B & not C; -- Array & array


D <= not E & not F; -- Array & element
G <= not H & not I; -- Element & element
J <= K + L; -- Simple addition

Operadores de suma
73
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Ejemplo
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;

ENTITY AddSub IS
GENERIC(n: NATURAL :=8); -- default number of bits = 8
PORT(A: IN std_logic_vector(n-1 downto 0);
B: IN std_logic_vector(n-1 downto 0);
subtract: IN std_logic;
carry: OUT std_logic;
sum: OUT std_logic_vector(n-1 downto 0));
END AddSub;
74
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

ARCHITECTURE Behavioral OF AddSub IS


-- temporary result with one extra bit for carry
SIGNAL result: std_logic_vector(n downto 0);

BEGIN
PROCESS(subtract, A, B)
BEGIN
IF (subtract = '0') THEN -- addition add the two
-- operands with one extra bit for carry
result <= ('0' & A)+('0' & B);
sum <= result(n-1 downto 0); -- extract the n-bit result
carry <= result(n); -- extract the carry bit from
--result

75
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

ELSE -- subtraction
result <= ('0' & A)-('0' & B);
sum <= result(n-1 downto 0); -- extract the n-bit result
carry <= result(n); -- extract the borrow bit from
-- result
END IF;
END Behavioral;

76
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operadores Unarios (con signo)


Un operador unario tiene sólo un operando.

Fundación Express predefine los operadores unarios + y - para


todos los tipos de enteros.

El operador “+” no tiene efecto.

El operador “-” niega su operando como se muestra:


5 = +5
5 = - (- 5)

77
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

El siguiente ejemplo muestra cómo se sintetiza


la negación unaria.

El diseño resultante sigue el ejemplo.


signal A, B: INTEGER range -8 to 7;
A <= -B;

Negación Unaria
78
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operadores de multiplicación
Foundation Express predefine los operadores de
multiplicación (*, /, mod, y rem) para todos los tipos enteros.

Impone restricciones a los valores admitidos para los


operandos de los operadores multiplicadores como sigue:
* -- Multiplicación de enteros, sin restricciones
/ - - División de enteros, El operando de la derecha
-- debe ser potencia de 2 y no puede ser negativo.
-- Este operador se implementa como un --
-- desplazamiento de bit.
Mod -- Módulo
Rem -- residuo
79
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

El siguiente ejemplo muestra algunos usos de los


operadores de multiplicación cuyos operandos
derechos son todas potencias de 2.

El circuito sintetizado se muestra.

signal A, B, C, D, E, F, G, H: INTEGER range 0 to 15;


A <= B * 4;
C <= D / 4;
E <= F mod 4;
G <= H rem 4;

Operadores de multiplicación
80
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Miscelánea de operadores de multiplicación.


Foundation Express predefine los operadores para el valor
absoluto (abs) y la exponenciación (**), para todos los tipos
de enteros.

Hay una restricción, está colocado en el operador **.


• Cuando usa ** exponenciación, el operando izquierdo debe
ser el valor múltiplo de 2

El siguiente ejemplo muestra cómo se utilizan estos


operadores y se muestran los circuitos

81
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

signal A, B: INTEGER range -8 to 7;


signal C: INTEGER range 0 to 15;
signal D: INTEGER range 0 to 3;
A <= abs(B);
C <= 2 ** D;

Miscelánea de operadores aritméticos


82
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Tabla de operadores

83
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

--Operandos
Los operandos especifican los datos que el operador usa para
calcular su valor.
• Un operando devuelve su valor al operador.

Los operandos se caracterizan por:


• Nombres de objetos
• Literales
• Llamadas a funciones
• Expresiones entre paréntesis.

84
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

El operando más simple es:


• Una literal como el número 7, o un identificador, como una
variable o nombre de la señal.
• Un operando en sí mismo puede ser una expresión

Las categorías de operandos son:


• Agregados: my_array_type’ (otros => 1)
• Atributos: my_array’range
• Expresiones: (A nand B)
• Llamadas a funciones: LOOKUP_VAL (my_var_1, my_var_2)
• Identificadores: my_var, my_sig
• Nombres indexados: my_array (7)
• Literales: ‘0’, "101", 435, 16#FF3E#
85
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

• Expresiones calificadas: BIT_VECTOR’(’1’ & ’0’)


• Registros y campos: my_record.a_field
• Nombres de sectores: my_array (7 a 11)
• Tipo de conversiones: THREE_STATE ('0')

86
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operando Bit-Width
Foundation Express utiliza el ancho de bits del operando más
grande para determinar el ancho de bits necesario para
implementar un operador en un circuito.

Por ejemplo, un operando INTEGER tiene un ancho de 32 bits


por defecto.
• La suma de dos operandos INTEGER hace que Foundation
Express construya un sumador de 32 bits.

Para utilizar los recursos de hardware de manera eficiente,


• Siempre indique el ancho de bits de operandos numéricos.

87
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Por ejemplo, use un subrango de INTEGER cuando declare


tipos, variables o señales.

Ejemplo:
type ENOUGH: INTEGER range 0 to 255;
variable WIDE: INTEGER range -1024 to 1023;
signal NARROW: INTEGER range 0 to 7;

Durante la optimización Foundation Express remueve del


hardware los bits no usados.

88
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Operandos computables
Algunos operadores, como el de división, restringen sus
operandos a ser calculables.
• Un operando calculable es aquel cuyo valor puede ser
determinado por Foundation Express.
• La computabilidad es importante porque las expresiones no
computables pueden requerir puertas lógicas para
determinar su valor.

Ejemplos de operandos computables son:


• Valores de las literales.
• Parámetros del bucle For ... loop, cuando el rango del bucle
es computable
89
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

• Variables a las que se les asigna una expresión computable


• Agregados que contienen solo expresiones computables
• Llamadas a funciones con un valor de retorno computable
• Expresiones con operando computables
• Expresiones calificadas cuando la expresión es computable
• Tipos de conversiones cuando la expresión es computable
• Valor de los operadores AND o NAND cuando uno de los
operandos es un "0" computable
• Valor de los operadores OR o NOR cuando uno de los
operandos es un "1" computable

90
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

Además, a una variable se le da un valor computable si es un


parámetro de OUT o INOUT de un procedimiento que le
asigna un valor computable.

Ejemplos de operandos no computables son


• Señales
• Puertos
• Variables asignadas a diferentes valores computables que
dependen de una condición no computable.
• Variables asignadas a valores no computables

91
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Código con definiciones y declaraciones seguidos de


-- expresiones calculables y no claculables.

signal S: BIT;
...
function MUX(A, B, C: BIT) return BIT is
begin
if (C = ’1’) then
return(A);
else
return(B);
end if;
end;

92
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

procedure COMP(A: in BIT; B: out BIT) is


begin
B := not A;
end;

process(S)
variable V0, V1, V2: BIT;
variable V_INT: INTEGER;
subtype MY_ARRAY is BIT_VECTOR(0 to 3);
variable V_ARRAY: MY_ARRAY;
begin
V0 := ’1’; -- Computable (value is ’1’)
V1 := V0; -- Computable (value is ’1’)

93
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

V2 := not V1; -- Computable (value is ’0’)


for I in 0 to 3 loop
V_INT := I;
-- Computable (value depends on iteration) end loop;

V_ARRAY := MY_ARRAY’(V1, V2, ’0’, ’0’);


-- Computable -- ("1000")
V1 := MUX(V0, V1, V2); -- Computable (value is ’1’)
COMP(V1, V2);
V1 := V2; -- Computable (value is ’0’)
V0 := S and ’0’; -- Computable (value is ’0’)
V1 := MUX(S, ’1’, ’0’); -- Computable (value is ’1’)
V1 := MUX(’1’, ’1’, S); -- Computable (value is ’1’)

94
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

if (S = ’1’) then
V2:= ’0’; -- Computable (value is ’0’)
else
V2 := ’1’; -- Computable (value is ’1’)
end if;
V0 := V2; -- Noncomputable; V2 depends on S
V1 := S; -- Noncomputable; S is signal
V2 := V1; -- Noncomputable; V1 is no longer
--computable
end process;

95
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

-- Ejemplo de manejo de Expresiones.


En un sistema de seguridad de un automóvil, se quiere
conectar la sirena de tal manera que la sirena se active
cuando esté activado por uno o más sensores.

Habrá un interruptor principal para encender o apagar el


sistema.

Suponga que hay tres interruptores.


• Un interruptor de puerta de automóvil D
• Un interruptor de detector de vibración V
• Un interruptor maestro M.

96
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

• Si la puerta se abre D = 1, de lo contrario, D = 0.


• Si el automóvil está siendo sacudido, V=1, de lo contrario,
V=0.
• La sirena S se encienda (S=1) si:
• S = 1 si D = 1 o V = 1
• S = 1 si cuando ambos D = 1 y V = 1
• Esto funciona si solo el sistema está encendido, M = 1.
• Cuando se apaga el sistema, ​ya sea que ingrese o conduzca
el automóvil, no queremos que la sirena se encienda.
• Por tanto, cuando M = 0, no importa qué valores tienen
D y V, la sirena debe permanecer apagada.

97
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

La tabla de verdad se muestra y la expresión Booleana de S: Tabla V Sirena Automóvil


S = (M AND (NOT D) AND V) OR (M AND D AND (NOT V))
OR (M AND D AND V)

Como función Booleana


S = (MD' V) + (MD V') + (MD V)

--El código en VHDL es:


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;

ENTITY Sirena IS
PORT (M: IN STD_LOGIC;

98
C1 Programación VHDL 1.1 Elementos del lenguaje VHDL

1.1.2 Operadores y expresiones en VHDL

D: IN STD_LOGIC;
V: IN STD_LOGIC;
S: OUT STD_LOGIC);
END Sirena;

ARCHITECTURE Dataflow OF Siren IS


SIGNAL term_1, term_2, term_3: STD_LOGIC;
BEGIN
term_1 <= M AND (NOT D) AND V;
term_2 <= M AND D AND (NOT V);
term_3 <= M AND D AND V;
S <= term_1 OR term_2 OR term_3;
END Dataflow;

Circuito - sirena automóvil


99
1.2 Declaración básica de objetos

100
C1 Programación VHDL 1.2 Declaración básica de objetos

Objetos en VHDL
Un objeto en VHDL es un elemento del lenguaje que tiene un
nombre en una descripción HVDL con un valor de tipo
especifico, por ejemplo, un valor del tipo bit.

En VHDL hay cuatro clases de objetos:


1. Constantes
2. Variables.
3. Señales
4. Archivos

101
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.1 Declaración de señales

1.2.1 Declaración de señales


Son objetos utilizados como alambres que permiten simular la
conexión de componentes o submódulos dentro de una
arquitectura de diseño.

Las señales permiten representar entradas o salidas de


entidades
• No tienen una terminal externa al dispositivo.

El circuito muestra las señales etiquetadas como x0 y x1


• No tienen asignada una terminal en la entidad de diseño
• Sólo funcionan como un medio para interconectar las
compuertas lógicas del circuito.
102
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.1 Declaración de señales

La sintaxis para declarar una señal es:


signal_declaration::=signal identifier_list: subtype_indication [signal_kind] [:=expression] ;
signal_kind::= register | bus

o signal identificador: tipo: [rango]

Ejemplos
signaI vcc: bit:´1‘
signal suma: bit_vector (3 downto 0);

Omitiendo el tipo de señal da como resultado una señal


ordinaria del subtipo especificado.

103
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.1 Declaración de señales

La expresión en la declaración se utiliza para dar a la señal un


valor inicial durante la fase de inicialización de la simulación.

Si se omite la expresión
• Se le asignará un valor inicial predeterminado.

Un punto importante a tener en cuenta es que los puertos de


un objeto se tratan exactamente como señales dentro de ese
objeto.

104
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.2 Declaración de archivos

1.2.2 Declaración de archivos


Un archivo es un objeto que permite la comunicación del
diseño con su entorno exterior.
• Con el archivo puede leer y escribir datos cuando se hacen
evaluaciones del circuito
• Un archivo es de un tipo de datos determinado y sólo
puede almacenar datos de ese tipo.

La sintaxis para declarar un archivo es:


file identificador: tipo archivo is [dirección "nombre";]

Ejemplos
file operaciones: Archivo_Enteros is in "datos.in";
file salidas: Archivo_Enteros is out "datos.out"; 105
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

1.2.3 Declaración de constantes


La declaración y uso de constantes y variables es muy
parecido a su uso en lenguajes de programación de propósito
general.

Una constante es un objeto :


• Que se inicializa a un valor especificado cuando se crea
• No podrá ser modificado posteriormente.

Las constantes se usan para comprender mejor el código


• Permiten identificar con más facilidad el valor que se les
asignó.

106
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

La sintaxis para declarar una constante es:


constant_declaration::= constant identifier_list: subtype_indication[:= expression];
o como
constant identificador: tipo := expresión;

Las declaraciones de constantes a las que les falta la


expresión de inicialización, se les denomina constante
diferida
• La constante diferida sólo aparece en declaraciones de
paquetes .
• El valor inicial debe ser dado en el cuerpo del paquete
correspondiente.

107
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

Ejemplos
constant Vcc: real: = 5.0;
constant cinco: integer: = 3 + 2;
constant tiempo: time := 100 ps;
constant valores: bit_vector := "10100011";

Las constantes requieren de:


• Un identificador (nombre)
• Un tipo de datos
• Una expresión que asigne un valor especifico.

Las constantes son válidas en la unidad de diseño donde se


declaran.
108
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

• Una constante definida en una declaración de entidad es


visible sólo dentro de la entidad.

Ejemplo
Si la constante se declara en la arquitectura, nada más es
visible en la arquitectura.
• Si se define en la región de declaraciones de un proceso,
sólo es visible para ese proceso.

109
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

-- Ejemplo un circuito divisor de frecuencia


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;

ENTITY clockdiv IS PORT (


clock_25Mhz: IN STD_LOGIC;
clk: OUT STD_LOGIC);
END clockdiv;

ARCHITECTURE Behavior OF clockdiv IS


CONSTANT max: INTEGER := 25000000;
CONSTANT half: INTEGER := max/2;

SIGNAL count: INTEGER RANGE 0 TO max;


SIGNAL toggle: STD_LOGIC;
110
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

BEGIN
PROCESS
BEGIN
WAIT UNTIL clock_25Mhz'EVENT and clock_25Mhz='1’;
IF count < max THEN
count <= count + 1;
ELSE
count <= 0;
END IF;
IF count < half THEN
toggle <= '0’;
ELSE
toggle <= '1’;
END IF;
clk <= toggle;
111
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.3 Declaración de constantes

END PROCESS;
END Behavior;

112
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

1.2.4 Declaración de variables.


Una variable es un objeto que tiene asignado un valor que
cambia continuamente dentro del programa.
• Las variables se utilizan para manejar datos aleatorios o
que no tienen un valor específico.

La sintaxis para declarar una variable es:


variable_declaration::=variable identifier_list: subtype_indication[:= expression];

o como
variable identificador: tipo rango:[expresión] ;

EJEMPLO
VARIABLE v1, v2: bit:= ‘1’;
113
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

La expresión de valor inicial, si está presente, se evalúa y


asigna a la variable cuando se crea.
• Si la expresión está ausente, un valor predeterminado es
asignado cuando se crea la variable.

El valor predeterminado para los tipos escalares es:


• El valor más a la izquierda del tipo, que es el primero en la
lista de un tipo enumerado.
• El más pequeño será para un rango ascendente
• El más alto será para un rango descendente.

114
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

Si la variable es de tipo compuesto


• El valor predeterminado es el compuesto de los valores
predeterminados para cada elemento, en función de los
tipos de elementos.

Algunos ejemplos de declaraciones de variables:


variable count : natural := 0;
variable trace : trace_array;

Suponiendo que el tipo trace_array es una matriz de valores


booleanos
• El valor inicial de la variable trace es una matriz con todos
los elementos que tienen el valor falso.
115
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

Dado un objeto existente


• Es posible darle un nombre alternativo al objeto o parte de
él.
• Esto se hace usando una declaración de alias.

La sintaxis es:
alias_declaration::= alias identifier: subtype_indication is name ;

Una referencia a un alias se interpreta como una referencia al


objeto o parte correspondiente al alias.

Por ejemplo:
variable instr : bit_vector(31 downto 0);
alias op_code : bit_vector(7 downto 0) is instr(31 downto 24);
116
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

Declara que el nombre op_code es un alias para los ocho bits


más a la izquierda de instr.

Ejemplos
variable contador: bit_vector (0 to 7);
variable x, y: integer;

Las variables no pueden proyectar formas de onda a su salida


debido a que su valor cambia constantemente, por lo que es
imposible establecer un valor en cierto instante de tiempo.

-- Ejemplo Contador binario 4 bits Up – Down


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; 117
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

ENTITY udcounter IS PORT (


Clock: IN STD_LOGIC;
Clear: IN STD_LOGIC;
Count: IN STD_LOGIC;
Down: IN STD_LOGIC;
Q: OUT INTEGER RANGE 0 TO 15);
END udcounter;

ARCHITECTURE Behavioral OF udcounter IS


BEGIN
PROCESS (Clock, Clear)
VARIABLE value: INTEGER RANGE 0 TO 15;
BEGIN
IF Clear = '1' THEN
value := 0;
118
C1 Programación VHDL 1.2 Declaración básica de objetos

1.2.4 Declaración de variables

ELSIF (Clock'EVENT AND Clock='1') THEN


IF Count = '1' THEN
IF Down = '0' THEN
value := value + 1;
ELSE
value := value - 1;
END IF;
END IF;
END IF;
Q <= value;
END PROCESS;
END Behavioral;

119
1.3 Declaraciones Concurrentes

120
C1 Programación VHDL 1.3 Declaraciones concurrentes

1.3 Declaraciones concurrentes


Una asignación concurrente es una forma compacta de
describir un proceso que asigna a una señal una onda
seleccionada por un conjunto de condiciones o por una
expresión de control.
• Permite escribir programas VHDL con un estilo de flujo de
datos, conocido como transferencia de registros (RTL).
• Es asignar valores a señales, fuera de un proceso, para
modelar de manera compacta la lógica combinacional.

Las declaraciones concurrentes funcionan como procesos


implícitos y se ejecutan concurrentemente con el resto de los
procesos y asignaciones.
121
C1 Programación VHDL 1.3 Declaraciones concurrentes

La sentencia principal concurrente en VHDL es process.


• El proceso define los límites de un dominio secuencial.

VHDL proporciona una notación abreviada llamada


declaración de asignación de señal concurrente, para
expresar tal proceso, la sintaxis es:

concurrent_signal_assignment_statement::=
[label:]conditional_signal_assignment | [label:] selected_signal_assignment

Para cada tipo de asignación de señal concurrente, hay una


declaración del proceso correspondiente con el mismo
significado.

122
C1 Programación VHDL 1.3 Declaraciones concurrentes

identifier <= expression


• Ejemplo s <= (a and b) + c;

Hay tres tipos de declaraciones concurrentes


A Asignaciones simples
s <= (a and b) + c;

B. Asignaciones condicionales
s <= a when c='1' else b;

C Asignaciones con selección


with a+b select
s <= d when "0000",
e when "1010",
'0' when others; 123
C1 Programación VHDL 1.3 Declaraciones concurrentes

A. Asignaciones concurrentes simples


A una señal se le asigna un valor que proviene de una
expresión, que puede ser tan compleja como queramos

s <= ((a+b) * c) and d;

Esta expresión es equivalente al siguiente proceso:


process(a,b,c,d);
begin
s <= ((a+b) * c) and d;
end process

Se pueden utilizar todos los operadores que queramos, tanto


los predefinidos como los que importemos de las librerías
124
C1 Programación VHDL 1.3 Declaraciones concurrentes

B. Asignaciones concurrentes condicionales


Una declaración de una asignación de una señal concurrente
condicional es una forma abreviada de un proceso que
contiene asignaciones de señales en una instrucción if, la
sintaxis es:

conditional_signal_assignment ::= target <= options conditional_waveforms;


options::= [ guarded ] [ transport ]
conditional_waveforms::= {waveform when condition else} waveform

El uso de la palabra guarded no se cubre en esta guía.

125
C1 Programación VHDL 1.3 Declaraciones concurrentes

Si la palabra transport se incluye, entonces la asignación de


señal en el proceso equivalente usa un retardo transport.

Supongamos que tenemos una asignación de señal


condicional:

s <= waveform_1 when condition_1 else


waveform_2 when condition_2 else

waveform_n;

Entonces, el proceso equivalente es:


process
if condition_1 then
126
C1 Programación VHDL 1.3 Declaraciones concurrentes

s <= waveform_1;
elsif condition_2 then
s <= waveform_2;
elsif …
else
s <= waveform_n;
wait [ sensitivity_clause ];
end process;

Si ninguna de las expresiones o condiciones de valor de forma


de onda contiene una referencia a una señal, entonces la
declaración de fin del equivalente proceso equivalente no
tiene una cláusula de sensibilidad.
• Esto significa que después de la asignación realizada, el
proceso se suspende indefinidamente. 127
C1 Programación VHDL 1.3 Declaraciones concurrentes

Por ejemplo, la asignación condicional :

reset <= '1', '0' after 10 ns when short_pulse_required


else '1', '0' after 50 ns;

Se programan dos transacciones para el restablecimiento de


la señal, luego suspende el resto de la simulación

Por otro lado, si hay referencias a señales en los valores de las


formas de onda de las expresiones o condiciones, entonces si
la declaración de espera tiene una lista sensitiva que contiene
todas las señales a las que se hace referencia, la condicional
de asignación es:
128
C1 Programación VHDL 1.3 Declaraciones concurrentes

mux_out <= 'Z' after Tpd when en = '0' else


in_0 after Tpd when sel = '0' else
in_1 after Tpd;

es sensible a las señales en y sel. El proceso se activa durante


la fase de inicialización cada vez que cambie de valor en o sel.

El caso degenerado de una asignación de señal condicional,


que no contiene partes condicionales, es equivalente a un
proceso que contiene solo una señal sentencia de asignación.
Entonces:

s <= waveform;

129
C1 Programación VHDL 1.3 Declaraciones concurrentes

Es equivalente a:
process
s <= waveform;
wait [ sensitivity_clause ];
end process;

Ejemplo
A una señal se le asigna valores dependiendo de si cumplen
las condiciones que se van evaluando.

architecture prioridadBit of coder is


begin
s <= "111" when a(7)='1' else
"110" when a(6)='1' else
"101" when a(5)='1' else 130
C1 Programación VHDL 1.3 Declaraciones concurrentes

"100" when a(4)='1' else


"011" when a(3)='1' else
"010" when a(2)='1' else
"001" when a(1)='1' else
"000";
end architecture prioridadBit;

Por su ejecución en cascada es similar a la estructura


IF….THEN…ELSE

Pueden generarse problemas de memoria implícita si no se


pone el último else.

131
C1 Programación VHDL 1.3 Declaraciones concurrentes

C. Asignaciones concurrentes con selección


Una declaración de una señal concurrente con selección en
forma abreviada para un proceso contiene la declaración
case, su sintaxis es:
selected_signal_assignment::= with expression select target <= options selected_waveforms;
selected_waveforms::= {waveform when choices,}
waveform when choices
choices ::= choice { | choice }

La parte de opciones es la misma que para una asignación de


señal condicional.

132
C1 Programación VHDL 1.3 Declaraciones concurrentes

Sí incluye la palabra transport, entonces la asignación de


señales en el proceso equivalente usa el retardo transport.

with expression select


s <= waveform_1 when choice_list_1,
waveform_2 when choice_list_2,

waveform_n when choice_list_n;

El proceso equivalente es:


process
case expression is
when choice_list_1=>
s <= waveform_1; 133
C1 Programación VHDL 1.3 Declaraciones concurrentes

when choice_list_2=>
s <= waveform_2;

when choice_list_n=>
s <= waveform_n;
end case;
wait [ sensitivity_clause ];
end process;

La lista sensitiva para la declaración wait se determina de la


misma manera que para una asignación de señal condicional.
• Si no se hace referencia a ninguna señal en la expresión de
asignación de señal seleccionada o formas de onda, la
declaración wait no tiene cláusula de sensibilidad. 134
C1 Programación VHDL 1.3 Declaraciones concurrentes

• De lo contrario, la cláusula de sensibilidad contiene todas


las señales a las que se hace referencia en la expresión y las
formas de onda.

Un ejemplo de una declaración de asignación de señal


seleccionada es:
with alu_function select
alu_result <= op1 + op2 when alu_add | alu_incr,
op1 – op2 when alu_subtract,
op1 and op2 when alu_and,
op1 or op2 when alu_or,
op1 and not op2 when alu_mask;

135
C1 Programación VHDL 1.3 Declaraciones concurrentes

En este ejemplo, el valor de la señal alu_function se usa para


seleccionar qué asignación de señal a alu_result se ejecutará.
• La declaración es sensible a las señales alu_function, op1 y
op2,
• Por lo que siempre que alguno de estos cambie de valor, la
asignación de la señal seleccionada se reanuda.

En resumen
Se le asigna un valor a una señal dependiendo del valor que
tome una expresión:

136
C1 Programación VHDL 1.3 Declaraciones concurrentes

architecture deecoder of decod is


begin
with a sel
s <= "00000001" when "000",
"00000010" when "001",
"00000100" when "010",
"00001000" when "011",
"00010000" when "100",
"00100000" when "101",
"01000000" when "110",
"10000000" when others;
end architecture decoder;}

137
C1 Programación VHDL 1.3 Declaraciones concurrentes

Por su ejecución en paralelo (balanceada) es similar a una


estructura CASE

Se pueden dar problemas de memoria implícita si no se pone


el último when others.

138
1.4 Declaraciones Secuenciales

139
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencias secuenciales
Las sentencias secuenciales en VHDL son
• IF
• CASE
• WAIT
• LOOP.
Con estas sentencias se utiliza
• Asignación de variable (:=)
• NEXT – EXIT para el Loop
• NULL
• ASSERT
• Asignación de señal (<=).

140
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Asignación de variable (:=).


Sustituye el valor de una variable con un nuevo valor
espedificado

Sintaxis
name_variable:= expresión;

Ejemplos
var := 112;
a := func(dato, 8);
varint:= func1(dato, 8) + 500 * func2()varint – 2**dato;

141
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencia IF
Selecciona la ejecución de sentencias dependiendo de una o
más condiciones

Sintaxis.
IF condición THEN sentencias1
{ELSEIF condición THEN sentencias2}
[ELSEIF sentencias3]
END IF

Ejemplo
Entity nand2 is
Port(a,b: IN bitx01, c: OUT bitx01);
END nand2; 142
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

ARCHITECTURE df OF nand2 IS
BEGIN
PROCESSD()
VARIABLE temp:bitx01;
BEGIN
temp:= a andx01 b;
IF (temp = ‘1’) THEN
c <= temp AFTER 6 ns;
ELSEIF (tem = ‘0’) THEN
c <= temp AFTER 5 ns;
ELSE
c<= temp AFTER 10 ns;
END IF;
END PROCESS;
END and2;
143
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencia CASE
CASE selecciona una secuencia de sentencias en función del
valor de una expresión.

Sintaxis
CASE expresión IS
alternativa {alternativa}
END CASE;
alternativa::= WHEN elecciones => sentencias1
sentencias1::= {sentencia_secuencial}
elecciones::= elección{|elección}
elección::= expresión_simple|rango_discreto|nombre simple| otros

144
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Ejemplo
ENTITY muxc IS
PORT( i3, i2, i1, i0, x1, x0: IN BIT; z: OUT BIT);
END muxc;

ARCHITECTURE df OFmuxc is
BEGIN
PROCESS
TYPE peso IS RANGE 0 to 3;
VARIEBLE muxval, peso;
BEGIN
muxval:= 0;
IF (x0 = ‘1’) THEN muxval := muxval + 1;
END IF;
145
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

IF (x1 = ‘1’) THEN muxval := muxval + 2;


END IF;

CASE muxval IS
WHEN 0 =>
z <= i0 AFTER 10 ns;
WHEN 1 =>
z <= i1 AFTER 10 ns;
WHEN 2 =>
z <= i2 AFTER 10 ns;
WHEN 3 =>
z <= i3 AFTER 10 ns;
WAIT ON i3, i2, i1, i0, x1, x0;
END PROCESS
146
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencias iterativas LOOP; NEXT, EXIT


Las sentencias iterativas sirven para formar los bucles
iterativos clásicos WHILE y FOR.
• NEXT finaliza la ejecución de la iteración actual e inicia la
siguiente
• EXIT finaliza la iteración actual y del buble.

Sintaxis
[rotulo:] [esquema_de_iteración] LOOP
sentencias1
END LOOP [rótulo];
esquema_de_iteración::= WHILE condición (FOR especificacion_de_parámetros)
especificacion_de_ parámetros::= identificador IN rango_discreto

147
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

sentencia_next::= NEXT [rótulo_del _loop] [WHEN condición];


Sentencia_exit::= EXIT [rótulo_del _loop] [WHEN condición];

Ejemplo
ENTITY and_mask IS
PORT(x, y, m: IN bit_vector (7 downto 0); z: OUT bit_vector(7 downto 0));
END and_mask;

ArCHITECTURE df OF and_mask IS
BEGIN
PROCESS
BEGIN
FOR i IN 0 to 7 LOOP
IF(m(i) = ‘0’) THEN
NEXT;
148
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

ELSE
z(i) <= x(i) NAD y(i);
END IF;
END LOOP;
WAIT ON x, y, m;
END PROCESS;
END and_mask;

149
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencia NULL
La sentencia NULL se utiliza para mostrar explícitamente que
no se requiere ninguna acción.
• Se usa comúnmente en la sentencia CASE para las acciones
por defecto.

Sintaxis
NULL

Ejemplo
ENTITY miniALU IS
PORT(i1, i2, op: IN integer; s: OUT integer);
END miniALU;
150
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

ARCHITECTURE df OF miniALU IS
BEGIN
PROCESS
VARIABLE result: integer;
BEGIN
CASE op IS
WHEN 0 => result:= i1 + i2;
WHEN 1 => result := i1 - i2;
WHEN 2 => result := i1 + 1;
WHEN 3 => result := i2 + 1;
WHEN 4 => result := i1 - 12;
WHEN 5 => result := i2 - 1;
WHEN 6 => result := i1;
WHEN OTHERS => NULL;
END CASE;
151
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

s <= result;
WAIT ON i1, i2, op;
END PROCESS
END df;

152
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencia ASSERT
La sentencia ASEERT se utiliza para comprobar una condición
e informar si es falsa.

Sintaxis
ASSERT

Ejemplo
ENTITY tiempo_setup_FF IS
PORT(d, clk: IN BIT; q: OUT BIT);
END tiempo_setup_FF;

Architecture df OF tiempo_setup_FF IS
BEGIN 153
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

PROCESS
VARIABLE ultimo_cambio:TIME:= 0ns;
VARIABLE ultimo_valor: BIT := ‘0’;
VARIABLE ultimo_valor_clk:= ‘0’;
BEGIN
IF (ultimo_valor /= d) THEN
ultimo_cambio:= NOW;
ultimo_valor:= d;
END IF;
IF (ultimo_valor_clk /= clk) THEN
ultimo_valor_clk:= NOW;
IF (clk=‘1’) THEN
ASSERT (NOW – ultimo_cambio >= 20ns)

154
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

REPORT “Violación del setup”;


SEVERITY WARNING;
END IF;
END IF;
WAIT ON d, clk; -- Función predefinida en VHDL que
END PROCESS; --devuelve el tiempo de simulación
END_tiempo_setup-ff;

155
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencia de asignación de señal (<=)


Esta sentencia se encarga de planificar transacciones, es decir,
pares (valor, tiempo) sobre el driver de una señal

Sintaxis
señal <= [TRANSPORT] forma_de_onda;
forma_de_onda::= elemento{ ,elemento}
elemento::= expresión_valor [AFTER expresión_tiempo] | NULL
[AFTER expresión_tiempo]

EJEMPLO
ENTITY línea_de_retardo IS
PORT (a: IN BIT; b : OUT BIT);
END linea_de_retardo;
156
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

ARCHITECTURE df OF línea_de_retardo IS
BEGIN
PROCESS
b <= TRANSPORT of AFTER 29 ns;
WAIT ON a;
END PROCESS;
END df;

157
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Sentencia WAIT
Esta sentencia suspende y activa los procesos para permitir la
sincronización del intercambio de información en el dominio
concurrente.

Sintaxis
WAIT[clausula_sensibilización][clausula_condición][clausula_temporización];
clausula_sensibilización::= ON lista_sensibilización
lista_sensibilización::= señal{ , señal}
clausula_condición::)= UNTIL condición
clausula_temporización::= FOR expresión_tiempo

158
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Cuando se ejecuta una sentencia WAIT dentro de un proceso,


• Este suspende y capacita las cláusulas de reactivación.
• EL proceso queda suspendido hasta cumplir los requisitos
de reactivación sensibilización, condición y te4mporización.

La lista de sensibilización especifica un conjunto de señales a


las que es sensible el proceso mientras está suspendido.

Cuando ocurre un evento (cambio del valor de una señal)


sobre algunas de estas señales, el proceso evalúa la
condición:
• Si el resultado es TRUE o se ha omitido la condición, el
proceso se activa a partir de la siguiente sentencia.
• Si el resultado es FALSE el proceso permanece suspendido. 159
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Si se ha omitido la cláusula de sensibilización, el proceso es


sensible a todas las señales de la expresión de la condición.

Si se omite y no existen cláusulas de sensibilización o


condición, el proceso se suspende indefinidamente.

Ejemplo
ENTITY unidad IS
PORT(e1, e2, cap: IN BIT; s: OUT BIT);
END unidad;

160
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

ARCHITECTURA df OF unidad IS
BEGIN
PROCESS
BEGIN
WAIT ON e1, e2 UNTIL cap =‘1’ FOR 70 ns;
s <= e1 NAD e2;
END PROCESS
END df;

161
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

1.4.1 Ejemplos de diagramas de máquinas de estados


La principal diferencia entre un circuito combinacional y
secuencial es:
• Las salidas de los circuitos combinacionales dependen sólo
de las entradas. Moore
• Las salidas de los circuitos secuenciales dependen tanto de
las entradas, entradas pasadas (memoria de estados) y reloj

Una memoria de estados está formada por flip-flops.


• El circuito cambia de un estado a otro cuando el contenido
de la memoria de estados cambia.
Mealy

162
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Un circuito secuencial opera a pasos S0, S1 AB, Q1Q0


• A través de una secuencia de estados.

Como la memoria de estado es finite


• Hay un número máximo de estados diferentes finitos.
• Por esta razón un circuito secuencial se denomina máquina
de estados finito (finite-state machine - FSM).

Aunque hay un número finito de estados diferentes


• La FSM puede ir a cualquier estado muchas veces.

La secuencia de estados que una FSM puede recorrer es


infinita.
163
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Máquina de Moore

164
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

165
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

166
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

167
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

Máquina de Mealy

168
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

169
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

170
C1 Programación VHDL 1.4 Declaraciones secuenciales

1.4.1 Ejemplos de diagramas de máquinas de estados

171
1.5 Funciones y subprogramas

172
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

1.5.1 Declaración de procedimientos y funciones


Las funciones y procedimientos en VHDL son estructuras
parecidas entre si.
Las sintaxis de un procedimiento y de una función son:

-- Sintaxis de un Procedimiento
PRECEDURE nombre (parámetros) IS
declaraciones
BEGIN
sentencias
END nombre;

173
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

-- Sintaxis de una Función


FUNCTION nombre (parámetros) RETURN tipo IS
declaraciones
BEGIN
sentencias
-incluye return
END nombre;

174
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

Lista de parámetros
La lista de parámetros
• Es opcional, si no hay parámetros no requiere paréntesis.
• Esta lista es un conjunto de parámetros que se le pasan al
programa
• Se declaran de forma parecida a como se declaran los
puertos en una entidad, es decir, considera:
• El tipo de objeto (señal, variable o constante)
• Nombre del objeto con dos puntos
• Modo del puerto (IN, OUT, INOUT)
• Tipo de objeto

175
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

Omisión de … en lista de parámetros PROCEDIMIENTOS


Si el puerto tiene modo no hace falta poner la palabra Modo: IN OUT INOUT
CONSTANT Objetos: Constantes,
• Se sobreentiende que es constante. Señales,
Variables
Para el resto de tipos, si no se especifica nada, se entenderá
que son variables.
FUNCIONES
En los procedimientos
Modo: IN
• Los tipos de objetos son: constantes, variables, señales
Objetos: Constantes,
• Los modos son: IN, OUT, INOUT.
Señales

176
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

En las funciones
• Sólo se admiten objetos de clase constante o señal en Funciones
modo IN. Ya que los parámetros no se modifican en una NO a variables
función. No se recomienda uso de
• No hay variable puesto que la clase constante ya juega el señales
mismo papel. Usar Return
No se recomienda usar en parámetros a las señales
• Se presta a confusión.
• Su uso es posible

177
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

Hay que tener cuidado, dado que hay atributos de señales no


permitidos en funciones como Funciones
• STABLE NO a variables
• QUIET No se recomienda uso de
• TRANSACTION señales
• DELAYED. Usar return
Se debe especificar el tipo que devuelve la función.
• Se utiliza la instrucción RETURN y en seguida la expresión
de lo que se devuelve.

178
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

En procedimientos y funciones
Las declaraciones dentro de estas pueden incluir las mismas
que incluye un PROCESS
• Pues son bloques de ejecución en serie
• No se pueden declarar señales en estas.
• Todo lo que se declara en esta parte sólo es visible en el
cuerpo de la función.

Visibilidad
Por motivos de visibilidad
• Es útil declarar la función antes de especificar su cuerpo.

179
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

Ejemplo de procedimiento
El procedimiento calcula los valores máximo y mínimo de los
números contenidos en una matriz cuyo rango ha sido
definido en algún sitio como tipo matriz.

180
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

Del ejemplo
• Se muestra el encabezado completo.
• Se utiliza la variable de entrada “conjunto” y no la modifica
dado que es entrada.
• Devuelve los resultados min y max

No se puede utilizar una función


• Pues la función sólo regresa un resultado.

Se utiliza un procedimiento
• A la cual se le pasen dos parámetros que se puedan
modificar.

181
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

--Ejemplo de procedure CODIFICAR


--
-- Paquete ------------------------------------

PACKAGE my_package IS
PROCEDURE sort_data (SIGNAL in1, in2: IN INTEGER;
SIGNAL out1, out2: OUT INTEGER);
END my_package;

PACKAGE BODY my_package IS

PROCEDURE sort_data (SIGNAL in1, in2: IN INTEGER;


SIGNAL out1, out2: OUT INTEGER) IS
182
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

PROCEDURE sort_data (SIGNAL in1, in2: IN INTEGER;


SIGNAL out1, out2: OUT INTEGER) IS
BEGIN
IF (in1<in2) THEN
out1 <= in1;
out2 <= in2;
ELSE
out1 <= in2;
out2 <= in1;
END IF;
END sort_data;
END my_package;

183
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

----------- Main code: --------------------------


USE work.my_package.all;
ENTITY sorter IS
PORT (a, b: IN INTEGER RANGE 0 TO 32;
x, y: OUT INTEGER RANGE 0 TO 32);
END sorter;

184
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

-- Ejemplo de procedure …
ARCHITECTURE sorter OF sorter IS
BEGIN
sort_data (a, b, x, y);
END sorter;

185
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

Diferencias entre funciones y procedimientos Función


Una función devuelve un solo valor. Devuelve un solo
• Un procedimiento devuelve valores a través de parámetros resultado
que se le pasan.

Los argumentos de una función son siempre de entrada y se Procedimiento


leen dentro de la función. Devuelve dos o mas
• En el procedimiento pueden ser de entrada, salida o resultados
entrada salida por lo que se pueden modificar.

Las funciones como devuelven un valor se usan en


expresiones.
• Los procedimientos se llaman con una sentencia secuencial
o concurrente. 186
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.1 Declaración de procedimientos y funciones

La función debe contener la palabra clave RETURN seguida Función


de una expresión puesto que siempre devuelve un valor. Utiliza Return
No tiene efectos colaterales
• En el procedimiento no es necesario.

Una función no tiene efectos colaterales.


• Un procedimiento si tiene efectos colaterales.
Procedimiento
Provoca cambios externos por el
El procedimiento puede provocar cambios en objetos manejo de señales.
externos a él.
• Debido a que cambian las señales, aunque no se
especifique en el argumento

En procedimientos se permiten asignaciones sobre señales


declaradas en la arquitectura y por tanto externas a él. 187
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

1.5.2 Subprogramas
Para hacer una descripción compleja de un circuito
• Es necesario organizar grandes cantidades de información
para su diseño.

La forma de organizar la información es por:


• Bloques para estructurar una descripción modular.
• Subprogramas como las funciones y procedimientos.
• Paquetes
• Librerías

188
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

Subprogramas
En VHDL se puede estructurar la información con
subprogramas.

Un subprograma es una función o un procedimiento que


contiene una porción de código.

Sintaxis de un subprograma
PROCEDURE identificador [parte_formal]/ FUNCTION designador
[parte_formal] RETURN ipo
designador::= identificador/ operador
operador::= literal_cadena
parte_formal::= (especificación_parámetro)( ; especificación
_parametro)
189
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

Especificación_parámetro::= lista_identificadores: MODO Tipo [:= espresion]


modo::= [IN]/ INOUT/ OUT

El cuerpo de un subprograma es:


BEGIN
[sentencias1];
RETURN expresión --sólo para funciones-
[sentencias2];
END designador;

Todos lo subprogramas VDHL pueden ser recursivos

Llamadas a subprogramas
• Para invocar un subprograma se pone el nombre seguido
190
por los argumentos entre paréntesis.
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

A las funciones sólo se les invocar como parte de una


expresión.
• Los procedimientos se invocan y ejecutan como si fueran
una sentencia secuencial o concurrente.

Paso de parámetro a un subprograma


1. Poner los parámetros en el mismo orden en que se
declaran.
• Es la forma normal en que funcionan los lenguajes de
programación.

VHDL permite otras dos formas:


2. Asociación explícita, que permite poner los parámetros
en cualquier orden. 191
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

3. Permite que los parámetros se especifiquen de manera


que tomen valores por defecto.
4. Operadores con notación infija o sobrecarga de
operadores.

Diferentes posibles llamadas al procedimiento del ejemplo


anterior, junto con otro procedimiento que no tienen
parámetros, sería.

192
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

Los procedimientos se pueden llamar desde entornos:


Secuenciales o Concurrentes

Llamada a un procedimiento desde un entorno secuencial es:


PROCEDURE nombre(parámetros);
Hay que tener cuidado de no incluir ninguna instrucción
WAIT si es que en el proceso que llamó al procedimiento
existe una lista sensible

Llamada a un procedimiento desde un entorno concurrente


es:
• Un procedimiento se comporta exactamente igual que un
bloque PROCESS de manera que la ejecución externa es
concurrente, pero internamente le ejecución es en serie. 193
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

Ejemplo de subprograma

ENTITY fibo IS
PORT (n: IN natural; f: OUT natural)
END fibo:

ARCHITECTURA recursivo OF nf_natural IS


BEGIN
PROCESS
FUNCTION fibon(m: narutal) RETURN natural IS
BEGIN
IF m = 0 or m = 1 THEN -- - Definición de la función
RETURN 1;
ELSE
RETURN fibon(m-1) + fibon(m-2);
194
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

END IF
END fibon;

BEGIN
f <= fibon (n); < -- Llamada
END PROCESS;
END recursivo;

195
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

Sobrecarga de operadores
La sobrecarga de funciones permite que puedan existir
funciones con el mismo nombre, y la diferencia es:
• El tipo de datos que devuelven
• El tipo de datos de sus argumentos

Esto es útil cuando se desea ampliar la cobertura de algunos


operadores predefinidos.

El intérprete del programa elige una función u otra dependiendo


de los tipos de datos que se estén utilizando en ese momento.
• Lo normal es que la sobrecarga se emplee en operadores

196
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

• Los operadores, siguen una notación infija que no necesita


de paréntesis, como en funciones.

En VHDL se definen este tipo de operadores de la misma


manera que una función normal, pero poniendo el nombre
de la función entre comillas dobles.
• La sobrecarga de operación suma para que funcione
sobre bit:vector de bits o tipo byte.

197
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

En resumen
El elemento sobrecargado tiene más de un significado
• El significado concreto está determinado por el contexto
local del elemento

Se pueden sobrecargar tipos numerados, subprogramas y


operadores.

Ejemplo de tipos numerados son:


TYPE bit IS (‘0’, ‘1’);
TYPE bit01x IS (‘0’, ‘1’, X);
TYPE bit01z IS (‘0’, ‘1’, Z);
TYPE bit01xz IS (‘0’, ‘1’, X, Z);
198
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.2 Subprogramas

Ejemplo de subprogramas sobrecargados


TYPE entero IS RANGE 0 TO 255;
TYPE vector IS ARRAY (0 TO 7) OF bit;
FUNCTION desplaza(a: int) RETURN int IS
BEGIN
RETUR (a/2);
END desplaza;
FUNCTION desplaza (a: vector) RETURN vector IS
VARIABLE reult: vector;
BEGIN
FOR i IN a’RANGE LOOP
IF = a’HIGH THEN reult((i):= ´’0’;
ELSE result(i):= a(i+1);
END ID;
END LOOP;
RETURN result;
END desplaza;
199
C1 Programación VHDL 1.5 Funciones y subprogramas

1.5.3 Paquetes

1.5.3 Paquetes
Librerías
Se han visto las estructuras de VHDL para describir circuitos.
• Las entidades y arquitecturas vistas se les conoce como
unidades.

En una descripción en VHDL estas unidades se utilizan en un


archivo denominado archivo de diseño.
• Un archivo de diseño se compila antes de simular o
sintetizar.
• El resultado de la compilación, aparte de la comprobación
de sintaxis, genera una librería de diseño.

200
C1 Programación VHDL 1.5 Funciones y subprogramas

Librería de diseño
Librería de diseño
• Es el resultado de la compilación de uno o más archivos de
diseño, contenían la descripción del hardware. Resultado de compilar
• Esta librería contiene todas las descripciones de todos los archivos de diseño
elementos que componen al circuito.

La librería de diseño se utiliza en la simulación o síntesis del


circuito.
• A esta librería, donde se guardad los elementos de la
descripción, después de la compilación, se le llama work.

201
C1 Programación VHDL 1.5 Funciones y subprogramas

Unidades primarias y secundarias


Los elementos que componen una librería son las unidades
(entidad, arquitectura).

Hay otros componentes


Paquetes
Cuerpo del paquete
Configuraciones

Las unidades del tipo declarativo como la entidad, paquete,


configuración son unidades primarias.
• Las unidades del tipo ejecutivo como arquitectura y cuerpo
del paquete son unidades secundarias. 202
C1 Programación VHDL 1.5 Funciones y subprogramas

La forma de un archivo de diseño es la misma que en VJDL


• Contiene sentencias de VHDL.

La forma de una librería de diseño puede cambiar.


• Según la herramienta de compilación utilizada y el O.S.
• Esto significa que no hay un mecanismo estándar en VHDL
para crear librerías
• Depende de la herramienta utilizada.

Hay un mecanismo para incorporar elementos de otra


librería a nuestro diseño y es utilizando LIBRARY

203
C1 Programación VHDL 1.5 Funciones y subprogramas

Librería USE se usa para:


• Hacer visibles los elementos internos de paquetes.
• Para referenciar a todos los paquetes se utiliza ALL.

Librerías WORK y STD


• Son librerías por defecto

WORK contiene las unidades de diseño que compila

STD contiene los paquetes standart y textio


• standar contiene las definiciones de tipos y constantes
vistos hasta ahora (bit, bit_vector)
• textio contiene tipos y funciones para el acceso a archivos
de texto. 204
C1 Programación VHDL 1.5 Funciones y subprogramas

LIBRARY IEEE
• Contiene tipos y funciones que completan los que vienen
incorporados por defecto.

std_logic_1164 es un paquete de la librería ieee.


• Contiene definición de tipos y funciones para trabajar con
un sistema de nueve niveles lógicos como bit, alta
impedancia, etc.

std_ulogic, std_logic, std_logic_1164_ext


• Son otros paquetes dentro de ieee.
• Los tres incorporan funciones de resolución y la última
hasta operaciones aritméticas y relacionales
205
C1 Programación VHDL 1.5 Funciones y subprogramas

PAQUETES
Es una colección de declaraciones de objetos, tipos,
constantes, subprogramas, etc. Con la posibilidad de
referenciarlos desde muchos puntos fuera del paquete.
• Se utilizan para implementar un servicio o aislar un
grupo de elementos relacionados.
• Se hacen visibles las interfaces de algunas funciones
o procedimientos que están ocultos en las
descripciones de estos elementos.

Los paquetes se componen de dos partes:


• Declarativa del paquete, la cual define l aparte
pública o visible del mismo.
206
C1 Programación VHDL 1.5 Funciones y subprogramas

• Ejecutiva o cuerpo del paquete que define l aparte


oculta, visible sólo en el interior.

PAQUETE
Sintaxis de un paquete
PACKAGE identificador IS
parte_declarativa_paquete
END [nombre_paquete];
Parte_declarativa_paquete::= declaración_subprograma
| declaración_tipo | declaración_subtipo
| declaración_constante | declaración_señal
| declaración_use | declaración_componente

207
C1 Programación VHDL 1.5 Funciones y subprogramas

Ejemplo de declaración de paquete:

PACKAGE general IS
TYPE bit01xz (‘0’, ‘1’, ‘Xx’, ‘Z’)
FUNCITON and01xz (x, y: bit01xz) return bit01xz;
FUNCITON or01xz (x, y: bit01xz) return bit01xz;
FUNCITON not01xz (x, y: bit01xz) return bit01xz;
FUNCITON nand01xz (x, y: bit01xz) return bit01xz;
FUNCITON nor01xz (x, y: bit01xz) return bit01xz;
FUNCITON xor01xz (x, y: bit01xz) return bit01xz;
END general;

208
C1 Programación VHDL 1.5 Funciones y subprogramas

CUERPO DEL PAQUETE


La sintaxis del cuerpo del paquete es:

PACKAGE BODY nombre_cuerpo_paquete IS


parte_declarativa_cuerpo_paquete
END [nombre_cuerpo_paquete];
parte_declarativa_cuerpo_paquete::=
{elemento_declarativo_cuerpo_programa}
Elemento_declarativo_cuerpo_paquete::=
declaración _subprograma
| cuerpo_subprograma | declaración_tipo
| declaración_subtipo | declaración_constante
| declaración_alias | declaración_use |

209
C1 Programación VHDL 1.5 Funciones y subprogramas

Ejemplo
-- FUNCTION AND
PACKAGE BODY general IS
FUNCTION and01xz(x, y: bit01xz) return bit01xz IS
VARIABLE z: bit01xz;
BEGIN
IF x = ‘x’ OR y = ‘y’ THEN z <= ‘x;
ELSIF x = ‘1’ and y = ‘1’ THEN z<= ‘1’;
ELSE z<= ‘0’;
END IF:
RETURN z;
END and01xz;

210
C1 Programación VHDL 1.5 Funciones y subprogramas

-- FUNCTION OR
FUNCTION or01xz(x, y: bit01xz) return bit01xz IS
VARIABLE z: bit01xz;
BEGIN
IF x = ‘1’ OR y = ‘1’ THEN z<= ‘1;
ELSIF x = ‘0’ and y = ‘0’ THEN z<= ‘0’;
ELSE z<= ‘1’;
END IF:
RETURN z;
END or01xz;

211
C1 Programación VHDL 1.5 Funciones y subprogramas

-- FUNCTION NOT
FUNCTION not01xz(x: bit01xz) return bit01xz IS
VARIABLE z: bit01xz;
BEGIN
IF x = ‘x’ THEN z <= ‘x’;
ELSIF x = ‘1’ THEN
z <= ‘0’;
ELSE z <= ‘1’;
END IF:
RETURN z;
END not01xz;

212
C1 Programación VHDL 1.5 Funciones y subprogramas

-- FUNCTION NAND
FUNCTION nan01xz(x, y: bit01xz) return bit01xz IS
VARIABLE z: bit01xz;
BEGIN
z <= not01xz(and01xz(x,y));
Return Z;
END nand01xz;

-- FUNCTION NOR
FUNCTION nor01xz(x, y: bit01xz) return bit01xz IS
VARIABLE z: bit01xz;
BEGIN
z <= not01xz(or01xz(x,y));
RETURN z;
END nor01xz;
213
C1 Programación VHDL 1.5 Funciones y subprogramas

-- FUNCTION XOR
FUNCTION xor01xz(x, y: bit01xz) return bit01xz IS
VARIABLE z: bit01xz;
BEGIN
z<= or01xz(and01xz(not01xz(x),y),
and01xz(x,not01xz(y)));
Return Z;
END xor01xz;
END general;

214
C1 Programación VHDL 1.5 Funciones y subprogramas

• Los nombres de paquete y cuerpo deben coincidir

215
C1 Programación VHDL 1.5 Funciones y subprogramas

Como las constantes y funciones no se han definido, se hacen


en el cuerpo del paquete.

216
C1 Programación VHDL 1.5 Funciones y subprogramas

Referenciación a los elementos de un paquete


Para referenciar a los elementos de un paquete se
utiliza la sintaxis:

USE nombre_seleccionado [ , nombre_seleccionado]


nomnre_seleccionado::= prefijo.subfijo
prefijo::= nombre
subfijo::= identificador | ALL

Se prefija el nombre con el nombre del paquete


• Ejemplo SIGNAL pc: general.bit01xz;

Se utilizar la cláusula USE en la regíón declarativa


correspondiente
217
C1 Programación VHDL 1.5 Funciones y subprogramas

Con el prefijo se designa el nombre de la biblioteca


• Con el subfijo se designa el nombre del paquete
• SI se van a utilizar todos los paquetes , se pude utilizar el
subfijo ALL.

Una forma para referenciar a los elementos de un paquete es


• Nombre del paquete y del elemento separados por punto.

USE tipos_mios.ALL
VARIABLE pc: tipos.mios.direcc;
pila:= tipos_mios.inicio +X”FF”;
desp:= tipos_mios.datosint(registro)

218
C1 Programación VHDL 1.5 Funciones y subprogramas

Otra forma de referenciar es hacer visible el paquete


• Para referenciar algunos o todos sus elementos sin
necesidad del punto.
• Se utiliza USE en la cabecera del programa.

-- Ejemplo Package:
PACKAGE my_package IS
FUNCTION shift_integer (SIGNAL a, b: INTEGER) RETURN INTEGER;
END my_package;

PACKAGE BODY my_package IS


FUNCTION shift_integer (SIGNAL a, b: INTEGER) RETURN INTEGER IS
BEGIN
RETURN a*(2**b);
219
C1 Programación VHDL 1.5 Funciones y subprogramas

END shift_integer;
END my_package;

-- Main code: --------------------


USE work.my_package.all;
ENTITY shifter IS
PORT (input: IN INTEGER RANGE 0 TO 63;
shift: IN INTEGER RANGE –6 TO 6;
output: OUT INTEGER RANGE 0 TO 63);
END shifter;

ARCHITECTURE shifter OF shifter IS


BEGIN
output <= shift_integer(input, shift);
END shifter;
220
C1 PROGRAMACIÓN VHDL

1.6 Programación de FPGA y CPLD

221
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

Creación de proyecto
Se abre el entorno de Xilinx Ise Design Suite

Aparece pantalla principal de ISE


• Uno va a la ruta File -> New Project

Aparece pantalla
• Dar nombre del proyecto, ubicación o ruta y tipo de archivo

222
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

Se dan datos del dispositivo


• Familia
• Dispositivo
• Empaquetado
• Velocidad

Se presenta un resumen

223
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

Integración de archivo vhd al proyecto


Se suma un archivo módulo VHDL del dispositivo
Se presenta resumen del archivo a integrar al proyecto
Se hace la captura o edita el código del archivo

224
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

Síntesis
Se hace la síntesis del proyecto
• Estando bien la síntesis, se pone una palomita blanca
dentro de un círculo de color verde en síntesis, ver figura
de arriba.

Archivo ucf
Asignación de pines al código
• Uno revisa la tarjeta y distribución de pines
• Estás se utilizarán vara asociar variables y pines.

225
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

Se suma al proyecto un archivo


• Implementation Constraints file

En el se escribe.
1 NET nombre-variable CLK LOC = “Nombre Pin FGPA”;

Ejemplo
1 NET CLK LOC = “E7”;
2 NET reset LOC = “L1”;
3 NET ENABLE_LCD CLK LOC = “N2”;
4 etc

Se salva el archivo y proyecto


226
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

Se regresa a ISE y se doble click en


• Implement Design

Si todo está bien, aparecen íconos de color verde con


palomitas blancas.

Generación del archivo .bit


De la ventana Process
• Dar doble click en Generate Programming File
• Si en la ventana consola reporta que todo está bien, en el
espacio de trabajo donde se depositan los archivos del
proyecto aparece el archivo.bit.
227
C1 Programación VHDL 1.6 Programación de FPGA y CPLD

•Finalmente puede probar su circuito en el FPGA

228
FIN

229

También podría gustarte