Introduccio n a VHDL

62
Introduccion a VHDL En este curso se cubrirán los principales conceptos del lenguaje de descripción de hardware VHDL, orientado a la realización de diseños digitales en dispositivos FPGA. El curso será conceptual-práctico, por lo que todos los conceptos serán posibles implementarlos en dispositivos FPGA. Se tendrá a disposición el Laboratorio remoto de FPGA, el cual permite la realización de todos los ejercicios como si se contara con la placa de desarrollo de FPGA conectada físicamente al computador del usuario. Es por eso, que no se requiere contar con placa propia de FPGA para realizar este curso . Unidad 1: Instalación de Quartus Prime Lite y configuración del Laboratorio remoto de FPGA. Quartus Prime es la herramienta de diseño para los dispositivos FPGA de la compañía Intel. La versión Lite no requiere licencia, y es la que utilizaremos para realizar todos los laboratorios del curso. También configuraremos el Laboratorio remoto de FPGA para poder realizar las todas prácticas. Lección 1: Descarga e instalación de Quartus Prime Lite 18.0 Esta lección describe todos los pasos para descargar la herramienta de síntesis Quartus Prime de la empresa Intel (anteriormente de Altera Corporation), y su instalación, para posterior realización de todos los diseños de este curso utilizando el Laboratorio remoto de FPGA. Procedimiento para la instalación de Quartus Prime Lite. Quartus Prime, de la empresa Intel Corporation, es la herramienta de síntesis utilizada para todas las prácticas realizadas en el Laboratorio remoto de FPGA. En esta lección, se muestra el procedimiento para la instalación de Quartus Prime Lite 18.0 en Windows 10. A continuación, se detallará los pasos para una correcta instalación: 1. Acceder al Centro de descargas de Intel en https://fpgasoftware.intel.com/18.0/?edition=lite&platform=windows. 2. Ingresar como usuario mediante el "sign in" ( ). o Nota: si no se tiene una cuenta de acceso, se debe crear una gratuitamente. 3. Descargar Quartus Prime Lite

Transcript of Introduccio n a VHDL

Page 1: Introduccio n a VHDL

Introduccio n a VHDL

En este curso se cubrirán los principales conceptos del lenguaje de descripción de hardware

VHDL, orientado a la realización de diseños digitales en dispositivos FPGA.

El curso será conceptual-práctico, por lo que todos los conceptos serán posibles

implementarlos en dispositivos FPGA. Se tendrá a disposición el Laboratorio remoto de FPGA,

el cual permite la realización de todos los ejercicios como si se contara con la placa de

desarrollo de FPGA conectada físicamente al computador del usuario. Es por eso, que no se

requiere contar con placa propia de FPGA para realizar este curso.

Unidad 1: Instalación de Quartus Prime Lite y configuración del

Laboratorio remoto de FPGA. Quartus Prime es la herramienta de diseño para los dispositivos FPGA de la compañía Intel.

La versión Lite no requiere licencia, y es la que utilizaremos para realizar todos los laboratorios

del curso.

También configuraremos el Laboratorio remoto de FPGA para poder realizar las todas

prácticas.

Lección 1: Descarga e instalación de Quartus Prime Lite 18.0 Esta lección describe todos los pasos para

descargar la herramienta de síntesis Quartus

Prime de la empresa Intel (anteriormente de

Altera Corporation), y su instalación, para

posterior realización de todos los diseños de

este curso utilizando el Laboratorio remoto de

FPGA.

Procedimiento para la instalación de Quartus Prime Lite.

Quartus Prime, de la empresa Intel Corporation, es la herramienta de síntesis utilizada para

todas las prácticas realizadas en el Laboratorio remoto de FPGA. En esta lección, se muestra el

procedimiento para la instalación de Quartus Prime Lite 18.0 en Windows 10.

A continuación, se detallará los pasos para una correcta instalación:

1. Acceder al Centro de descargas de Intel en https://fpgasoftware.intel.com/18.0/?edition=lite&platform=windows.

2. Ingresar como usuario mediante el "sign in" ( ). o Nota: si no se tiene una cuenta de acceso, se debe crear una gratuitamente.

3. Descargar Quartus Prime Lite

Page 2: Introduccio n a VHDL

o Asegurarse de que "Select edition" sea "Lite", "Select release" sea "18.0" y que "Operating System" esté seleccionado en "Windows".

Nota 1: la edición Lite no requiere licencia para su utilización. Nota 2: puede seleccionarse otro release, pero es conveniente la

versión 18.0 para que coincida con la versión utilizada en los ejemplos de los cursos y no haya diferencia en los menús de las herramientas.

o Seleccionar la solapa de "Combined Files"

o Hacer click en el ícono de descargar ( ) en la selección del archivo "Quartus Prime Lite Edition Software (Device support included".

o Confirmar la descarga haciendo click en el botón "I Agree".

Nota: Puede ocurrir que el Centro de Descarga confirme nuevamente

el usuario. En tal caso, se debe acceder nuevamente con usuario y contraseña y repetir el punto 3.

Seleccionar una carpeta en el disco local para almacenar el archivo de instalación a descargar.

4. Finalizada la descarga, se debe descomprimir el archivo descargado. Para ello puede utilizarse cualquier herramienta de descompresión de archivos (https://www.7-zip.org/, https://www.win-rar.com/, http://www.winzip.com).

5. Ejecutar el archivo "setup.bat" creado en la carpeta donde se descomprimió el archivo descargado.

6. Hacer click en "Next" en la primera pantalla de bienvenida. 7. Seleccionar "I accept the agreement" y hacer click en "Next" 8. Es conveniente dejar el directorio por defecto en "C:\IntelFPGA_lite\18.0". Hacer click

en "Next". o Nota: durante todo el curso se supondrá que se instaló en el directorio por

defecto de Quartus Prime. Debe considerarse esto, si se modifica este directorio.

9. Se puede deseleccionar la familia de dispositivos ("devices") "Arria II" para no utilizar espacio en disco. Luego hacer click en "Next".

Page 3: Introduccio n a VHDL

10. Seleccionar la instalación de "USB Blaster II driver" y hacer click en "Finish".

11. Cuando se abre la pantalla de instalación del controlador, hacer click en "Next >".

12. Confirmar la instalación haciendo click en "Install".

Page 4: Introduccio n a VHDL

13. Al finalizar la instalación, hacer click en "Finish". 14. Al abrir el software Quartus Prime Lite por primera vez, deberá seleccionarse "Run the

Quartus Prime software" y hacer click en "Ok".

15. Con este procedimiento, y si se realizó todo correctamente, el software Quartus Prime Lite estará instalado.

Lección 2: Configuración del Laboratorio remoto de dispositivos FPGA El Laboratorio remoto FPGA permite la realización de las prácticas del curso sin necesidad de

contar con una placa de desarrollo propia.

En esta lección, se describirán todos los pasos para la configuración para que Quartus Prime

Lite acceda a los dispositivos FPGA del Laboratorio remoto.

Procedimiento para la configuración del Laboratorio remoto de FPGA

El Laboratorio remoto de FPGA permite la conexión de Quartus Prime Lite a placas de

desarrollo para la realización de las prácticas del curso. El dispositivo FPGA aparece en Quartus

Prime como si estuviera conectado físicamente a la computadora del usuario.

En esta lección, se describe el procedimiento para la configuración de Quartus Prime con el

Laboratorio remoto de FPGA.

A continuación se describirán los pasos necesarios para la conexión de Quartus Prime al

Laboratorio remoto.

1. Acceder al Laboratorio remoto de FPGA mediante http://fpgalab.sytes.net.

Page 5: Introduccio n a VHDL

2. Si no se posee una cuenta, debe crearse una haciendo click en "Create a new account" y seguir el procedimiento:

o Ingresar toda la información solicitada y hacer click en el botón "Sign up". o Validar la cuenta, haciendo click en el enlace que se recibe en el cuerpo del

correo electrónico recibido desde el Laboratorio remoto de FPGA. o Regresar a la pantalla principal del Laboratorio remoto de FPGA en el punto 1.

3. Si se posee una cuenta, se debe ingresar el usuario en el campo "Username" y la contraseña en el campo "Password".

4. Una vez que se accede al Laboratorio remoto de FPGA, se muestran las placas de desarrollo disponibles para ser reservadas.

5. En caso de disponibilidad de placas, se puede reservar para uso exclusivo haciendo click en el nombre de placa - "Get board!". Al reservar la placa, ésta estará disponible inmediatamente, por tiempo de al menos 20 minutos que se prolongará en caso de que exista actividad.

6. Cuando la placa es reservada, el Laboratorio remoto de FPGA muestra la información necesaria para acceso a la placa de FPGA. En la pantalla de reserva se muestra en el cuerpo principal de la pantalla, pero esta información siempre se encontrará disponible en la barra superior del Laboratorio remoto de F¨GPA para un fácil acceso a la misma. La información será:

o JTAG server port: es la dirección de internet en la que estará publicada el puerto JTAG de la placa de desarrollo. El puerto JTAG es el medio de comunicación que utiliza Quartus Prime para conectarse a los dispositivos FPGA para su configuración.

Page 6: Introduccio n a VHDL

o JTAG access: es el código personal que habilitará el acceso de Quartus Prime a la placa.

7. Abrir Quartus Prime Lite, haciendo click en el ícono de Quartus Prime Lite

8. Una vez abierta la aplicación Quartus Prime Lite, acceder a la herramienta de programación ("Programmer"), mediante Tools -> Programmer, o haciendo click

en el ícono . 9. Una vez abierta la pantalla de la aplicación "Programmer", hacer click en el botón

"Hardware Setup...".

10. Una vez abierta la ventana de "Hardware Setup...", seleccionar la solapa "JTAG Settings".

o

11. Hacer click en el botón "Add Server...". 12. En la ventana "Add Server", ingresar:

o en "Server name" la información del campo JTAG server port mostrado en el Laboratorio remoto de FPGA, y

o en "Server password" la información del campo JTAG access mostrado en el Laboratorio remoto de FPGA.

13. Hacer click en el botón "Ok". 14. De no existir ningún inconveniente, Quartus Prime Lite mostrará que el estado de la

conexión es el correcto.

Page 7: Introduccio n a VHDL

15. Seleccionar la solapa de "Hardware Settings" de la ventana "Hardware Setup". 16. Seleccionar la placa en la lista desplegable de "Currently selected hardware".

17. Hacer click en el botón "Close", para regresar nuevamente a la ventana de la

aplicación Programmer. 18. El campo de Hardware Setup... debe mostrar la identificación de la placa FPGA del

Laboratorio remoto de FPGA.

19. Ahora puede realizarse una actualización de los dispositivos que están conectados a Quartus Prime Lite, haciendo click en el botón "Auto Detect".

20. Debe seleccionarse el dispositivo que coincida con el dispositivo FPGA que se desea acceder. En el caso de la placa DE2-115, el dispositivo FPGA se identifica como EP4CE115. Luego debe hacerse click en el botón "Ok".

Page 8: Introduccio n a VHDL

21. Una vez realizado todo el procedimiento, Quartus Prime Lite estará conectado a la placa del Laboratorio remoto de FPGA como si estuviera físicamente conectado a la computadora del usuario. Podrán entonces, realizarse todos los ejercicios prácticos de los cursos, sin necesidad de contar con una placa propia de desarrollo.

Page 9: Introduccio n a VHDL

Unidad 2: Introducción a VHDL: primer código y flujo de diseño

con Quartus Prime. En esta unidad se describen los conceptos principales de VHDL mediante ejemplos simples y

directos.

Circuitos digitales El lenguaje VHDL es un lenguaje de descripción de hardware. De esta manera, hardware hace

referencia a circuitos o sistemas digitales.

Las compuertas digitales permiten implementar, de manera electrónica, los operadores

booleanos. Es decir, las compuertas digitales implementan las funciones matemáticas del

álgebra de Boole.

Representación de circuitos digitales: esquemáticos y álgebra de Boole Cada una de las compuertas digitales tiene asignada una representación simbólica que

permite representar circuitos y sistemas digitales en representaciones gráficas denominadas

esquemáticos. La siguiente tabla muestra los operadores lógicos utilizados en diseño digital, su

representación simbólica y su expresión matemática asignada en el álgebra de Boole.

Operador Booleano Compuerta digital Función matemática implementada

or A

B

Z

Z = A or B

and A

B

Z

Z = A and B

not A

Z

Z = not(A)

nor A

B

Z

Z = not(A or B)

nand A

B

Z

Z = not(A and B)

xor A

B

Z

Z = A xor B es igual a

Z = (not(A) and B) or (A and not(B))

xnor A

B

Z

Z = A xnor B es igual a

Z = (A and B) or (not(A) and not(B))

Page 10: Introduccio n a VHDL

Puede observarse que las compuertas digitales tienen entradas y salidas. Funciones más

complejas pueden representarse gráficamente mediante la conexión entre las salidas de

algunas compuertas a las entradas de otras. Estas representaciones gráficas basadas en la

interconexión de compuertas conforman a los esquemáticos. El siguiente esquemático

representa dos funciones lógicas, Z e Y, que comparten compuerta.

AB

A

C

B

A and B

A or C

Z = (A and B) or (A or C)

(A or C) xor BY = not((A or C) xor B)

Fig. 1: representación esquemática de un circuito digital de dos salidas.

Los esquemáticos son una representación gráfica de las expresiones matemáticas del algebra de Boole que describen al circuito digital.

Aunque los esquemáticos resultan intuitivos para la representación gráfica de funciones

simples, se vuelve compleja y dificultosa cuando el circuito supera la decena de compuertas

digitales.

Para sistemas más complejos, es común la utilización de representaciones por bloques. En este

tipo de representaciones, las diferentes unidades funcionales del sistema son representadas

por bloques, cuyas entradas y salidas son interconectadas con las entradas y salidas de otros

bloques del sistema. Esto permite dividir la funcionalidad de todo el sistema en unidades

funcionales más simples y abordar cada unidad del sistema individualmente.

Sin embargo, cuando los sistemas se vuelven aún más complejos, las representaciones gráficas

no son adecuadas y es conveniente la utilización de lenguajes de descripción de hardware.

Lenguaje de descripción de hardware VHDL VHDL es un lenguaje basado en texto que permite la descripción de circuitos digitales tanto

para síntesis como para simulación. Fue propuesto en el marco del programa VHSIC (del inglés

Very High Integrated Circuits) del Departamento de Defensa de Estados Unidos y que definió

su nombre: V (VHSIC) H (Hardware) D (Description) L (Language).

En 1987, el instituto de ingenieros eléctricos y electrónicos (IEEE, por sus siglas en inglés), lo

estandariza en el estándar IEEE Std 1076-1987. Una falencia importante de este estándar es su

carencia de lógica multi-valuada. Esto provoca, en 1992, la aprobación del estándar IEEE Std

1164, que define los tipos de datos multi-valuados std_logic, std_ulogic, std_logic_vector y

std_logic_uvector.

Page 11: Introduccio n a VHDL

En 1993, se aprueba el estándar IEEE Std 1076-1993 que incorpora mejoras a la versión de

1983 y es ampliamente soportada por las herramientas de síntesis y simulación. Revisiones

posteriores del estándar (2000,2002, 2007, 2008 y 2019) incorporan diferentes características

al lenguaje.

NOTA: en este curso utilizaremos las revisiones 1987 y 1993 de lenguaje VHDL, puesto que son soportadas sin requerir licencia de las herramientas de síntesis y simulación.

Niveles de abstracción en lenguajes de descripción de hardware Un lenguaje de descripción de hardware debe ser capaz de especificar cualquier hardware

digital para ser sintetizado en recursos lógicos reales. Una vez que este requisito

fundamentales satisfecho, un lenguaje de descripción de hardware puede tener características

adicionales para diferentes funciones tales como documentación, especificación de

comportamiento o simulación. Estas diferentes características son agrupadas, en diseño

digital, en los siguientes cuatro niveles de abstracción:

Comportamiento (Behavioral Level, en inglés). En este nivel, el comportamiento

del circuito o sistema se expresa sin dar mayores detalles de la manera en que se

logra dicha funcionalidad en el hardware real. Este tipo de nivel de abstracción es

utilizado para simulación, documentación y especificación de comportamiento. En

otras palabras, en este nivel se describe cuál es la funcionalidad deseada, pero no

como se logra dicha funcionalidad en un hardware real.

Transferencia de registros (RTL, Register Transfer Level, en inglés). Este es el

mayor nivel de abstracción que permite una implementación en hardware digital.

En este nivel, el hardware es descripto mediante componentes implementables en

hardware tales como multiplexores, registros, comparadores, entre otros.

Compuerta (Gate Level, en inglés). Es un nivel de descripción inferior al RTL y

especifica el diseño mediante compuertas lógicas y flip-flops. Este nivel de

abstracción puede ser inadecuado cuando se realizan circuitos medianamente

complejos.

Físico (Physical Level, en inglés). Es el menor nivel de abstracción y contempla toda

la implementación física del circuito, tanto los componentes, su disposición y las

interconexiones físicas. Es muy extraña la descripción de diseños en este nivel de

abstracción.

Tanto VHDL como Verilog HDL permiten la descripción a niveles de comportamiento, RTL y

compuerta. Es muy importante entonces tener en claro el objetivo de nuestra descripción para

obtener resultados adecuados. No es posible sintetizar código realizado en nivel de

comportamiento.

En este curso se cubre la metodología para describir hardware digital en VHDL. Para ello, debemos saber cuál es el hardware que deseamos describir. El hardware que deseamos es el fin, el lenguaje VHDL es el medio. Teniendo en cuenta esto, siempre las descripciones en

Page 12: Introduccio n a VHDL

cualquier lenguaje de descripción de hardware se realizarán en el nivel de abstracción correcto.

Características que debe tener un lenguaje de descripción de hardware Parecerá una obviedad, pero un lenguaje de descripción de hardware deberá ser capaz de

describir hardware. Para esto, debemos determinar cómo es un hardware para incluir en el

lenguaje, características que permitan describirlo.

Por su naturaleza, el hardware es:

Concurrente: esto significa que todas las unidades del hardware (bloques,

compuertas, registros) están realizando su funcionalidad de manera simultánea.

Por ejemplo, en un circuito con varias compuertas, todas las compuertas

implementan sus funciones lógicas sobre los valores de sus entradas y producen los

valores correspondientes en sus salidas todo el tiempo y de manera

simultáneamente.

En el circuito digital representado por el esquemático de la figura 1, todas las compuertas

están interconectadas para la implementación de las funciones lógicas:

Z = (A and B) or (A or C) Y = not((A or C) xor B)

Sabemos que estas funciones lógicas determinan el valor de las salidas Z e Y de acuerdo a los

valores en las entradas A, B y C. Debido a que estas funciones son concurrentes, no importa el

orden en que son enunciadas, por lo que es lo mismo expresarlas en diferente orden como el

siguiente:

Y = not((A or C) xor B) Z = (A and B) or (A or C)

Un lenguaje de descripción de hardware, debe permitir describir procesos y funciones concurrentes.

Hemos visto que, en sistemas en los cuales la complejidad es elevada, es conveniente expresar

la funcionalidad del sistema como la interconexión de módulos o unidades que implementan

de manera separada las diferentes funciones del sistema. De esta manera, un lenguaje de

descripción de hardware debe permitir la descripción:

Jerárquica o estructural: esto significa que la funcionalidad de una descripción está

descripta por la interconexión de bloques o unidades funcionales de menor

jerarquía. De esta manera, la funcionalidad de un sistema puede definirse por la

interconexión de los componentes que lo integran.

Un lenguaje de descripción de hardware, debe permitir la descripción jerárquica o estructural del hardware.

Por último, aunque no es un requisito necesario, sino conveniente, un lenguaje de descripción

de hardware puede permitir la descripción secuencial de procesos o actividades concurrentes.

Page 13: Introduccio n a VHDL

Es importante repetir: la manera de describir es secuencial, lo descripto el concurrente. Por

ejemplo, el código:

if A = ‘1’ then Z <= ‘0’; else Z <= ‘1’;

end if;

es fácilmente comprendido: si el valor de A es igual a 1, entonces a Z se le asigna el valor 0,

sino (si el valor de A es igual 0) a Z se le asigna el valor 1. Cuando se describe hardware, esta

descripción, aunque sea secuencial, representa un comportamiento concurrente, que puede

ser expresado con la siguiente tabla de verdad:

A Z

0 1 1 0

Obviamente, esta tabla de verdad expresa que Z es el complemento de A, por lo que el

hardware descripto por la sentencia if anterior, es un función not.

ZA

Como puede observarse, el hardware descripto es concurrente (la función lógica not), pero la

manera de describirlo fue secuencial. Debido a que naturalmente podemos tener más recursos

expresivos si lo realizamos de manera secuencial, debemos tener en cuenta que el hardware

descripto SIEMPRE será concurrente. Durante el curso comprenderemos la manera de evaluar

las sentencias secuenciales para comprender el hardware concurrente que describen.

Lenguaje de programación vs. lenguaje de descripción. La mayor dificultad que se enfrenta al introducirse en el aprendizaje de lenguajes de

descripción de hardware es la tentación de asimilarlos con lenguajes de programación. Esta es

un desafío que se presenta al enseñar un lenguaje de descripción de hardware, por lo que

considero conveniente remarcar la completa y total diferencia entre un lenguaje de

programación de “software” y un lenguaje de descripción de hardware.

Un lenguaje de programación es prescriptivo, mientras que un lenguaje de descripción es

(precisamente) descriptivo. En palabras simples, se puede aventurar que un lenguaje de

programación prescriptivo indica cómo, y el lenguaje descriptivo indica qué. Por ejemplo, un

lenguaje de programación diría que para hacer una casa: primero hay que realizar los

cimientos, luego levantar las paredes, poner el techo, las ventanas, etc. Un lenguaje de

descripción diría que la casa debe tener dos dormitorios, cocina, garaje, de una planta, etc.

La sintaxis de los lenguajes de programación puede ser similar a la de los lenguajes de

descripción de hardware, pero la filosofía en su concepción en totalmente diferente. No se

pueden aplicar los mismos conceptos en la realización de software que a la realización de

hardware, y es por eso que los lenguajes destinados a diferentes objetivos son

Page 14: Introduccio n a VHDL

conceptualmente diferentes. Las características del hardware es muy diferentes a las del

software, y por consiguiente también los son las características de los lenguajes destinados

para cada uno de ellos.

Lección 3: Descripción de circuitos digitales con VHDL VHDL es un lenguaje que se escribe en un

archivo de texto. No distingue entre minúsculas

y mayúsculas, por lo que las palabras

reservadas del lenguaje y todos los nombres

definidos en el código, pueden ser escritos

indistintamente en mayúsculas o minúsculas

(case insensitive, en inglés).

El archivo consta de tres secciones

fundamentales:

La declaración de librerías: La declaración de librerías se realiza al comienzo del

archivo. Una librería que generalmente se incluirá en todos los códigos, es la de

lógica multi-valuada. Como se explicó anteriormente, la declaración de lógica multi-

valuada se realzó posterior a la estandarización de VHDL. Es por eso que, para

declarar señales multi-valuadas del tipo std_logic, debe incorporarse el paquete

std_logic_1164 de la librería IEEE, insertando el siguiente código al comienzo del

archivo:

library IEEE;

use IEEE.std_logic_1164.all;

La entidad: describe los puertos de entrada y de salida que tiene el hardware

descripto. También define el nombre del componente descripto. El nombre del

archivo debe ser el nombre de la entidad, con extensión “.vhd”. Por ejemplo,

denominaremos al circuito de la figura 1 como funcion_y_z, su descripción tendrá

que realizarse en un archivo con el nombre función_y_z.vhd, e incluirá la siguiente

entidad:

entity funcion_y_z is

port (

A : in std_logic;

B : in std_logic;

C : in std_logic;

Z : out std_logic;

Y : out std_logic

);

end entity función_y_z;

Puede observarse que las señales de entrada y salidas son declaras dentro de la cláusula

port. Las señales A, B y C son declaradas como entradas al especificarlas como in, y las

señales Z e Y son declaradas como salidas al especificarlas como out. Todas las señales

son declaras del tipo std_logic. Por ende, la entidad define: (1) el nombre del

Page 15: Introduccio n a VHDL

componente, (2) las señales de entrada, de salida y bidireccionales, y (3) el tipo de cada

una de ellas.

La arquitectura: define la funcionalidad del componente especificando; en

definitiva, qué valores se le asignarán a las salidas del componente de acuerdo al

valor de las entradas. La descripción de la funcionalidad en la arquitectura puede

ser de manera funcional o jerárquica o estructural. La arquitectura para el circuito

de la figura 1 se resuelve fácilmente mediante una descripción funcional mediante

las funciones lógicas que determinan los valores de las salidas de acuerdo al valor

de las entradas. La arquitectura para el circuito de la función_y_z tendrá la forma:

architecture A1 of funcion_y_z is

begin

Z <= (A and B) or (A or C);

Y <= not((A or C) xor B);

end architecture A1;

La arquitectura tiene un nombre (en este ejemplo se eligió arbitrariamente A1) y está

asociada a una determinada entidad (en este caso a la entidad función_y_z) que debe

estar en el mismo archivo. La estructura de la arquitectura consta de una primera

sección declarativa, que abarca desde la palabra reservada is hasta la palabra reservada

begin. En esta sección se declararán señales internas y componentes, pero serán

detallados en próximas lecciones. La segunda sección es el cuerpo de la arquitectura, y

es en donde se describirá la funcionalidad o la estructura del hardware. Puede

observarse que, en el ejemplo utilizado, se especificaron las funciones lógicas que

deseamos implementar, utilizando el operador “<=” para la asignar las señales Z e Y.

Recordemos que las funciones lógicas tienen entradas y salida: con el operador

asignación (“<=”), la salida se define por la señal que está a la izquierda del operador,

mientras que la función asignada se define a la derecha del operador de asignación.

Todas las sentencias en el cuerpo de la arquitectura son concurrentes, por lo que no importa

el orden en que se especifiquen. En el ejemplo de la función_y_z es equivalente colocar

primero la especificación de la función Z y luego la de la función Y (como figura en el código) o,

por el contrario, primero la función Y y luego la función Z.

Todas las sentencias en el cuerpo de la arquitectura son consideradas concurrentes y, por lo tanto, no importa el orden en que se especifiquen.

Para finalizar, el código VHDL completo de nuestro ejemplo de la figura 1 quedaría

especificado en el archivo función_y_z.vhd:

Page 16: Introduccio n a VHDL

De esta manera, hemos realizado nuestra primera especificación en el lenguaje de descripción

de hardware VHDL. El lenguaje VHDL presenta una estructura para especificar el código. Sin

embargo, siempre debe tenerse presente que, cuando realizamos una descripción para ser

implementada en hardware, el hardware que queremos describir. Más adelante veremos

diferentes estructuras del lenguaje VHDL, pero siempre debemos recordar que VHDL (o

cualquier lenguaje de descripción de hardware) no permitirá implementar en hardware algo

que no se puede implementar en hardware: el lenguaje no es un fin, sino un medio.

NOTA: siempre hay un esquemático que puede representar gráficamente, la descripción de un código en VHDL. Es decir, no podemos hacer en VHDL nada que no se representar con un esquemático.

Flujo de diseño El archivo en VHDL especificado en la sección anterior, requiere ser procesado para que un

dispositivo FPGA implemente, finalmente, el hardware deseado. Todas las etapas necesarias

en este proceso conforman el flujo de diseño. El flujo de diseño puede involucrar varias

herramientas de desarrollo, las cuales procesan los datos de la herramienta anterior y

producen los datos para la herramienta siguiente.

El flujo de diseño digital con dispositivos FPGA, involucra 4 etapas principales:

library IEEE;

use IEEE.std_logic_1164.all;

entity funcion_y_z is

port (

A : in std_logic;

B : in std_logic;

C : in std_logic;

Z : out std_logic;

Y : out std_logic

);

end entity function_y_z;

architecture A1 of funcion_y_z is

begin

Z <= (A and B) or (A or C);

Y <= not((A or C) xor B);

end architecture A1 ;

Declaración de

librerías y paquetes

Entidad

Arquitectura

Sección declarativa

Cuerpo

Nombre de la arquitectura

Nombre de la entidad

Page 17: Introduccio n a VHDL

Entrada de diseño

(Design entry)

Compilación

(Compilation)

Implementación

(Place & route)

Configuración

(FPGA configuration)

Ej.: VHDL

netlist

Ej.: .sof

Entrada de diseño (Design entry, en inglés): en

esta etapa, el diseño es descripto mediante el

código en un lenguaje de descripción de hardware,

o mediante un esquemático en un editor de

circuitos digitales. Existen diferentes procesadores

de texto con las que podemos editar nuestros

archivos de código VHDL. Quartus Prime ofrece un

editor con características destinadas a facilitar la

edición de código de descripción de hardware

(soporta diferentes lenguajes HDL), pero no es

necesario utilizarlo si al usuario le es más

conveniente otro editor de archivos.

Compilación (Compilation, en inglés): en esta

etapa, la descripción realizada en la etapa de

“Design entry” es procesada para determinar las

funciones lógicas descriptas en el código. En la

compilación se obtienen los recursos de hardware, y sus interconexiones,

necesarios para implementar el hardware descripto. Existen herramientas de varios

fabricantes destinadas a la compilación de diseño digital. Quartus Prime compila el

Design entry, pero también es compatible con herramientas de varios fabricantes

en el caso de preferirse compiladores de otros fabricantes (Intel denomina “third

party” a herramientas o fabricantes con lo que Quartus Prime es compatible). La

etapa de compilación produce un archivo denominado netlist.

Implementación (Design implementation, en inglés): en esta etapa, se determinan

los recursos físicos del dispositivo FPGA que se utilizarán para implementar el

hardware descripto. Este proceso requiere un profundo conocimiento de los

recursos disponibles en el dispositivo FPGA, por lo que generalmente es solamente

realizado por la herramienta provista por el fabricante de los dispositivos FPGA

(Quartus Prime para los dispositivos FPGA de Intel). El proceso por el cual se

determinan los recursos físicos y de interconexión se denomina place and route y

su complejidad es generalmente abordada mediante heurísticas. En Quartus Prime,

el proceso de place and route es implementada mediante la aplicación Fitter, la

cual puede requerir un tiempo considerables para diseño medianamente complejos

y produce archivos con extensión .sof o .pof.

Configuración (FPGA configuration): en esta etapa, se transfiere la información

obtenida en la etapa anterior al dispositivo FPGA para su configuración. La

configuración de un dispositivo FPGA permite que los recursos de hardware

disponible en él, sean interconectados para que, finalmente, el hardware descripto

se implemente. Por supuesto, el dispositivo FPGA debe contar con todos los

recursos de hardware requeridos para implementar el hardware descripto.

Cada etapa del flujo de diseño permite configurar diferentes parámetros para lograr la

implementación deseada. Por ejemplo, el código VHDL describe el hardware que deseamos

Page 18: Introduccio n a VHDL

implementar, pero no determina los pines físicos del dispositivo FPGA que serán configurados

como entradas y como salidas. Esto es porque la configuración de los pines físicos cobra

importancia en la etapa de implementación en la que determinan los recursos físicos que se

utilizarán del dispositivo FPGA. Existen diferentes especificaciones que se pueden realizar para

cada una de las etapas del flujo del proceso, pero nos centraremos en la especificación de los

pines de entrada y de salida para poder finalizar el flujo de diseño que comenzamos con el

hardware de la figura 1. Para ello, debemos primero crear un proyecto en Quartus Prime.

Lección 4: Creación de proyecto en Quartus Prime Quartus Prime es la herramienta de desarrollo

para dispositivos FPGA de la compañía Intel.

Permite desarrollar todas las etapas del flujo de

diseño y permite también integrarse con

herramientas de otros fabricantes. Quartus

Prime agrupa la información requerida para

todas las etapas del flujo de diseño en

proyectos. Un proyecto entonces contendrá

todos los archivos y directorios destinados a

configurar y procesar toda la información involucrada en el flujo de diseño de un determinado

hardware. Quartus Prime ofrece una guía para la creación de proyecto nuevo (“New Project

Wizard”). Veremos a continuación los pasos necesarios para crear un proyecto en Quartus

Prime mediante esta guía:

1. Abrir Quartus Prime Lite, haciendo click en el ícono de Quartus Prime Lite

2. Seleccionar File New Project Wizard, o hacer click en el botón de acceso directo en

la pantalla de bienvenida

o

3. En la ventana de Introduction, hace click en el botón Next> 4. En la ventana de Directory, Name Top-Level Entity, se debe especificar:

o el directorio del proyecto en “What is the working directory for this project". Para este ejemplo, lo configuraremos en “C:\FPGA”.

o el nombre del proyecto en “What is the name of this project”. Para este ejemplo, lo especificaremos como “función_y_z”.

o el nombre de la entidad de mayor jerarquía en “What is the name of the top-level design entity for this project?...” Para este ejemplo, debemos especificar “function_y_z” puesto que es el nombre que le dimos al componente a implementar.

Page 19: Introduccio n a VHDL

5. Luego de especificar los campos, hacer click en el botón Next> (confirmar si consulta sobre crear el directorio C:\FPGA si no existe).

6. En la ventana de Proyect Type, se debe seleccionar Empty project y hacer click en el botón Next>.

7. En la ventana Add Files, seleccionamos en el campo “File name”, mediante el botón , el archivo función_y_z.vhd, el cual describimos en la sección anterior y que debemos copiar previamente en el directorio del proyecto (C:\FPGA). Luego, hacer click en el botón Next>.

8. En la ventana de Family, Device & Board Settings se debe seleccionar el dispositivo FPGA que se utilizará en el proyecto. La selección debe comenzar especificando la familia del dispositivo FPGA. Para el caso de la placa DE2-115 de Terasic, que supondremos en este ejemplo, la familia es Cyclone IV E y debe ser seleccionada en el campo Family. Para otras placas de desarrollo, debe especificarse la familia que corresponda. Luego, debe especificarse el dispositivo FPGA específico de las opciones que aparecen en el campo Available devices. El campo Name Filter puede ser utilizado para discriminar más fácilmente el dispositivo deseado, especificando, en nuestro caso, el dispositivo de la placa DE2-115: EP4CE115F29C7. Esta especificación filtra los dispositivos FPGA disponibles, y debe seleccionarse en el capo Available devices. Luego hacer click en el botón Next>.

Page 20: Introduccio n a VHDL

9. En la ventana EDA Tool Settings se puede configurar qué herramientas de desarrollo se desean integrar al flujo de diseño con Quartus Prime. En este caso, y para que quede configurado para futuras lecciones, elegiremos la herramienta de simulación ModelSim-Altera, la cual fue instalada con la versión Lite de Quartus Prime. En el campo de Format(s) se debe seleccionar VHDL. Luego, hacer click en Next>.

10. En la pantalla Summary se mostrará un resumen de la configuración del proyecto creado. Se debe hacer click en el botón Finish.

Al finalizar la guía de creación de proyecto nuevo, el proyecto estará creado y abierto en

Quartus Prime. La información del proyecto puede accederse en el panel de Project Navigator.

Page 21: Introduccio n a VHDL

Seleccionando la vista de Hierarchy, podemos seleccionar que abra el archivo con la entidad

de máxima jerarquía haciendo doble-click en función_y_z:

Debido a que el archivo conteniendo una entidad con el nombre función_y_z ha sido

incorporado al proyecto, se abrirá el editor de Quartus Prime con e l archivo función_y_z.vhd.

Es necesario compilar el proyecto para que Quartus Prime procese la información de la

descripción realizada. Para esto, se debe hacer seleccionar Processing Start compilation, o,

alternativamente, hacer click en el ícono correspondiente en la barra de herramientas:

o

El proceso de compilación ejecutará todas las etapas del flujo de diseño y su avance puede

verse en el panel de tareas (Tasks).

Finalizado la compilación, Quartus Prime ha realizado una implantación asignando los pines de

entrada y salida según un criterio que le resultó conveniente. Sin embargo, el dispositivo FPGA

Page 22: Introduccio n a VHDL

tiene sus pines físicamente a los periféricos específicos de la placa. Es por ello, que se deben

configurar que las entradas y las salidas del diseño estén configuradas a los pines correctos de

la placa para poder interactuar con los mismos.

La asignación de pines puede verse en la aplicación Pin Planner, ejecutando AssignmentsPin

Planner.

En la pantalla de la aplicación Pin Planner, se observará que las señales de entrada y salida del

diseño compilado, tienen una asignación de pines realizada por el Fitter de Quartus Prime.

Debido a la gran cantidad de pines de entrada y de salida, es conveniente utilizar los archivos

de configuración (scripts) brindados por el fabricante para facilitar el proceso y disminuir la

posibilidad de introducir errores en la configuración.

Los fabricantes de dispositivos FPGA asignan a los pines de los dispositivos coordenadas para

su identificación. Por ejemplo, en los dispositivos de Intel, a las filas de pines se les asigna

letra/s y a las columnas números. En consecuencia, las coordenadas consistirán de letra/s y un

número para identificar cada pin del dispositivo.

Los fabricantes de placas, para facilitar la identificación de los periféricos a los que está

conectado cada pin de la FPGA en la placa, brindan la configuración de los pines en archivos de

comandos TCL. Estos archivos le asignan un nombre a cada uno de los pines físicos del

dispositivo. De esta manera, el nombre asignado al pin brinda mucha más información que las

coordenadas que lo identifica. Por ejemplo, el Laboratorio remoto de FPGA conecta el

dispositivo FPGA a la interface web mediante los pines con los siguientes nombres:

IN_WEB(7 downto 0) pines del dispositivo FPGA conectados a las llaves (switches) de la interface web del Laboratorio remoto de FPGA.

OUT_WEB(15 downto 0) pines del dispositivo FPGA conectados a los indicadores leds de la interface web del Laboratorio remoto de FPGA.

La representación IN_WEB(7 downto 0) indica que es un vector de 8 elementos. Es decir,

existirán 8 pines asignados a la funcionalidad IN_WEB, denominados IN_WEB(7), IN_WEB(6),

IN_WEB(5), IN_WEB(4), IN_WEB(3), IN_WEB(2), IN_WEB(1), IN_WEB(0).

En el ejemplo realizado de la función de la figura 1, deberemos asignarle estos nombres a las

señales de entrada y de salida o conectarlas correspondientemente para poder utilizar la

interface web del Laboratorio remoto para comprobar su funcionamiento.

Page 23: Introduccio n a VHDL

Lección 5: Asignación de pines y transferencia al Laboratorio remoto

de FPGA En esta lección se describen los pasos para realizar la asignación de pines de acuerdo a la

configuración del Laboratorio remoto de FPGA.

Procedimiento para la asignación de pines del Laboratorio remoto de FPGA

El Laboratorio remoto de FPGA permite

acceder a los pines físicos del dispositivo FPGA

a través de su interface web. Para permitir que

Quartus Prime asigne entradas y salidas de

nuestro diseño a los pines físicos del

dispositivo FPGA, debemos asignarles los

nombres que lo identifican en la placa. Por

ejemplo, realizaremos la siguiente asignación:

Señal del diseño Pin dispositivo FPGA

A IN_WEB(0)

B IN_WEB(1)

C IN_WEB(2)

Y OUT_WEB(0)

Z OUT_WEB(1)

El código VHDL será modificado como se muestra en la figura 2. Puede observarse que los

puertos de la entidad fueron asignados con los nombres de los pines del Laboratorio remoto

de FPGA. Luego, las señales de entrada y salida del diseño original fueron declaradas como

señales internas de la arquitectura para que las funciones permanezcan en su declaración

original. Entonces, se asignaron puertos de entrada a las señales de entrada de las funciones

(A, B y C), y puertos de salida a las señales de salida de las funciones (Z e Y).

Antes de realizar una nueva compilación, es necesario ejecutar el archivo de configuración

para la asignación de los nombre del Laboratorio remoto de FPGA a los pines del dispositivo.

Page 24: Introduccio n a VHDL

Fig. 2: código con asignación de pines del Laboratorio remoto de FPGA.

Descarga del archivo de configuración de pines del Laboratorio remoto de FPGA

El archivo de configuración de pines se puede descargar directamente del Laboratorio remoto

de FPGA. Para ello, se debe acceder al Laboratorio remoto de FPGA:

1. Acceder al Laboratorio remoto de FPGA mediante http://fpgalab.sytes.net. 2. Seleccionar para reserva de uso exclusivo la placa deseada haciendo click en el nombre

de placa - "Get board!".. 3. Seleccionar el archivo .qsf en el panel de navegación y descargar al directorio del

proyecto. Preservar la extensión QSF cuando se guarde en el disco, para que sea fácilmente reconocido por Quartus Prime.

library IEEE; use ieee.std_logic_1164.all; entity funcion_y_z is port (

IN_WEB : in std_logic_vector(7 downto 0); OUT_WEB : out std_logic_vector(15 downto 0) );

end entity funcion_y_z;

architecture A1 of funcion_y_z is signal A : std_logic; signal B : std_logic; signal C : std_logic; signal Z : std_logic; signal Y : std_logic; begin OUT_WEB(0) <= Y; OUT_WEB(1) <= Z;

Y <= not((A or C) xor B); Z <= (A and B) or (A or C); A <= IN_WEB(0); B <= IN_WEB(1); C <= IN_WEB(2); end architecture A1 ;

Se asignan los nombres de los pines a los puertos de entrada y salida de la entidad

Definición de las señales del diseño como señales internas de la arquitectura. Se les asignarán a los puertos de entrada y salida para preservar los nombres en las funciones originales.

Asignación de las señales de salida de las funciones a los pines del dispositivo FPGA.

Funciones lógicas originales

Asignación de los pines del dispositivo FPGA a las señales de entrada de las funciones.

Page 25: Introduccio n a VHDL

4. Seleccionar AssignmentsImport Assignments en Quartus Prime.

5. Seleccionar el archive descargado desde el Laboratorio remoto de FPGA.

6. Hacer click en el botón Ok para importar la configuración de los pines del Laboratorio remoto de FPGA desde el archivo descargado, seleccionando Processing Start compilation, o, alternativamente, hacer click en el ícono correspondiente en la barra de herramientas:

o

Finalizada la compilación, se puede verificar la nueva asignación de pines ejecutando

AssignmentsPin Planner.

Page 26: Introduccio n a VHDL

Puede verificarse, que el diseño ha sido compilado y los puertos de entrada y de salida de la

entidad, han sido asignados a pines físicos del dispositivo FPGA del Laboratorio remoto de

FPGA. De esta manera, a través de la interface web del Laboratorio remoto de FPGA podrá

interactuarse con ellos para modificar el valor de las entradas o visualizar el valor de las

salidas.

En la siguiente sección, se transferirá el hardware realizado al dispositivo FPGA y se verificará

su funcionamiento a través de la interface web del Laboratorio remoto de FPGA.

Transferencia de configuración a la FPGA del Laboratorio remoto de FPGA

Para transferir el diseño al dispositivo FPGA se debe acceder al Laboratorio remoto de FPGA,

reservar la placa deseada y configurar Quartus Prime como se realizó en la Lección 2. Si se ha

reservado y configurado Quartus Prime, se debe seguir el siguiente procedimiento.

1. Ejecutar la aplicación Programmer de Quartus Prime seleccionando ToolsProgrammer, o mediante el ícono correspondiente en la barra de herramientas.

2. Hacer click en el botón Add File… 3. Seleccionar el archivo función_y_z.sof en el directorio output_files del proyecto.

4. El Programmer estará listo si el dispositivo FPGA del Laboratorio remoto de FPGA ha

sido conectado correctamente según el procedimiento de la Lección 2.

Page 27: Introduccio n a VHDL

5. Hacer click en el botón Start para realizar la transferencia y esperar a que la

transferencia se complete en la barra de Progress.

6. Finalizada la transferencia, se puede acceder a la interface web del Laboratorio remoto

de FPGA y a la ventana Lab1.

. 7. La interface permitirá modificar los valores de las entradas y visualizar el valor de las

salidas de manera muy intuitiva.

De esta manera, se realizó todo el flujo de diseño del primer proyecto en Quartus Prime,

configurando el dispositivo FPGA del Laboratorio remoto de FPGA y realizando su verificación a

través de la interface web del Laboratorio remoto de FPGA.

En próximas unidades veremos con mayor detalle las características descriptivas del lenguaje

VHDL a nivel RTL para diseño digital en dispositivos FPGA.

Page 28: Introduccio n a VHDL

Unidad 3: Descripción de hardware con VHDL: procesos

concurrentes y registros con reloj. La utilización de estructuras process permite la

descripción secuencial de actividades

concurrentes. Son necesarias también para la

descripción de flip-flops y registros con reloj

(clocked processes).

Lección 6: Estructura process en

VHDL La figura 3 muestra la estructura process de

VHDL, la cual permite describir hardware utilizando sentencias secuenciales. Las estructuras

process se ubican en el cuerpo de la arquitectura, no importa su orden dentro de la

arquitectura, y puede haber tantos process como sean necesarios. Debemos recordar siempre

que el hardware descripto es concurrente, sólo la forma de describirlo es secuencial.

Fig. 3: Estructura de process en VHDL.

En la figura 3 se pueden observar las diferentes partes que constituyen la estructura del

process:

nombre: permite asignarle una identificación al proceso para individualizarlo,

eventualmente, en los procesos de síntesis y de simulación. Es opcional. Si no se

asigna ningún nombre al proceso, no debe escribirse los dos puntos (“:”). El

sintetizador y/o el simulador asignará un código internamente generado en caso de

que no se asigne ningún nombre al proceso.

Lista sensitiva: es una lista de las señales cuyos eventos producen que el proceso

sea evaluado. Por ejemplo, si la lista sensitiva cuenta con la señal A, entonces las

sentencias del cuerpo del process serán evaluadas sólo cuando haya un evento en

la señal A: la señal A cambia de cero a uno, o de uno a cero.

nombre: process ( )

begin

end process;

Sección declarativa del process.

Cuerpo del process.

Lista sensitiva nombre

(opcional)

Page 29: Introduccio n a VHDL

Sección declarativa: permite realizar declaraciones que serán de alcance interno al

process. Más adelante en el curso se entrará en detalle de estas declaraciones.

Cuerpo del process: contiene todas las sentencias secuenciales que deben ser

evaluadas cuando hay un evento en las señales de la lista sensitiva.

Evaluación del proceso Es importante tener siempre presente la manera en que debemos evaluar en forma secuencial

un process, para que el resultado sea el que realmente tenga el hardware concurrente

sintetizado. Deben tenerse en cuenta dos reglas en la evaluación de un process:

1- El process es evaluado sólo cuando hay un evento en alguna de las señales de la lista

sensitiva. Puesto que el hardware real siempre es reactivo a cambios en sus señales de

entrada, un process destinado a hardware real (no simulación en nivel de

comportamiento) siempre tendrá alguna señal en la lista sensitiva.

2- Las señales que se modifican al evaluar el process, son actualizadas al final del process

con el último valor que les fue asignado en la evaluación. Las señales no toman los

valores intermedios que le son asignadas durante la evaluación del process.

Si estas dos reglas son cumplidas durante la evaluación de un process, entonces la evaluación

secuencial mostrará el comportamiento que tendrá el hardware concurrente en el dispositivo

FPGA.

Ejemplo

Evaluaremos qué hardware implementa el siguiente process:

process (A,B)

begin

if A = ‘1’ then

Z <= B;

else

Z <= ‘0’;

end if;

end process;

Siendo las reglas de la evaluación de un process, supondremos eventos en las señales de la

lista sensitiva.

Suponemos que la señal A cambia, y su valor es igual a cero. Entonces, al evaluar el process

(debido a que hubo un cambio en una señal de la lista sensitiva): como A no es igual a ‘0’,

entonces se le debe asignar a Z el valor ‘0’ y esta es la última asignación a las señal Z hasta

finalizar el process. Como el valor ‘0’ es el último valor que se le asignó a la señal Z en la

evaluación del process, entonces las señal Z tomará el valor ‘0’ cuando la señal A cambie a ‘0’.

Suponemos ahora que la señal A cambia a uno. Debemos evaluar el proceso puesto que la

señal A integra la lista sensitiva del process. Como A es igual a ‘1’, entonces a Z se le asigna el

valor de la señal B. Como es la última asignación de la señal Z hasta finalizar el process,

entonces la señal Z tomará el valor de la señal B.

Page 30: Introduccio n a VHDL

Si suponemos que cambia la señal B, entonces el valor que tome la señal Z dependerá si la

señal A es igual a ‘1’ o no. Si la señal A es igual a ‘1’, entonces la señal Z toma el valor de las

señal B, y si es igual a ‘0’, entonces tomará el valor ‘0’.

Resumiendo, la siguiente tabla de verdad muestra los valores que toma la señal Z de acuerdo a

los valores de las señales A y B.

A B Z

0 0 0

0 1 0

1 0 0

1 1 1

Puede observarse que la función implementada es una and de las señales A y B.

La especificación de un process es simple si se tiene siempre presente las dos reglas de

evaluación.

Errores comunes en la descripción de process

Siempre debemos recordar que el sintetizador trata de reconocer patrones en el código que

coincidan con los recursos de hardware en los que se puede implementar un diseño digital. El

no cumplimiento de estos patrones en la descripción, puede provocar la implementación de

un hardware diferente al deseado. Veremos a continuación, algunos errores que se pueden

provocar por la especificación deficiente en la descripción de process, y las técnicas o estilos

más adecuados de codificación para evitarlos.

Lista sensitiva incompleta

La lista sensitiva debe contener todas las señales cuyos cambios fuerzan a una nueva

evaluación del process. Si una señal, por ejemplo la señal B de nuestro ejemplo, no es incluida

en la lista sensitiva, entonces la salida Z no modificará su valor ante cambios de la señal B. Esto

significaría que Z debe retener el valor que le fue asignado cuando cambió la señal A.

Si el circuito debe retener un valor, entonces deja de ser un circuito combinacional para pasar

a ser un circuito secuencial. Sin embargo, esta no es una forma adecuada para describir

circuitos secuenciales, por lo que la síntesis de un process con una lista sensitiva incompleta

puede producir resultados indeterminados. Por ejemplo, en Quartus Prime Lite versión 18.0, el

compilador muestra el siguiente warning:

Warning (10492): VHDL Process Statement warning at): signal

"B" is read inside the Process Statement but isn't in the

Process Statement's sensitivity list

Sin embargo, el hardware implementado será el mismo que el obtenido cuando la lista

sensitiva incluye las señales A y B.

A

B

Z

Page 31: Introduccio n a VHDL

Para circuitos combinacionales, la lista sensitiva debe incluir todas las señales que son entradas en el process, estas son: (1) las señales utilizadas en los condicionales, y (2) las señales que están a la derecha de las asignaciones en el process.

En próximas unidades, veremos la manera de describir circuitos secuenciales en modo reloj,

ampliamente utilizados en diseño digital en dispositivos FPGA.

Asignación incompleta

Una asignación incompleta ocurre cuando no se le asigna ningún valor a la señal de salida del

process cuando éste es evaluado. Esto puede ser adecuado cuando se desean describir latches,

pero los latches, generalmente, no son adecuados en diseños digitales en dispositivos FPGA. Su

implementación proviene, generalmente de una asignación incompleta.

Por ejemplo, suponemos que en el código de nuestro ejemplo, no se le asigna ningún valor a Z

en la cláusula if:

process (A,B)

begin

if A = ‘1’ then

Z <= B;

end if;

end process;

En esta caso, la señal Z no se le asignará valor cuando la señal A sea igual a ‘0’, por lo que debe

permanecer con el valor que le fue asignado cuando la señal A era igual a ‘1’. Esta descripción

implementa un latch en hardware, pero generalmente proviene de un descuido en la

codificación del process, generando un latch transparente (transparent latch, en inglés). Los

sintetizadores modernos podrán indicar con un warning esta situación.

Para evitar este inconveniente, es conveniente realizar asignaciones por defecto al comienzo

del process, quedando nuestro ejemplo:

En lugar de: Es conveniente: process (A,B)

begin

if A = ‘1’ then

Z <= B;

else

Z <= ‘0’;

end if;

end process;

process (A,B)

begin

Z <= ‘0’;

if A = ‘1’ then

Z <= B;

end if;

end process;

Ambas descripciones implementan el mismo hardware, pero la descripción de la derecha es

más conveniente puesto que, al incluir la asignación por defecto de la señal de salida del

process, evita las asignaciones incompletas. Debe observarse que ambas descripciones son

equivalentes porque, al final de la evaluación del process, el último valor asignado a la señal Z

será el mismo.

Page 32: Introduccio n a VHDL

En descripción de hardware, el estilo del código de la columna de la derecha es mucho más

conveniente.

Lección 7: Flip-flops y registros en VHDL Los flip-flops con reloj son muy utilizados en

diseño digital, e imprescindibles en el diseño

digital sincrónico al que están destinados

principalmente los dispositivos FPGA. Un flip-

flop con reloj es un circuito digital cuya salida

se modifica cuando existe un flanco en la señal

de reloj.

Existen varios flip-flops con reloj, pero nos

dedicaremos únicamente al flip-flop tipo D (D-

FF) el cual es incluido en todos los dispositivos FPGA. La figura 4 muestra las diferentes

alternativas de activación de las señales de un flip-flop con reloj, su símbolo y el código VHDL

que lo describe.

En un D-FF, la salida toma el valor de la señal de entrada cuando existe un flanco en la señal de

reloj. El flanco ocurre cuando hay un cambio en la señal. Se dice flanco positivo, si la señal

cambia de 0 a 1, y flanco negativo si la señal cambia de 1 a 0.

Tipo de actividad

Símbolo Descripción en VHDL

Flanco positivo, reset activo bajo.

D Q

Clk

Rst

process (Rst,Clk)

begin

if Rst = ‘0’ then

Q <= ‘0’;

elsif clk’event and clk = ‘1’ then

Q <= D;

end if;

end process;

Flanco positivo, reset activo alto.

D Q

Clk

Rst

process (Rst,Clk)

begin

if Rst = ‘1’ then

Q <= ‘0’;

elsif clk’event and clk = ‘1’ then

Q <= D;

end if;

end process;

Flanco negativo, reset activo bajo.

D Q

Clk

Rst

process (Rst,Clk)

begin

if Rst = ‘0’ then

Q <= ‘0’;

elsif clk’event and clk = ‘0’ then

Q <= D;

end if;

end process;

Page 33: Introduccio n a VHDL

Flanco negativo, reset activo alto.

D Q

Clk

Rst

process (Rst,Clk)

begin

if Rst = ‘1’ then

Q <= ‘0’;

elsif clk’event and clk = ‘0’ then

Q <= D;

end if;

end process;

Fig. 4: Descripción de flip-flop con reloj.

La señal Rst es la señal de reset y fuerza la salida del D-FF a 0 cuando se activa. Puede

observarse que la activación puede ser tanto baja (con un valor 0 en la señal), o alta (con un

valor 1 en la señal).

En la figura, se muestra la manera de describir un D-FF. Para que el sintetizador reconozca este

proceso con reloj (clocked process, en inglés), se debe ser estricto en cumplir lo siguiente:

las señales de la lista sensitiva deben ser solamente las señales de reset y de reloj.

No debe incorporarse ninguna señal adicional a estas dos. Puede también

describirse un reloj sin reset, en la cual la lista sensitiva sólo incluirá la señal de

reloj.

La sentencia if abarca todo el cuerpo del proceso. No puede haber otras sentencias

ni antes de la cláusula if, ni después del end if.

no puede incluirse ninguna otra cláusula elsif o else a la estructura if del cuerpo del

process.

Como puede observarse, debe respetarse el patrón en la descripción de los procesos con reloj,

para que el compilador lo reconozca como un flip-flop y asigne el hardware correspondiente

en el dispositivo FPGA.

Registros (registers, en inglés) Los registros están conformados por un conjunto de flip-flops que tiene el reset y la señal de

reloj en común. Sirven para almacenar más información que la que se podría almacenar en un

flip-flop individual. Para simplificación, el símbolo de un registro será similar al del flip-flop,

puesto que la diferencia se dará por los elementos que tendrán las señales de entrada (D) y de

salida (Q). Si la señales Q y D son vectores, entonces el símbolo representará a un registro.

Utilidad de flip-flops y registros con reloj. En diseño digital se utilizan compuertas electrónicas para la implementación de los circuitos.

Estas compuertas electrónicas utilizan dos voltajes diferentes para representar los niveles

lógicos, que nosotros denominamos 0 y 1.

Las entradas y las salidas de las compuertas serán voltajes y diremos que implementan una

determinada función lógica de acuerdo a los voltajes que toman las salidas conforme al voltaje

de las entradas. Cuando la compuerta está estable (es decir que no hay cambios en las

entradas ni en la salida), entonces hay una relación de los voltajes de las entradas y salida con

la función lógica que implementa.

Page 34: Introduccio n a VHDL

Sin embargo, el voltaje no es una señal digital, sino que es analógica. Esto significa que para

cambiar de un voltaje a otro debe pasar por todos los valores intermedios entre ambos

valores. Este cambio requiere tiempo. Es decir que, por ejemplo, para cambiar de un voltaje

que represente el 0 lógico, digamos 0 Volt, a un voltaje que represente el 1 lógico, digamos 5

Volt, el voltaje pasará por todos los valores intermedios y requerirá un determinado tiempo

para realizarlo. Esto provoca un transitorio en el cual el valor del voltaje no puede asociarse a

ningún valor lógico.

Durante los transitorios, el comportamiento de la compuerta electrónica no puede asociarse a la función lógica que implementa.

La consideración del transitorio en diseño digital requiere criterios de diseño que pueden

resultar en hardware más complejos. En diseño digital sincrónico, la señal de reloj sirve para

discretizar el tiempo y considerar los valores de los voltajes solo cuando corresponden a sus

correspondientes valores lógicos.

Los flip-flop y los registros con reloj permiten actualizar sus salidas solo cuando los voltajes de

sus entradas son los que se corresponden con los niveles lógicos. La salida no se actualizará

mientras las entradas sean transitorias. Por supuesto:

Para que exista consistencia lógica, TODOS los relojes de los flip-flop y de los registros deben se producidos por la misma señal de reloj.

Los dispositivos FPGA están diseñados, fundamentalmente, para la implementación de

circuitos sincrónicos.

Unidad 4: Señales, vectores y representaciones numéricas en

VHDL La descripción de señales y vectores permite mayor abstracción en el diseño digital. La

asignación de una representación numérica a vectores, permite la definición de operación

aritméticas en diseño digital.

Lección 8: Señales y tipo std_logic En diseño digital, las señales determinan los

nodos del hardware y, por su gran importancia,

es importante considerar detenidamente su

descripción cuando se utilizan lenguajes de

descripción de hardware.

A nivel de implementación, los nodos en un

circuito digital, sólo pueden tomar dos valores

lógicos: ‘0’ y ‘1’. Sin embargo, estos dos valores

lógicos no son suficientes cuando se desea

describir un circuito digital. Este hecho quedó en evidencia cuando la incorporación de la

lógica multi-valuada al lenguaje de VHDL se realizó posterior a su estandarización.

Page 35: Introduccio n a VHDL

El lenguaje VHDL incorpora la definición de lógica multi-valuada mediante la adopción del tipo

std_logic en el paquete std_logic_1164 de la librería IEEE. El tipo std_logic define nueve

valores válidos que pueden ser asignados a una señal declarada como std_logic. La tabla 1

muestra los diferentes valores del tipo std_logic.

Valor Descripción

‘U’ No inicializado (uninitialized, en inglés). Se utiliza en simulación para Indicar que a la señal no se le ha asignado ningún valor.

‘X’ Desconocido (unknown, en inglés). Se utiliza en simulación para indicar que no es posible determinar su valor o resultado.

‘0’ Es el valor 0 lógico.

‘1’ Es el valor 1 lógico.

‘Z’ Alta impedancia. Se utiliza en pines del dispositivo FPGA cuando se desea que tome el valor de alta impedancia.

‘W’ Desconocido para lógica débil, utilizado generalmente para lógica open-drain (no utilizado en dispositivos FPGA).

‘L’ Valor ‘0’ para lógica débil, utilizado generalmente para lógica open-drain (no utilizado en dispositivos FPGA).

‘H’ Valor ‘1’ para lógica débil, utilizado generalmente para lógica open-drain (no utilizado en dispositivos FPGA).

‘-‘ Don´t care, utilizado para permitirle al compilador seleccionar el valor lógico más conveniente para la síntesis (muy utilizado en diseño digital con dispositivos FPGA).

Tabla. 1: Valores definido en el tipo std_logic.

Vectores y std_logic_vector Los vectores son un conjunto de señales agrupadas con el objetivo de poder codificar un

mayor número de información. Por ejemplo, si se utiliza una señal, los valores que podrá tener

dicha señal son los valores lógico '0' y '1'. Si es necesario codifica más valores que solamente

dos, entonces será necesario agrupar más señales. Si se agrupan dos señales, se podrán

codificar 4 valores: "00", "01", "10" y "11". Con un vector de 3 señales serán 8 valores posibles,

con 4 serán 16, etc.

En VHDL el tipo std_logic_vector permite definir vectores de señales del tipo std_logic. Existen

dos maneras de declarar vectores del tipo std_logic vector:

signal A : std_logic_vector(3 downto 0);

Declara un vector con el nombre A que tiene 4 elementos: A(3) es el elemento de más a la

derecha, mientras que A(0) es el elemento de más a la izquierda. Cuando se utiliza la cláusula

downto, el índice de la derecha (en este caso 3), debe ser mayor que el índice de la derecha

(en este caso 0).

signal B : std_logic_vector(4 to 7);

Declara un vector con el nombre B que tiene 4 elementos: B(4) es el elemento de más a la

derecha, mientras que B(7) es el elemento de más a la izquierda. Cuando se utiliza la cláusula

to, el índice de la derecha (en este caso 4), debe ser menor que el índice de la derecha (en este

caso 7).

Page 36: Introduccio n a VHDL

Todas las operaciones lógicas (and, nand, or, nor, xor, xnor, not) y la asignación están definidas para los vectores y se realizan por POSICIÓN, no por índice.

Por ejemplo, la sentencia

A <= B;

asigna a cada elemento de A el elemento en la misma posición en B, siendo equivalente a:

A(3) <= B(4);

A(2) <= B(5);

A(1) <= B(6);

A(0) <= B(7);

Por supuesto, los vectores deben tener la misma cantidad de elementos.

Subvectores Cuando se utilizan vectores en la descripción de hardware, existe frecuentemente la necesidad

de hacer referencia a un subconjunto de elementos de un vector o conformar un vector a

partir de señales o vectores con menor número de elementos.

Para referenciar a un subconjunto de elementos del vector se utilizan los índices para

especificar el rango. Por ejemplo:

A(2 downto 1) especifica un vector conformado por los elementos A(2) y A(1) del vector

A, en ese orden de izquierda a derecha.

B(5 to 7) especifica un vector conformado por los elementos B(%), B(6) y B(7) del vector

B, en ese orden de izquierda a derecha.

Todas las referencias a un subvector, deben utilizar la misma cláusula downto o to utilizada cuando se declaró el vector.

Es decir, todas las referencias a subvectores de A deberán utilizar downto, y todas las

referencias a B deberán utilizar to. La única excepción a esto es cuando se hace referencia a un

elemento individual en que sólo se utiliza un índice. Por ejemplo:

A(3) para hacer referencia al elemento con índice 3 del vector A.

Concatenación y agregación de vectores Cuando se desea conformar un vector a partir de señales o vectores de menor cantidad de

elementos, entonces el lenguaje VHDL permite dos tipos de manipulaciones de señales:

concatenación y agregación

Concatenación

El operador & permite concatenar señales y vectores para conformar un vector de mayor

número de elementos. La concatenación se realiza por posición. Por ejemplo, con los vectores

A y B definidos en la sección anterior, y con el vector Z definido como:

signal Z : std_logic_vector(8 downto 0);

Page 37: Introduccio n a VHDL

la sentencia

Z <= A & B & B(5);

asignará al vector Z los valores de un vector de 9 elementos (4 por A, 4 por B y uno por B(3)),

de la siguiente manera:

Z(8) <= A(3),

Z(7) <= A(2),

Z(6) <= A(1),

Z(5) <= A(0),

Z(4) <= B(4),

Z(3) <= B(5),

Z(2) <= B(6),

Z(1) <= B(7),

Z(0) <= B(5)

Los elementos del vector Z serán asignados conforme a la posición de cada uno de los

elementos resultantes de la concatenación.

Agregación

La agregación también es un operador que permite la conformación de vectores a partir de

vectores de menor cantidad de elementos, o de señales individuales.

Existen dos formas de agregación: (1) por posición, y (2) por nombre o índice.

Agregación por posición

La agregación por posición tiene la forma:

Z <= (A, B, B(5));

Puede observarse que los elementos que conformarán el vector resultante, están entre

paréntesis y separados por comas. El concepto es muy similar a la concatenación: el orden de

los elementos en el vector resultante será el orden en que son descriptos en la agregación.

Agregación por nombre o agregación por índice

La agregación por nombre, o también denominada por índice, permite asignar cada elemento

del vector resultante, identificándolo por su índice.

Por ejemplo, el ejemplo anterior utilizado en la concatenación y la agregación por posición,

podría describirse con agregación por nombre o índice como:

Z <= (8 downto 5 => A, 4 downto 1 => B, ‘0’ => B(5));

Puede observarse que en la agregación por nombre se especifican los índices en el vector

resultante y se define qué señal se le asigna correspondientemente. En este caso entonces, no

importa el orden en que se especifiquen la agregación, siendo equivalente:

Z <= (4 downto 1 => B, ‘0’ => B(5), 8 downto 5 => A);

O equivalente a:

Z <= (4 => B(4), 3 => B(5), 2 => B(6), 1 => B(7), ‘0’ =>

B(5), 8 downto 5 => A);

Page 38: Introduccio n a VHDL

Una característica adicional de la agregación por nombre es la cláusula por defecto que

permite asignar un valor por defecto a los elementos que no hayan sido explícitamente

especificados. Por ejemplo, en la asignación anterior, el elemento 3 y el elemento 0 del vector

resultante son asignados con B(5), por lo que podría describirse de la siguiente manera con la

cláusula por defecto (others):

Z <= (4 => B(4), 2 => B(6), 1 => B(7), 8 downto 5 => A,

others => B(5));

NOTA: no todas las herramientas de síntesis soportan agregación en su forma original, por lo que es conveniente utilizar concatenación cuando se describe a nivel RTL.

Una alternativa muy utilizada, que es sintetizable por TODAS las herramientas de síntesis, es la asignación por defecto, en la que se asigna un valor, ‘0’ o ‘1’, a todos los elementos del vector mediante la cláusula por defecto:

Z <= (others => ‘0’);

o

Z <= (others => ‘1’);

Este tipo de asignación de valor por defecto a todos los elementos del vector es muy

conveniente y por consiguiente aparecerá frecuentemente en código en lenguaje VHDL.

Lección 9: Representaciones numéricas en VHDL Hasta ahora hemos visto que los vectores están

conformados por elementos del mismo tipo

(por ejemplo std_logic_vector está conformado

por elementos del tipo std_logic) y que están

identificados por el índice de la posición del

elemento en el vector.

Los vectores NO TIENEN REPRESENTACIÓN NUMÉRICA.

La información asignada a un vector std_logic_vector, está dada por la información asignada a

cada uno de los elementos del vector. Todas las operaciones lógicas están definidas sobre los

vectores como las operaciones sobre cada posición de los elementos individuales.

Es muy común sin embargo, que deseemos representar magnitudes numéricas y poder realizar

operaciones aritméticas como suma, resta, multiplicación.

Para realizar operaciones aritméticas, debemos definir qué representación numérica le asignaremos al vector de elementos.

Page 39: Introduccio n a VHDL

Existen dos tipos de representaciones numéricas ampliamente utilizadas en diseño digital:

Binaria: en la que el conjunto de elementos es una representación ponderada en

base dos. Cada elemento es ponderado con una potencia de la base (en digital la

base es igual a 2), comenzando con potencia 0 en el elemento de más a la derecha

e incrementando la potencia para los elementos de más a la izquierda.

Potencia … 3 2 1 0

Ponderación … 23 = 8 22 = 4 21 = 2 20 = 1

La representación binaria es similar a lo que realizamos con el sistema decimal. En el sistema

decimal, las unidades están ponderadas por 1, las decenas por 10, las centenas por 100 y así

sucesivamente, asignándole una ponderación de potencia de diez a cada cifra del número. En

la representación binaria, la ponderación es en base dos, por lo que serán 1, 2, 4, 8, …

La representación binaria permite solamente números positivos. Un vector de N elementos

puede representar números en el rango de 0 a 2N-1. Es decir, un vector de 8 elementos, en

representación binaria, puede representar número de 0 a 255.

El paquete Numeric de la librería IEEE define el tipo UNSIGNED basados en vectores

std_logic_vector para representaciones binarias y define las operaciones aritméticas sobre

este tipo de datos. Al estar basado en std_logic_vector, todas las manipulaciones de vectores y

operaciones lógicas también están definidas sobre UNSIGNED. La declaración de una señal del

tipo UNSIGNED se realiza de manera similar a la de std_logic_vector. Por ejemplo, ,un

UNSIGNED, Y, de 8 elementos se declararía:

signal Y : UNSIGNED(7 downto 0);

Complemento a dos: es una representación numérica que permite la

representación de números positivos y negativos. En la representación a

complemento a dos, el bit más significativo (el elemento de más a la izquierda) es

igual a 1 si el número es negativo, e igual a 0 si el número representado es positivo.

Para convertir un número en complemento a dos de positivo a negativo, y

viceversa, se debe realizar:

Complemento a dos de X = representación binaria de (not(X)) + 1

Un vector de N elementos puede representar números en un rango de 2N-1 a 2N-1-1.

Es decir, un vector de 8 elementos, en representación a complemento a dos, puede

representar número de -128 a 127.

El paquete Numeric de la librería IEEE define el tipo SIGNED basados en vectores

std_logic_vector para representaciones en complemento a dos y define las operaciones

aritméticas sobre este tipo de datos. Al estar basado en std_logic_vector, todas las

manipulaciones de vectores y operaciones lógicas también están definidas sobre SIGNED. La

declaración de una señal del tipo SIGNED se realiza de manera similar a la de std_logic_vector.

Por ejemplo, ,un SIGNED, Y, de 8 elementos se declararía:

Page 40: Introduccio n a VHDL

signal Y : SIGNED(7 downto 0);

El paquete numeric definirá las operaciones aritméticas y de comparación sobre los tipos

signed y unsigned. El comienzo de nuestro código incluirá ahora esta nueva librería para

quedar:

library IEEE:

use IEEE.std_logic_1164.all;

use IEEE.numeric.all;

Puede, alternativamente al paquete numeric, utilizarse la librería std_logic_arith, pero que

está desaconsejada para nuevos diseño.

Las operaciones aritméticas definidas sobre los tipos unsigned y signed y que pueden ser

utilizadas a nivel RTL (es decir que pueden ser sintetizables):

Operación aritmética Símbolo VHDL

suma +

resta -

multiplicación *

Los operadores relacionales, utilizados para comparación son definidos como:

Operación relacional (comparación) Símbolo VHDL

Igual =

Distinto /=

Mayor >

Menor <

mayor o igual >=

menor o igual <=

En el paquete numeric son definidas otras operaciones aritméticas, pero generalmente no

pueden utilizarse en diseño para síntesis (son definidas en nivel comportamiento).

Es importante considerar que, cuando se utilizan los operadores aritméticos o relacionales, el

hardware implementado dependerá del operador y de los tipos de señales a los que se aplica

el operador. Por ejemplo, si se realiza la suma de dos señales unsigned, entonces el hardware

implementado será el que realiza la suma de dos números binarios.

Es decir, un operador puede estar implementado de diferentes maneras de acuerdo al tipo de

dato sobre los que opera. Esta característica, en la que un operador puede estar definido de

múltiples maneras conforme a los tipos de los datos sobre los que opera, se denomina

"overloading". Esto hace que todos los operadores lógicos y aritméticos estén definidos para

todas las posibles combinaciones de tipos de señales de entrada y salida. Puede existir el caso,

en que alguna combinación no esté definida, y sea necesaria una conversión del tipo de dato

para poder tener definido el operador deseado. El lenguaje VHDL utiliza conversión y cast para

adaptar los tipos de datos entre sí.

Page 41: Introduccio n a VHDL

Cast es una indicación al sintetizador para que considere la señal con un tipo de dato diferente

al que ha sido definida. Por ejemplo, si las señales A y B han sido definidas como vector

std_logic_vector, pero se quiere utilizar el operador suma y que sea considerado como un

número binario, entonces se le indica al sintetizador con un cast que esa señal sea considerada

un unsigned.

C <= UNSIGNED(A) + UNSIGNED(B);

El cast, como en este caso, no produce ninguna modificación en la señal, sino que le indica al

sintetizador que considere esa señal con otro tipo de dato diferente al que ha sido definido

originalmente. Por supuesto, el tipo de dato original de la señal y el que se desea considerar

para el operador deben permitir el cast.

La otra manera de adaptar de un tipo de señal a otro, es a través de la conversión. La

conversión de un tipo de dato puede conllevar la inclusión de hardware. Es decir, a diferencia

del cast, no es una indicación para el compilador, sino que repercute en el hardware

implementado.

El paquete numeric estándar diferencia las funciones de conversión, agregándoles el prefijo

to_.

Es importante tener en cuenta estas funciones de conversión y el método de cast, para poder utilizar los operadores de diferentes paquetes y de VHDL sobre vectores y señales con tipos de datos no soportados.

El tipo de dato integer es un tipo de dato estándar de VHDL con representación numérica

sintetizable. Es importante tener en cuenta que cuando se define una señal con el tipo de dato

integer , es conveniente definirle un rango a la misma para acotar el número de elementos de

dicha señal integer. Si no se especifica un rango de las señales tipo integer , generalmente, el

sintetizador dará por defecto 32 elementos a la señal, lo que podrá repercutir en una sub

utilización de los recursos del dispositivo FPGA.

En este curso, evitaremos la declaración de señales del tipo integer en el código sintetizable y sólo utilizaremos las funciones de conversión para facilitar la obtención de índices, cuando corresponda.

La figura 5 muestra las diferentes conversiones y cast que permiten los tipos de datos del

paquete numeric.

Page 42: Introduccio n a VHDL

Fig. 5: Conversión y cast de tipo de datos en paquete NUMERIC.

Es importante recordar que todas las señales en diseño digital estarán conformadas por nodos

eléctricos cuyos valores lógicos serán cero o uno. Una representación numérica permite

brindarle un significado numérico a esas señales lógicas, para poder realizar operaciones

aritméticas y relacionales sobre esas señales. Es decir, las señales siempre van a ser señales

lógicas en el hardware. La representación numérica es un significado que le damos a esas

señales para poder realizar operaciones aritméticas y relacionales.

Page 43: Introduccio n a VHDL

Unidad 5: Máquinas de estados en VHDL La realización de máquinas de estados permite la implementación de autómatas mediante

circuitos digitales. El lenguaje VHDL permite una abstracción a nivel RTL para la

implementación de este tipo de circuitos secuenciales.

Lección 10: Descripción de Máquinas de Estados Finitos en VHDL En diseño digital, existen dos tipos de circuitos:

los circuitos combinacionales, en

los que la salida es función de las

entradas actuales, y

los circuitos secuenciales, en los

que la salida es función de la

secuencia con que fueran dadas las

entradas.

Los circuitos combinacionales son los circuitos que hemos utilizado como ejemplo hasta ahora.

En éstos, la salida puede determinarse de acuerdo al valor actual de las entradas.

Esquemáticamente, los circuitos combinacionales se representan, de manera general, como

una caja negra con entradas y salidas.

Por otro lado, en los circuitos secuenciales, el valor de la salida depende de la secuencia en

que son dadas las entradas. Un ejemplo fácil para comprender el concepto, puede ser la

desactivación de una cerradura mediante una secuencia de desactivación.

Supongamos que tenemos 3 entradas digitales, A, B y C y una salida Z. Si la salida Z está en

uno, entonces la cerradura está abierta y se puede abrir la puerta blindada. Por el contrario, si

la salida Z está en cero, entonces la cerradura está cerrada, y no se puede abrir la puerta.

El modo de funcionamiento de la cerradura es el siguiente: la cerradura estará abierta si la

entrada A es igual a 1, la entrada B es igual a 1 y la entrada C es igual a uno. Sin embargo, no es

suficiente que las entradas tengan estos valores, sino que deben ser asignados en una

determinada secuencia.

En nuestro caso, la secuencia deberá comenzar con todas las señales de entrada en cero.

Luego, la primera señal que debe ponerse en uno es la entrada A. Posteriormente, en la

tercera secuencia, la entrada C debe ponerse en uno. Por último, en la cuarta secuencia, la

Page 44: Introduccio n a VHDL

entrada B debe tomar el valor uno. Si las entradas fueron tomando los valores correctos, en las

secuencias adecuadas como se detalló, entonces la salida tomará el valor de uno, abriendo la

cerradura.

Secuencia A B C Z

Primera 0 0 0 0

Segunda 1 0 0 0

Tercera 1 0 1 0

Cuarta 1 1 1 1

La secuencia debe ser respetada para que la apertura de la cerradura sea exitosa. Cualquier

diferencia en la secuencia, no producirá la apertura de la cerradura.

Por ejemplo, si se cambia la segunda por la tercera secuencia, la salida no abrirá la cerradura,

aun cuando la primera y cuarta secuencia sean las correctas.

¿Cómo detectamos la secuencia correcta para abrir la cerradura?

A continuación describiremos los pasos necesarios para detectar la secuencia correcta que

abre la cerradura. Por supuesto, debemos comenzar esperando que las entradas tengan la

secuencia correcta. Esto es que las señales A, B y C sean todas igual a cero. A esta condición de

espera la denominaremos estado 1.

En tal caso, si los valores de las entradas corresponden a los de la primera secuencia,

pasaremos a otra condición, que denominaremos estado 2, en el que esperaremos que la

segunda secuencia sea la correcta.

Si las entradas no tienen los valores de la primera secuencia, entonces seguimos en el estado 1

uno esperando la primera secuencia. En el estado 2, esperamos que en las entradas esté la

segunda secuencia correcta. Esta es, la entrada, A, en uno, y las entradas, B, y, C, en cero.

Si la segunda secuencia es la correcta, entonces continuaremos en otro estado en el que

esperaremos la tercera secuencia. Si todavía las entradas no se modificaron de las de la

primera secuencia, entonces seguiremos en el estado 2, esperando la segunda secuencia.

Si por el contrario, las entradas no corresponden ni a la primera ni a la segunda secuencia,

entonces volveremos al estado uno para esperar nuevamente la primera secuencia porque se

produjo una secuencia incorrecta y debe comenzarse todo el proceso nuevamente.

En el estado 3, estaremos esperando que la entrada A y C tengan el valor de uno, y la entrada

B sea igual a cero.

De manera similar al punto del estado 2, si los valores de las entradas es la tercera secuencia

correcta, entonces pasaremos al estado 4 en el que esperaremos la cuarta secuencia correcta.

Si las entradas todavía se mantienen con la segunda secuencia, entonces seguiremos en el

estado 3 esperando la tercera secuencia. Si por el contrario, hubo un cambio en las entradas

pero no fue la tercera secuencia, entonces volveremos al estado uno para comenzar todo el

proceso de detección nuevamente.

Page 45: Introduccio n a VHDL

El estado 4 será similar a los anteriores, esperando la cuarta secuencia válida. Si las entradas

son modificadas correctamente con la cuarta secuencia, esto es todas las señales en uno,

entonces pasaremos a un estado 5 en que abriremos la cerradura. Si las entradas no se

modificaron de la correspondiente a la tercera secuencia, continuaremos en el estado 4

esperando la cuarta secuencia. Y, si por el contrario, las entradas se modificaron, pero la

secuencia no fue satisfecha, entonces se continuará en el estado uno para comenzar todo el

proceso de detección nuevamente.

En el estado 5, la secuencia fue completada y la cerradura puede abrirse. Se continuará en

dicho estado mientras las entradas permanezcan en los valores de la cuarta secuencia.

Esta es la descripción de los diferentes estados y las condiciones que producen cambios de

estado, conforme a los valores de las entradas y que detectan la secuencia correcta que activa

la cerradura.

estado 1 (esperar primera secuencia)

Si A=0, B=0 y C=0 Continuar en estado 2

Si no, Continuar en estado 1

estado 2 (esperar segunda secuencia)

Si A=1, B=0 y C=0 Continuar en estado 3

Si A=0, B=0 y C=0 Continuar en estado 2

Si no Continuar en estado 1

estado 3 (esperar tercera secuencia)

Si A=1, B=0 y C=1 Continuar en estado 4

Si A=1, B=0 y C=0 Continuar en estado 3

Si no, Continuar en estado 1

estado 4 (esperar cuarta secuencia)

Si A=1, B=1 y C=1 Continuar en estado 5

Si A=1, B=0 y C=1 Continuar en estado 4

Si no, Continuar en estado 1

estado 5 (apertura cerradura)

Si A=1, B=1 y C=1 Continuar en estado 5

Si no, Continuar en estado 1

Fig. 6: Detalle de condiciones para la transición de estados de la cerradura.

Puede verse que la detección de la secuencia involucró diferentes estados conforme a los

cambios que se producían en las entradas. Es decir, los cambios de las entradas hacían cambiar

el estado en que estábamos.

Podemos notar que, sabiendo el estado en el que está el proceso, se puede determinar

cuántas fueron las secuencias correctas. Esto es, si estamos en el estado 3, esperando la

tercera secuencia de entradas, entonces las entradas anteriores fueron la primera y la

segunda. Es decir, no necesitamos recordar la secuencia de entradas, porque podemos

inferirlas del estado en el que estamos.

“El estado de un circuito secuencial es una colección de variables de estado cuyos valores en cualquier tiempo contienen toda la información acerca del pasado necesaria para

Page 46: Introduccio n a VHDL

explicar el comportamiento futuro del sistema” (Herbert Hellerman, “Digital computer systems principles”, Mc Graw-Hill – 1967).

Generalmente, se utilizan diagramas de estados para representar circuitos secuenciales. En un

diagrama de estados, los estados son representados por círculos que son los nodos de un

grafo. La condición que hace cambiar de estado es representada por una flecha que indica con

su sentido el estado destino cuando la condición se cumpla. En el arco se expresa la condición

que debe cumplirse para que tal transición de estado se produzca. Las condiciones por defecto

de permanecer en el mismo estado, no involucra transición, por lo que no es necesario

representarla con ningún arco en el diagrama.

La figura 7 muestra el diagrama de estados de la máquina de estados que detecta la secuencia

correcta para la apertura de la cerradura.

Fig. 7: Diagrama de estados de detección de secuencia de cerradura.

Este diagrama de estados nos indica el próximo estado en función del estado actual y los

valores actuales de las entradas. Esto es, el próximo estado estará definido por el estado actual

y por el valor de las entradas actuales. Esto define una lógica combinacional que puede ser

representada en la figura 8:

Fig. 8: Diagrama de estados de detección de secuencia de cerradura.

Por supuesto, el sistema requiere, para evolucionar, que el estado actual en el futuro sea el próximo estado,

Page 47: Introduccio n a VHDL

Esto se logra realimentando la salida de próximo estado a la entrada de estado actual, como

lo muestra la figura 9.

Fig. 9: Circuito secuencial en modo fundamental.

Cuando la realimentación es directa, se dice que el circuito funciona en modo fundamental. En

este modo, deben respetarse criterios de diseño cuando se realiza con circuitos electrónicos.

Recordemos que las compuertas electrónicas tienen transitorios que no son modelados por la

lógica digital que deseamos implementar. De esta manera, cuando se realimenta el estado, en

la entrada del circuito habrá un transitorio del que se desconoce el comportamiento del

circuito y, en consecuencia, desconoceremos la salida. Esto produce una evolución que puede

ser indeseada.

En diseño digital sincrónico, el lazo de realimentación funciona a tiempo discreto. Se dice que

el circuito funciona en modo reloj. La figura 10 muestra que el registro en el lazo de

realimentación discretiza el tiempo y en consecuencia evita la propagación de los transitorios

por el lazo de realimentación.

Fig. 10: Circuito secuencial en modo reloj.

El flanco de reloj que cierra el lazo de realimentación, debe ser producido cuando el transitorio haya transcurrido y el sistema esté estable.

Page 48: Introduccio n a VHDL

Resumiendo, un circuito secuencial podrá ser implementado por una máquina de estados que

puede ser representado con un diagrama de estados. Una consideración práctica para su

implementación es que, el número de posibles estados sea finito: por ello se habla de máquina

de estados finitos. Por eso, en diseño digital, nos referiremos siempre a máquinas de estados

finitos cuando hablemos de circuitos secuenciales.

En estas máquinas de estados finitos, podremos implementar la función de próximo estado,

mediante lógica combinacional. Luego, para darle dinámica al sistema, el próximo estado se

realimenta al estado actual para que se produzca la evolución deseada. Esto es, que el próximo

estado, sea el estado actual, en el futuro.

Sin embargo, debemos tener cuidado con esta realimentación. Recordemos que, cuando la

lógica combinacional es implementada con compuertas electrónicas, durante las transiciones,

las señales tienen voltajes que no corresponden a niveles lógicos. En consecuencia,

realimentar en la entrada un transitorio de la salida, podrá provocar evoluciones indeseadas

de nuestro circuito. Un registro se ubica en el lazo de realimentación para discretizar el tiempo

y evitar que los transitorios cierren un lazo de realimentación.

Lo único que resta por determinar es que, la salida Z será igual a 1 cuando el estado sea igual a

5, caso contrario, la salida Z será igual a 0.

Descripción de máquinas de estados en VHDL Para la descripción de la máquina secuencial de la sección anterior, primero sería conveniente

definir un tipo de dato para la variable de estado del circuito secuencial. Este tipo de dato

tendrá definido los nombres de los estados, en este caso: uno, dos, tres, cuatro y cinco. A este

tipo de dato lo denominaremos tipo_estado y lo definiremos con la siguiente sentencia de

VHDL, en la parte declarativa de la arquitectura:

type tipo_estado is (uno, dos, tres, cuatro, cinco);

Con esta declaración, podemos declarar dos señales del tipo tipo_estado que serán las señales

de estado actual y próximo estado de nuestra máquina de estados finitos:

signal estado_actual, proximo_estado : tipo_estado;

Las señales estado_actual y proximo_estado sólo podrán ser asignados con los valores

definidos en el tipo tipo_estado; estos son: “uno”, “dos”, “tres”, “cuatro” y “cinco”.

La figura 11 muestra el código del proceso combinacional de la lógica estado – próximo estado.

La lista sensitiva del proceso contiene las señales de entradas (señales A, B y C) y la señal de

estado actual (estado_actual).

El cuerpo del proceso cuenta con una sentencia case que seleccionará diferente opciones de

acuerdo al valor de la señal estado_actual.

Las diferentes valores que puede tomar la señal estado_actual, están detallados especificados

en sendas cláusulas when correspondientes a la sentencia case. El conjunto de sentencias

dentro de la cláusula when, serán evaluadas cuando la variable estado_actual tenga asignado

el valor especificado en la cláusula when. Por ejemplo:

Page 49: Introduccio n a VHDL

case estado_actual is

when uno =>

if A='0' and B='0' and C='1' then

proximo_estado <= dos;

else

proximo_estado <= uno;

end if;

Especifica que si el valor de la señal estado_actual es igual a “uno”, entonces se evalúa la

sentencia if que está definida en la cláusula “when uno =>”.

Puede observarse que los valores que cubren las cláusulas when, son todos los valores que

pueden ser asignados a una señal del tipo estado_actual. Además, como el valor de la señal

estado_actual es uno solo, siempre será solo una cláusula when la que será evaluada.

Page 50: Introduccio n a VHDL

Fig. 11: Proceso combinacional de estado / próximo estado

Las sentencias if especifican el valor de la señal proximo_estado según el valor de las señales

de entrada. Puede observarse que el cuerpo del process especifica con las sentencias case e if

las condiciones de próximo estado detalladas en el código de la figura 6.

Realizada la lógica combinacional de estado actual / próximo estado, es necesaria la

realimentación registrada de la variable de estado. Esto se puede realizar mediante un simple

process con reloj:

process (rst, clk)

begin

process (estado_actual,A,B,C)

begin

case estado_actual is

when uno =>

if A='0' and B='0' and C='1' then

proximo_estado <= dos;

else

proximo_estado <= uno;

end if;

when dos =>

if A='1' and B='0' and C='0' then

proximo_estado <= tres;

elsif A='0' and B='0' and C='0' then

proximo_estado <= dos;

else

proximo_estado <= uno;

end if;

when tres =>

if A='1' and B='0' and C='1' then

proximo_estado <= cuatro;

elsif A='1' and B='0' and C='0' then

proximo_estado <= tres;

else

proximo_estado <= uno;

end if;

when cuatro =>

if A='1' and B='1' and C='1' then

proximo_estado <= cinco;

elsif A='1' and B='0' and C='1' then

proximo_estado <= cuatro;

else

proximo_estado <= uno;

end if;

when cinco =>

if A='1' and B='1' and C='1' then

proximo_estado <= cinco;

else

proximo_estado <= uno;

end if;

end case;

end process;

Page 51: Introduccio n a VHDL

if rst = '1' then

estado_actual <= uno;

elsif clk'event and clk = '1' then

estado_actual <= proximo_estado;

end if;

end process;

Este process con reloj, actualiza el valor de la señal de estado_actual con el valor de la señal

proximo_estado. La frecuencia de la señal de reloj (clk) debe ser suficientemente alta como

para no perder cambios en las señales de entradas (A, B y C), pero suficientemente baja como

para permitir que los transitorios transcurran entre dos flancos consecutivos.

Por último, solo queda describir la señal de salida Z, la cual puede ser realizada mediante la

estructura de un if concurrente (utilizado fuera de process):

Z <= '1' when estado_actual = cinco else '0';

De esta manera, se especificaron las tres lógicas que conformarán la máquina de estado del

ejemplo de la cerradura propuesta:

Lógica combinacional estado actual / próximo estado: definida por un process con

una sentencia case que selecciona el valor del estado actual para todos los posibles

valores que puede tomar la variable de estado,

Lógica registrada con reloj: que implementa la realimentación en tiempo discreto

actualizando el valor del estado actual con el valor del próximo estado.

Lógica de salida: que determina el valor que tomará la salida Z del circuito. En este

caso, la salida sólo depende del valor del estado, por lo que se dice que es una

máquina de Moore. Las máquinas en que la salida depende del estado y de las

entradas, se die que es una máquina de Mealy. Las diferencias entre estas

máquinas se profundizan en el curso de diseño digital.

De esta manera, se logró la descripción de una máquina de estados finitos a nivel RTL en el

lenguaje VHDL.

Lección 11: Descripción jerárquica (o estructural) en VHDL El lenguaje VHDL permite dos tipos de

descripciones para síntesis:

la funcional, en la cual se describen

las funciones en que los valores de la

salida se establecen en función de

los valores de las entradas. Es el tipo

de descripción que hemos utilizado

en las secciones previos, y

Page 52: Introduccio n a VHDL

la jerárquica, en la cual el funcionamiento del diseño se describe de manera

estructural. Esto es, conforme a la manera en que los componentes son

interconectados entre sí.

Estos tipos de descripción no son excluyentes entre sí, y en la mayoría de los diseños se

utilizarán ambas. Sin embargo, en esta unidad detallaremos la manera en que se realizará una

descripción jerárquica.

En una descripción jerárquica, la descripción está dada por la estructura del sistema. Por

ejemplo, podemos definir el funcionamiento de un hardware de acuerdo a la manera en que

están interconectados los componentes que lo integran.

La figura 12 muestra un diseño que está compuesto por dos módulos del componente A y un

módulo del componente B.

Fig. 12: Descripción jerárquica.

Los módulos que componen el diseño tienen entradas y salidas. El diseño muestra las

interconexiones que existen entre los módulos entre sí, y los puertos de entrada y salida del

diseño.

Supongamos que deseamos realizar un circuito de control de cerradura como el video anterior,

pero que en lugar de una secuencia, deseamos que se ingrese la secuencia simultáneamente

en dos juegos de entradas. La figura 13, muestra un esquema del diseño que se desea

describir.

En este diseño, el control de cerradura por secuencia descripta anteriormente es utilizado dos

veces: una para cada una de las dos secuencias que se debe verificar.,

Es decir, existe un solo componente que describe al circuito de la cerradura, pero es

instanciado dos veces, cada una de las cuales verifica que la secuencia sea correcta en sus

respectivas entradas. Las salidas de cada una de las instancias, identificadas como u1 y u2, son

entradas a la compuerta and que activará la cerradura si ambas entradas son activas.

Page 53: Introduccio n a VHDL

Fig. 13: Descripción jerárquica.

Esta descripción se denomina jerárquica o estructural puesto que está descripta por la

interconexión de componentes de menor jerarquía, en este caso el circuito de cerradura con

secuencia. Le asignaremos el nombre de doble_confirmacion a este nuevo diseño puesto que

se requieren dos secuencias simultáneas para la apertura de la cerradura.

La descripción de la entidad a nivel jerárquico es similar a cualquier otra entidad de VHDL. En

este caso, el circuito de doble_confirmacion consta de 6 señales de entrada, A, B, C, D, E, F, la

señal de reset, rst, la señal de reloj, clk, y una salida Z.

entity doble_confirmacion is

port (A, B, C, D, E ,F, clk, rst : in std_logic;

Z : out std_logic );

end entity doble_confirmacion ;

En la arquitectura, debemos definir dos señales internas, para conectar la salida de cada una

de las instancias del componente de cerradura a las entradas de la compuerta and de salida.

También debemos declarar el componente cerradura, para que podamos utilizarlo en nuestro

diseño jerárquico. La declaración de los componentes y de las señales internas, se realiza en la

sección declarativa de la arquitectura.

architecture D1 of doble_confirmacion is

signal Z1, Z2 : in std_logic;

component cerradura

port (rst, clk : in std_logic;

A, B, C : in std_logic;

Z : in std_logic ;

end component;

begin

Para facilitar la declaración del componente en la parte declarativa de la entidad, es

conveniente: (1) copiar la entidad del componente que queremos instanciar, (2) reemplazar la

palabra entity por la palabra component las dos veces en que aparece en la declaración de la

Page 54: Introduccio n a VHDL

entidad, (3) eliminar la palabra is y (4) eliminar el nombre de la entidad al final de la

declaración de la entidad.

La declaración del componente permite instanciarlo en el cuerpo de la arquitectura y definirá

también el orden de los puertos de entrada y salida de la entidad.

El archivo que contiene la descripción VHDL del componente, debe estar en el mismo directorio en que se encuentra el archivo de la descripción jerárquica que lo instancia.

La instanciación del componente, se realiza en el cuerpo de la arquitectura y comienza

asignándole un nombre, que puede ser opcional.

Luego se hace referencia al nombre del componente que se desea instanciar.

Después, en una cláusula port map, se indica qué señal se conecta a cada puerto de la

instancia. En este caso, la señal de reset se coloca primero puesto que es la primera señal

declarada en la entidad del componente cerradura. De manera similar, se realiza la conexión

de la señal de reset, la señal de reloj, las señales de entrada A, B, C y por último la señal

interna Z1.

U1: cerradura port map (rst, clk, A, B, C, Z1);

De manera similar, se describe la instancia, u 2, del componente cerradura.

U2: cerradura port map (rst, clk, D, E, F, Z2);

Se debe notar que las entradas de la instancia u2 del componente cerradura, fueron

conectadas a las entradas D, E, F de la entidad. La salida de la instancia u2 fue conectada a la

señal interna Z2. Debe notarse que el orden de las señales debe coincidir con el orden con el

orden en que se definieron los puertos en la entidad del componente instanciado. Este tipo de

instanciación se la denomina por posición.

Alternativamente, se puede realizar la instanciación por nombre. En este caso, se hace

referencia al nombre del puerto de la entidad y la señal a la que será asociada. Por ejemplo, la

instanciación por nombre de la instancia u2, podría ser:

U2: cerradura port map (rst => rst, clk => clk, A => D,

B => E, C => F, Z => Z2);

El orden de las señales en la instanciación por nombre puede ser arbitrario. Este tipo de

instanciación facilita la lectura del código al tener presente la referencia del puerto al que se

conecta cada señal.

Lo único que resta ahora es especificar la función de la señal de salida, Z.

Z <= Z1 and Z2;

La función, and de salida se realiza entonces sobre las dos señales internas Z1 y Z2, que son las

correspondientemente conectadas a las salidas Z de las instancias U1 y U2, respectivamente.

De esta manera, la descripción completa del circuito de doble_confirmacion estará dado or el

siguiente código:

Page 55: Introduccio n a VHDL

library IEEE;

use ieee.std_logic_1164.all;

entity doble_confirmacion is

port (A, B, C, D, E ,F, clk, rst : in std_logic;

Z : out std_logic );

end entity doble_confirmacion ;

architecture D1 of doble_confirmacion is

signal Z1, Z2 : in std_logic;

component cerradura

port ( rst, clk : in std_logic;

A, B, C : in std_logic;

Z : in std_logic ;

end component;

begin

U1: cerradura port map (rst, clk, A, B, C, Z1);

U2: cerradura port map (rst => rst, clk => clk, A => D,

B => E, C => F, Z => Z2);

Z <= Z1 and Z2;

end architecture D1;

Unidad 6: Simulación Los dispositivos FPGA permiten la implementación de sistemas digitales complejos que pueden

involucran la interacción entre diversos componentes. El análisis de funcionamiento y la

comprensión de las interacciones con eventos externos puede ser difícil de realizar en el

dispositivo físico.

La simulación consiste en generar un ambiente virtual que permite determinar qué

comportamiento tendrá el diseño descripto en la realidad, ante diferentes estímulos en sus

señales de entrada.

El ambiente de simulación está basado en modelos que describen la realidad, PERO NO SON LA REALIDAD.

Por ejemplo, el código VHDL será el modelo que describirá el comportamiento del diseño

descripto. Una simulación permitirá analizar y determinar el valor que tendrán las salidas para

diferentes secuencias de entradas. La simulación debe realizarse de tal manera que represente

lo más fidedigno a lo que acontece en la realidad para que pueda utilizarse para depurar el

diseño.

La simulación permite encontrar las fallas en el diseño para depurarlo: no garantiza la ausencia de fallas. Es decir que, si el diseño falla en la realidad, es porque realizamos una simulación incorrecta con la que no pudimos detectar dicha falla.

Page 56: Introduccio n a VHDL

Lección 12: Simulación con testbench

En esta sección se describirá la técnica de

simulación con testbench. El objetivo al simular

un diseño, es determinar si el comportamiento

que tendrá bajo diferentes secuencias de

entradas, es el comportamiento especificado.

Consideraremos el diseño de la cerradura de

doble confirmación, el cual habilitará la salida

cuando la secuencia de entradas sea la correcta,

y la deshabilitará para secuencias incorrectas.

Para esto, debe suponerse diferentes secuencias de valores en las entradas del diseño y

comprobar que el valor que el diseño produce en las salidas es el correcto.

El lenguaje VHDL, como también ocurre con Verilog HDL, permite descripciones a nivel de

comportamiento en el cual se pueden utilizar sentencias que facilitan la generación de

estímulos en las entradas y compruebe el valor de las salidas.

La utilización de la descripción a nivel de comportamiento permite la creación de simulaciones

basadas en testbench, El testbench es una descripción en un nivel jerárquico superior al

diseño bajo prueba (DUT, del inglés Design Under Testing), en la cual el diseño bajo prueba es

instanciado.

Fig. 14: Jerarquía de testbench.

La descripción del testbench no será sintetizada, sino que sólo será simulada en una

computadora para poder depurar el diseño bajo prueba. Es por esta razón, que el lenguaje

VHDL tiene sentencias de nivel de comportamiento, que sólo pueden ser simuladas.

Por ejemplo, para simular el componente de doble_confirmacion, se debe generar un estímulo

periódico en la señal de reloj. VHDL permite realizar este tipo de comportamiento mediante la

cláusula after de la sentencia de asignación. Así, si realizamos una asignación de la señal de

reloj, clk, complementándola cada 10 nano segundos, entonces el simulador producirá una

señal periódica de una frecuencia de 50 mega Hertz.

Page 57: Introduccio n a VHDL

clk <= not(clk) after 10 ns;

La cláusula after es fácilmente implementada en un ambiente de simulación, pero nunca podrá ser sintetizada para ser implementada en hardware.

Al declarar la señal clk, debe asignarse un valor inicial para, que posteriormente, pueda

complementarse para generar la señal periódica. Esto se realiza mediante la asignación inicial

en la declaración de la señal (se le asigna el valor ‘0’, pero podría asignarse el valor ‘1’

indistintamente en este caso):

signal clk : std_logic := ‘0’;

Esta inicialización de la señal es en modo de comportamiento y no tiene ninguna utilidad para la síntesis. En hardware, las inicializaciones deben realizarse mediante las señales de reset.

Con la señal de reset, debe realizarse una activación al inicio de la simulación y luego

desactivarla cuando el reset haya sido efectuado. Para esto, se utiliza nuevamente la cláusula

after de la asignación.

rst <= ‘1’, ‘0’ after 70 ns;

Esta sentencia especifica que se le asigne el valor uno inmediatamente, esto es, al comienzo de

la asignación, y luego de 70 ns, se le asigne el valor cero. El valor de 70 ns es arbitrario y podría

ser cualquier valor ya que el reset del diseño es asincrónico.

La señal de reset del testbench, puede ser declarada, o no, con un valor inicial.

signal rst : std_logic;

Los valores de las entradas deben ser producidos de acuerdo a las secuencias que se desean

analizar. Para ello, es muy común utilizar un proceso a nivel de comportamiento, que vaya

simulando cambios en las entradas del diseño que estamos depurando. Un proceso a nivel de

comportamiento, puede prescindir de la lista sensitiva, con lo cual será evaluado

permanentemente durante la simulación.

En este proceso, se generan los valores que se desean que tomen las entradas de nuestro

diseño y luego detenemos la evaluación del proceso en el simulador por un determinado

tiempo, en este caso 50 ns:

process

begin

wait for 100 ns;

a<='0';b<='0';c<='0';d<='0';e<='0';f<='0';wait for 50 ns;

a<='1';b<='0';c<='0';d<='1';e<='0';f<='0';wait for 50 ns;

a<='1';b<='0';c<='1';d<='1';e<='0';f<='1';wait for 50 ns;

a<='1';b<='1';c<='1';d<='1';e<='1';f<='1';wait for 50 ns;

assert z ='1'

report "falla-valor de a=" & std_logic'image(a) &

"valor de b=" & std_logic'image(b) &

"valor de c=" & std_logic'image(c) &

Page 58: Introduccio n a VHDL

"valor de d=" & std_logic'image(d) &

"valor de e=" & std_logic'image(e) &

"valor de f=" & std_logic'image(f) &

severity Error;

a<='1';b<='0';c<='1';d<='1';e<='1';f<='1';

wait;

end process;

Nuevamente, la sentencia wait for es solamente para simulación y nunca podrá ser utilizada

para síntesis a járguar.

Para una verificación más eficiente, podrá verificarse si la salida tiene el valor correcto según la

especificación. En este caso, y cuando todas las entradas son igual a cero, la salida debe ser

igual a cero, puesto que la cerradura no estará habilitada. La sentencia assert permite

comprobar que la señal Z sea igual a ‘1’ en ese punto del proceso.

En caso de que no se cumpla tal condición, entonces reportará una falla y se puede indicar que

imprima el valor de las señales concatenando el atributo std_logic'image() de la señal

correspondiente.

De esta manera, el lenguaje VHDL posibilita la generación de testbench mediante la

descripción de testbench.

La entidad de un testbench no tendrá señales de entrada ni de salida, puesto que todas serán

señales internas.

entity testbench is

end entity testbench;

El código completo del testbench de simulación será:

library IEEE;

use ieee.std_logic_1164.all;

entity testbench is

end entity testbench ;

architecture D1 of testbench is

signal clk : std_logic := '0';

signal a, b, c, d, e, f, rst , z : std_logic;

component doble_confirmacion

port (A, B, C, D, E, F , clk, rst : in std_logic;

Z : out std_logic );

end component;

begin

DUT : doble_confirmacion port map (a,b,c,d,e,f,clk,rst,z);

rst <= '1', '0' after 70 ns;

clk <= not(clk) after 10 ns;

process

begin

wait for 100 ns;

Page 59: Introduccio n a VHDL

a<='0';b<='0';c<='0';d<='0';e<='0';f<='0';wait for 50 ns;

a<='1';b<='0';c<='0';d<='1';e<='0';f<='0';wait for 50 ns;

a<='1';b<='0';c<='1';d<='1';e<='0';f<='1';wait for 50 ns;

a<='1';b<='1';c<='1';d<='1';e<='1';f<='1';wait for 50 ns;

assert z ='1'

report "falla- valor de a=" & std_logic'image(a) &

"valor de b=" & std_logic'image(b) &

"valor de c=" & std_logic'image(c) &

"valor de d=" & std_logic'image(d) &

"valor de e=" & std_logic'image(e) &

"valor de f=" & std_logic'image(f) &

severity Error;

a<='1';b<='0';c<='1';d<='1';e<='1';f<='1';

wait;

end process;

end architecture D1;

Por supuesto, si se desean realizar más estímulos, sólo debe seguirse de manera similar la

definición de nuevas combinaciones de entradas. De esta manera, la simulación con testbench

permite interactuar con el diseño bajo prueba, de manera similar a la que interactuaría el

hardware implementado en el dispositivo FPGA con otros componentes o con el mundo

exterior.

La descripción de testbench en VHDL permite la simulación de funciones muy complejas,

puesto que pueden realizarse a nivel de comportamiento. Retardos, funciones

trigonométricas, importación y exportación de valores desde y hacia archivos son algunas de

las posibilidades que brinda el lenguaje VHDL a nivel de comportamiento.

Es necesario tener en claro que, las sentencias a nivel de comportamiento son simuladas por la

herramienta de simulación que es ejecutada por el computador. Estas sentencias a nivel de

comportamiento no son sintetizables y darán error si se las desea compilar con Quartus Prime.

Lección 13: Simulación con Quartus y ModelSim La herramienta de desarrollo Quartus Prime, de

la compañía Intel, permite la síntesis de

hardware digital en dispositivos FPGA. Sin

embargo, también posibilita la integración con

herramientas de otros fabricantes para dar

soporte a todas las etapas del flujo de diseño.

Una de esas herramientas, es la herramienta de

simulación ModelSim de la compañía Mentor

Graphics.

La integración de ambas herramientas permite que tanto las configuraciones de síntesis, como

de simulación sean contenidas en un solo proyecto de diseño. También permite la realización

automática de especificaciones por defecto.

Para una mejor diferenciación de los archivos en el lenguaje VHDL, la descripción del testbench

a nivel de comportamiento se recomienda que tengan extensión .vht.

Page 60: Introduccio n a VHDL

El procedimiento para la simulación de testbench en ModelSim de un proyecto de Quartus

Prime, se puede ver en detalle en: https://youtu.be/oKerqO6onKE.

Características de ModelSim

ModelSim es un simulador comercial ampliamente utilizado en la industria de diseño digital.

Ofrece muchas características brindadas en diferentes versiones del producto. La versión

ModelSim-Altera se instala por defecto, y de forma gratuita, con la instalación de Quartus

Prime. Esta versión ModelSim-Altera está restringida a la simulación de dispositivos FPGA de la

compañía Intel (la cual adquirió a la compañía Altera en 2014) y restringida a la simulación

simultánea de sólo un lenguaje.

El simulador ModelSim presenta una interface gráfica que permite seleccionar diferentes

comandos y observar la estructura de las diferentes partes de la simulación. Sin embargo,

todos los comandos dados mediante la interface gráfica son transcriptos en comandos de línea

que pueden verse en la ventana de consola. Es conveniente ir registrando todos estos

comandos en un archivo de comandos (script) que luego puede ser ejecutado mediante do

<nombre_de_script> para evitar realizar todos los clicks en la interface gráfica cada vez que se

desea repetir la simulación para comprobar que las fallas han sido subsanadas.

Conclusiones y futuros pasos En las lecciones previas, se han brindado las estructuras principales del lenguaje VHDL que

permiten la síntesis y simulación de diseños simples.

Se han descripto, de manera conceptual, las diferentes estructuras del lenguaje y su

justificación desde el punto de vista de diseño de hardware. Siempre debe tenerse en cuenta

el hardware que se está describiendo: una línea de código VHDL puede representar un

hardware pequeño o un gran requerimiento de recursos. Por ejemplo, las sentencias:

Z <= A * 2;

y

A <= A * B;

pueden parecer similares y utilizadas sin cuidado para un “programador” en VHDL. Sin

embargo, para un diseñador de hardware es muy claro que la multiplicación por 2 es un

desplazamiento de los valores de los elementos del vector a la izquierda (es como multiplicar

por 10 en sistema decimal), mientras que A * B puede resultar en un complejo hardware

multiplicador de acuerdo a los recursos con que se cuenta en el dispositivo FPGA y de la

cantidad de elementos de las representaciones de A y B.

En cursos posteriores, el diseño digital será el objetivo a analizar. Se estudiarán técnicas de

diseño digital para poder lograr diseños más eficientes en velocidad de procesamiento o en

utilización de recursos. También se aprenderá a diseñar arquitecturas de procesamiento en

hardware para aplicaciones específicas.

Page 61: Introduccio n a VHDL

Contenidos Curso de Introducción al lenguaje VHDL ....................................... ¡Error! Marcador no definido.

Unidad 1: Instalación de Quartus Prime Lite y configuración del Laboratorio remoto de FPGA. .1

Lección 1: Descarga e instalación de Quartus Prime Lite 18.0..................................................1

Procedimiento para la instalación de Quartus Prime Lite. ...................................................1

Lección 2: Configuración del Laboratorio remoto de dispositivos FPGA ..................................4

Procedimiento para la configuración del Laboratorio remoto de FPGA ...............................4

Unidad 2: Introducción a VHDL: primer código y flujo de diseño con Quartus Prime. .................9

Circuitos digitales .....................................................................................................................9

Representación de circuitos digitales: esquemáticos y álgebra de Boole ................................9

Lenguaje de descripción de hardware VHDL ..........................................................................10

Niveles de abstracción en lenguajes de descripción de hardware .........................................11

Características que debe tener un lenguaje de descripción de hardware ..............................12

Lenguaje de programación vs. lenguaje de descripción. ........................................................13

Lección 3: Descripción de circuitos digitales con VHDL ..........................................................14

Flujo de diseño .......................................................................................................................16

Creación de proyecto en Quartus Prime ................................................................................18

Lección 4: Asignación de pines y transferencia al Laboratorio remoto de FPGA ....................23

Asignación de pines del Laboratorio remoto de FPGA .......................................................23

Descarga del archivo de configuración de pines del Laboratorio remoto de FPGA ............24

Transferencia de configuración a la FPGA del Laboratorio remoto de FPGA......................26

Unidad 3: Descripción de hardware con VHDL: procesos concurrentes y registros con reloj. ...28

Estructura process en VHDL ...................................................................................................28

Evaluación del proceso ...........................................................................................................29

Ejemplo ..............................................................................................................................29

Errores comunes en la descripción de process ...................................................................30

Lista sensitiva incompleta ..................................................................................................30

Asignación incompleta .......................................................................................................31

Flip-flops y registros en VHDL .................................................................................................32

Registros (registers, en inglés)................................................................................................33

Utilidad de flip-flops y registros con reloj. ..............................................................................33

Unidad 4: Señales, vectores y representaciones numéricas en VHDL ........................................34

Señales y tipo std_logic ..........................................................................................................34

Vectores y std_logic_vector ...................................................................................................35

Page 62: Introduccio n a VHDL

signal A : std_logic_vector(3 downto 0); ............................................................................35

signal B : std_logic_vector(4 to 7);.....................................................................................35

Subvectores ............................................................................................................................36

Concatenación y agregación de vectores ...............................................................................36

Concatenación ....................................................................................................................36

Agregación .........................................................................................................................37

Representaciones numéricas en VHDL ...................................................................................38

Unidad 5: Máquinas de estados en VHDL ..................................................................................43

Descripción de máquinas de estados en VHDL .......................................................................48

Unidad 6: Descripción jerárquica (o estructural) en VHDL .........................................................51

Unidad 7: Simulación .................................................................................................................55

Simulación con testbench ......................................................................................................56

Simulación con Quartus y ModelSim ......................................................................................59

Características de ModelSim ..............................................................................................62

Conclusiones y futuros pasos .....................................................................................................62