Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
PRESENTACIÓN.................................................................................................................................... 4
OBJETIVO DEL CURSO.......................................................................................................................... 5
1 INTRODUCCIÓN ........................................................................................................................... 6
1.1 Dispositivos lógicos programables (PLD)............................................................................. 6
1.1.1 Estructura interna de un PLD .......................................................................................... 8
1.2 Arreglo Lógico Genérico (GAL) .......................................................................................... 10
1.2.1 Programación de un arreglo GAL .................................................................................. 10
1.3 Macroceldas lógicas de salida ........................................................................................... 11
1.4 Dispositivos lógicos programables complejos (CPLD) ....................................................... 12
1.4.1 Arreglos de compuertas programables en campo (FPGA) ............................................ 13
1.5 Metodología de diseño con FPGA's................................................................................... 15
1.6 Configuración y uso del software y hardware FPGA......................................................... 16
1.7 Breve historia del lenguaje VHDL ...................................................................................... 16
2 TARJETA DE DESARROLLO NEXYS 2 ........................................................................................... 18
2.1 Características generales................................................................................................... 18
2.2 Verificación de funcionamiento ........................................................................................ 20
3 ORGANIZACIÓN DE VHDL .......................................................................................................... 22
3.1 Unidades básicas de diseño .............................................................................................. 22
3.2 Entidad .............................................................................................................................. 22
3.2.1 Puertos de entrada y salida........................................................................................... 23
3.2.2 Modos............................................................................................................................ 24
3.2.3 Tipos de datos ............................................................................................................... 24
3.2.4 Declaración de entidades.............................................................................................. 25
3.2.5 Identificadores............................................................................................................... 26
3.2.6 Diseño de entidades mediante vectores....................................................................... 26
3.2.7 Declaración de entidades mediante librerías y paquetes............................................. 28
3.3 Paquetes............................................................................................................................ 28
3.4 Arquitecturas..................................................................................................................... 29
3.4.1 Descripción funcional .................................................................................................... 29
1
Diseño básico en FPGA con VHDL
3.4.2 Descripción por flujo de datos ...................................................................................... 31
4 AMBIENTE DE TRABAJO XILINX ISE DESIGN SUITE 12.1 ............................................................ 33
4.1 Arranque del programa..................................................................................................... 33
4.2 Creación de proyecto ........................................................................................................ 35
4.3 Creación de un archivo fuente HDL................................................................................... 38
4.4 Implementación en la tarjeta Nexys2 ............................................................................... 44
Ejercicio 4.1.- Creación de un proyecto .................................................................................... 46
5. DISEÑO LÓGICO COMBINACIONAL EN VHDL ............................................................................ 47
5.1. Programación de estructuras básicas mediante declaraciones concurrentes.................. 47
5.1.1. Declaraciones condicionales asignadas a una señal (when-else) ................................. 47
Ejercicio 5.1.-Primer ejercicio con declaración When-Else....................................................... 48
Ejercicio 5.2.-Segundo ejercicio con declaración When-Else.................................................... 49
5.1.2. Operadores lógicos........................................................................................................ 49
5.1.3. Declaraciones concurrentes asignadas a señales ......................................................... 49
Ejercicio 5.3.- Circuito lógico con compuertas .......................................................................... 50
Ejercicio 5.4.- Segundo circuito lógico con compuertas ........................................................... 50
5.1.4. Selección de una señal (with-select-when)................................................................... 50
Ejercicio 5.5. - Declaración With-Select-When ......................................................................... 51
Ejercicio 5.6.- Implementación de tabla de verdad .................................................................. 51
5.2. Programación de estructuras básicas mediante declaraciones secuenciales................... 52
5.2.1 Declaración if-then-else (si-entonces-si no)..................................................................... 52
Ejercicio 5.7.- Comparador de 2 bits ......................................................................................... 54
5.2.2 Operadores relacionales .................................................................................................. 54
5.3. Buffers triestado................................................................................................................ 54
Ejercicio 5.8.- Buffer triestado .................................................................................................. 55
5.4. Multiplexores .................................................................................................................... 55
5.5. Sumadores......................................................................................................................... 57
Ejercicio 5.9.- Medio Sumador .................................................................................................. 58
5.5.1. Diseño de un sumador completo .................................................................................. 58
Ejercicio 5.10.- Sumador completo ........................................................................................... 60
5.6. Decodificador de BCD a display de siete segmentos ........................................................ 60
Ejercicio 5.11.- Decodificador BCD a siete segmentos.............................................................. 62
2
Diseño básico en FPGA con VHDL
6 DISEÑO LÓGICO SECUENCIAL EN VHDL..................................................................................... 63
6.1 Sistema secuencial ............................................................................................................ 63
6.2 Flip-flops............................................................................................................................ 64
6.2.1 Flip-Flop D ........................................................................................................................ 64
6.3 Atributo event ................................................................................................................... 65
Ejercicio 6.1.- Implementación del Flip-Flop D.......................................................................... 65
6.4 Flip-Flop SR.............................................................................................................................. 66
Ejercicio 6.2.- Implementación del Flip-Flop SR ........................................................................ 67
6.5 Registros............................................................................................................................ 67
Ejercicio 6.3.- Registro paralelo de 8 bits .................................................................................. 68
6.6 Contadores ........................................................................................................................ 68
Ejercicio 6.4.- Contador binario de 4 bits.................................................................................. 69
7. VHDL ESTRUCTURAL.................................................................................................................. 71
7.1. Creación de un diseño estructural .................................................................................... 71
Ejercicio 7.1 Diseño estructural................................................................................................. 73
7.2. Divisor de frecuencia......................................................................................................... 73
Ejercicio 7.2 Implementación de un divisor de frecuencia ....................................................... 75
Ejercicio 7.3 Contador de 4 bits con divisor de frecuencia ....................................................... 75
8. Simulación de diseños ................................................................................................................... 76
8.1 Creación de un archivo de prueba .......................................................................................... 76
8.2 Arranque de la aplicación ModelSim XE ................................................................................. 80
8.3 Revisión de la simulación ........................................................................................................ 82
Ejercicio 8.1 Simulación de un Flip-Flop D ................................................................................ 83
Ejercicio 8.2 Simulación de un divisor de frecuencia ................................................................ 83
Ejercicio 8.3 Simulación de un contador de 4 bits con divisor de frecuencia ........................... 83
9. Máquina de estados en VHDL ....................................................................................................... 84
9.1 Definición de máquina de estados.......................................................................................... 84
9.2 Diseño de una máquina de estados Moore ............................................................................ 86
Ejercicio 9.1 Simulación de una máquina de estados ............................................................... 90
Ejercicio 9.2 Contador de 3 bits con máquina de estados ........................................................ 90
BIBLIOGRAFIA.................................................................................................................................... 91
3
Diseño básico en FPGA con VHDL
PRESENTACIÓN
El lenguaje de descripción de hardware VHDL es considerado como una de las máximas
herramienta de diseño por las industrias y universidades de todo el mundo, pues
proporciona a los usuarios muchas ventajas de la planeación y diseño de los sistemas
electrónicos digitales.
Este curso abarca los conocimientos básicos para comenzar a diseñar en VHDL haciendo
uso de la tarjeta de desarrollo Nexys 2, sin embargo, dichos conocimientos son aplicables
también para cualquier otra tarjeta de desarrollo de la marca Digilent, Inc, tales como la
Basys o la Basys 2 por mencionar solo algunas, ya que lo único que cambia es la ubicación
de los pines de entrada y de salida del FPGA.
El tercer capítulo trata acerca de las partes que conforman un diseño en VHDL, la entidad y
la arquitectura, así como las librerías que se utilizan.
El uso del reloj interno de la tarjeta para el diseño lógico secuencial se muestra en el
capítulo 6, en el cual se muestra el diseño de flip-flops, registros y contadores.
El capítulo ocho muestra la manera de simular nuestros diseños desarrollados haciendo uso
del software ModelSIM.
Por último en el capítulo nueve se muestra los elementos básicos que conforman una
máquina de estados en VHDL.
4
Diseño básico en FPGA con VHDL
5
Diseño básico en FPGA con VHDL
1 INTRODUCCIÓN
Objetivo de la unidad
Más tarde, el desarrollo del transistor de difusión planar, construido durante 1947 y 1948,
permitió en 1960 la fabricación del primer circuito integrado monolítico. Este integra
cientos de transistores, resistencias, diodos y capacitores, todos fabricados sobre una
pastilla de silicio. Como es del conocimiento general, el término monolítico se deriva de las
raíces griegas "mono" y "lithos" que significan uno y piedra, respectivamente; por tanto,
dentro de la tecnología de los circuitos integrados un circuito monolítico está construido
sobre una piedra única o cristal de silicio que contiene tanto elementos activos (transistores,
diodos), como elementos pasivos (resistencias, capacitores), y las conexiones entre ellos.
Los dispositivos lógicos programables (o PLD, por sus siglas en inglés) favorecen la
integración de aplicaciones y desarrollos lógicos mediante el empaquetamiento de
soluciones en un circuito integrado. El resultado es la reducción de espacio físico dentro de
la aplicación; es decir, se trata de dispositivos fabricados y revisados que se pueden
personalizar desde el exterior mediante diversas técnicas de programación. El diseño se
basa en bibliotecas y mecanismos específicos de mapeado de funciones, mientras que su
6
Diseño básico en FPGA con VHDL
implementación tan sólo requiere una fase de programación del dispositivo que el diseñador
suele realizar en unos segundos.
En la actualidad existe una gran variedad de dispositivos lógicos programables, los cuales
se usan para reemplazar circuitos SSI (pequeña escala de integración), MSI (mediana escala
de integración) e incluso circuitos VLSI (muy alta escala de integración), ya que ahorran
espacio y reducen de manera significativa el número y el costo de los diseños. Estos
dispositivos, llamados PLD (tabla 1.1), se clasifican por su arquitectura, es decir, la forma
funcional en que se encuentran ordenados los elementos internos que proporcionan al
dispositivo sus características.
7
Diseño básico en FPGA con VHDL
Los dispositivos PROM, PLA, PAL y GAL están formados por arreglos o matrices que
pueden ser fijos o programables, mientras que los CPLD y FPGA se encuentran
estructurados mediante bloques lógicos configurables y celdas lógicas de alta densidad,
respectivamente.
a) Arreglo AND. Está formado por varias compuertas AND interconectadas a través de
alambres, los cuales cuentan con un fusible en cada punto de intersección (Figura 1.1a). En
esencia, la programación del arreglo consiste en fundir o apagar los fusibles para eliminar
las variables que no serán utilizadas (Figura 1.1b). Obsérvese cómo en cada entrada a las
compuertas AND queda intacto el fusible que conecta la variable seleccionada con la
entrada a la compuerta. En este caso, una vez que los fusibles se funden no pueden volver a
programarse.
8
Diseño básico en FPGA con VHDL
• En esencia, el PLA se desarrolló para superar las limitaciones de la memoria PROM. Este
dispositivo se llama también FPLA (arreglo lógico programable en campo), ya que es el
usuario y no el fabricante quien lo programa.
• El PAL se desarrolló para superar algunas limitaciones del PLA, como retardos
provocados por la implementación de fusibles adicionales, que resultan de la utilización de
dos arreglos programables y de la complejidad del circuito. Un ejemplo típico de estos
dispositivos es la familia PAL16R8, la cual fue desarrollada por la compañía AMD
(Advanced Micro Devices) e incluye los dispositivos PAL16R4, PAL16R6, PAL16L8,
PAL16R8, dispositivos programables por el usuario para reemplazar circuitos
combinacionales y secuenciales SSI y MSI en un circuito.
El arreglo lógico genérico (GAL) es similar al PAL, ya que se forma con arreglos AND
programable y OR fijo, con una salida lógica programable. Las dos principales diferencias
entre los dispositivos GAL y PAL radican en que el primero es reprogramable y contiene
configuraciones de salida programables.
Los dispositivos GAL se pueden programar una y otra vez, ya que usan la tecnología E2
CMOS (Ellectrically Erasable CMOS: CMOS borrable eléctricamente), en lugar de
tecnología bipolar y fusibles (Fig. 1.3).
A diferencia de un PAL, el GAL está formado por celdas programables, las cuales se
pueden reprogramar las veces que sea necesario. Como se observa en la figura 1.4, cada fila
se conecta a una entrada de la compuerta AND y cada columna a una variable de entrada y
10
Diseño básico en FPGA con VHDL
sus complementos. Cuando se programa una celda, ésta se activa mediante la aplicación de
cualquier combinación de las variables de entrada o sus complementos a la compuerta
AND. Esto permite la implementación de cualquier función (producto de términos)
requerida.
Una macrocelda lógica de salida (u OLMC, de output logic macrocell) está formada por
circuitos lógicos que se pueden programar como lógica combinacional o secuencial. Las
configuraciones combinacionales se implementan por medio de programación, mientras
que en las secuenciales la salida resulta de un flip-flop. En la figura 1.5 se observa la
arquitectura de una macrocelda del dispositivo GAL22V10, la cual de manera general está
formada por un flip-flop y dos multiplexores.
11
Diseño básico en FPGA con VHDL
Puede haber de ocho a dieciséis entradas de las compuertas AND en la compuerta OR. Esto
indica las operaciones producto que pueden efectuarse en cada macrocelda. El área
punteada está formada por dos multiplexores y un flip-flop; el multiplexor 1 de 4 conecta
una de sus cuatro líneas de entrada al buffer triestado de salida, en función de las líneas de
selección SO y SI.
Por otro lado, el multiplexor de 1 de 2 conecta por medio del buffer la salida del flip-flop o
la salida del buffer triestado al arreglo AND; esto se determina por medio de S1. Cada una
de las líneas de selección se programa mediante un grupo de celdas especiales que se
encuentran en el arreglo AND.
Los bloques lógicos, también conocidos como celdas generadoras de funciones, están
formados por un arreglo de productos de términos que implementa los productos efectuados
en las compuertas AND, un esquema de distribución de términos que permite crear las
sumas de los productos provenientes del arreglo AND y por macroceldas similares a las
incorporadas en la GAL22V10 Cabe mencionar que el tamaño de los bloques lógicos es
importante, ya que determina cuánta lógica se puede implementar dentro del CPLD; esto
es, fija la capacidad del dispositivo.
12
Diseño básico en FPGA con VHDL
Los dispositivos FPGA se basan en lo que se conoce como arreglos de compuertas, los
cuales consisten en la parte de la arquitectura que contiene tres elementos configurables:
bloques lógicos configurables (CLB), bloques de entrada y de salida (IOB) y canales de
comunicación. A diferencia de los CPLD, la densidad de los FPGA se establece en
cantidades equivalentes a cierto número de compuertas.
Por adentro, un FPGA está formado por arreglos de bloques lógicos configurables (CLB),
que se comunican entre ellos y con las terminales de entrada/ salida (E/S) por medio de
alambrados llamados canales de comunicación. Cada FPGA contiene una matriz de bloques
lógicos idénticos, por lo general de forma cuadrada, conectados por medio de líneas
metálicas que corren vertical y horizontalmente entre cada bloque (Fig. 1.7).
13
Diseño básico en FPGA con VHDL
14
Diseño básico en FPGA con VHDL
Primero hay que tener una descripción del circuito a realizar. Tradicionalmente en las
ingenierías se realizan planos o esquemas para esta descripción, de forma similar a como
un arquitecto diseña un edificio. Sin embargo es posible realizar una descripción del
hardware utilizando algún lenguaje de descripción de hardware, como VHDL o Verilog
Con esta descripción se pueden realizar simulaciones del circuito, para comprobar que lo
diseñado trabaja correctamente de lo contrario se volverá a modificar la descripción
(esquemas ó programa) hasta que la simulación sea satisfactoria. Hasta aquí sólo se ha
utilizado la computadora y no se tocado hardware. Sin embargo en el caso del software, la
propia simulación es la ejecución del programa. Se observa directamente el resultado del
programa y se modifican el código fuente hasta que se eliminen los errores.
En el caso del hardware hay que construir el circuito. Y aquí es donde vienen las FPGA's
para hacerlo. A partir de la especificación hardware y utilizando un compilador especial,
obtenemos un archivo binario, llamado bitstream que contiene toda la información
necesaria para configurar la FPGA. Este archivo, que es el equivalente a un programa
ejecutable en el caso del software, es el que hay que cargar en la FPGA. Se carga este
archivo en la FPGA y listo. Ya se tiene el hardware que queríamos situado en el interior de
un chip. No se ha tenido que soldar, ni comprar componentes, ni perder tiempo haciendo un
prototipo. Ahora los cambios en el diseño se pueden hacer igual de rápidos que en el caso
de software. Sólo hay que cambiar la especificación del diseño, volver a compilar y
reconfigurar la FPGA con el nuevo bitstream generado.
multiplexores, puertas lógicas, etc. Existe otra manera de describir un circuito: utilizando
los llamados lenguajes de descripción hardware. Existen varios: VHDL, Verilog, Handle
C, JBits. La ventaja de estos lenguajes es que además de permitir describir el circuito,
permiten definir bancos de pruebas (testbench), que son muy útiles para la simulación y la
depuración.
Aunque IEEE Standard 1076 define el lenguaje de VHDL completo, hay aspectos del
lenguaje que hacen difícil la descripción completamente portátil del diseño (descripciones
que pueden simularse usando las herramientas de diferentes vendedores). El problema
proviene del hecho que VHDL soporta muchos tipos de datos abstractos, pero esto no se
dirige al problema simple de caracterizar señales diferentes o las condiciones de la
simulación normalmente usadas como los desconocidos y alta-impedancia.
16
Diseño básico en FPGA con VHDL
Poco después IEEE 1076-1987 fue adoptada, las compañías de simuladores empezaron
reforzando VHDL con los nuevos tipos no estandarizados y permitirles a sus clientes
simular los circuitos electrónicos complejos con precisión. Esto causó problemas porque las
descripciones de un diseño entraron en un simulador donde a menudo eran incompatibles
con otros ambientes de simulación. VHDL estaba volviéndose no estandarizable
rápidamente creando un problema. Otra norma se desarrolló por un comité de IEEE. Esta
norma, numerada 1164, define un paquete estándar (un lenguaje VHDL que permite
coleccionar las declaraciones normalmente usadas en una biblioteca externa) conteniendo
las definiciones para un tipo de los datos normalizados. Este tipo de datos normalizado se
llama el std_logic, y el paquete1164 IEEE es frecuentemente llamado el paquete de la
Lógica estándar.
Las normas IEEE 1076-1987 e IEEE 1164 completan el estándar VHDL siendo elmás
usado hoy.
17
Diseño básico en FPGA con VHDL
La tarjeta Nexys 2, es una plataforma de desarrollo completa y lista para usar basado en un
FPGA Xilinx Spartan 3E. Consta de un puerto USB 2.0 de alta velocidad, 16 Mbytes de
memoria RAM así como varios dispositivos y puertos de entrada/salida que la convierten
en una plataforma ideal para sistemas digitales de todo tipo, incluyendo sistemas
embebidos basados en el microprocesador Xilinx’s MicroBlaze.
La Nexys2 contiene una FPGA de Xilinx modelo Spartan‐3E XC3S500E o XC3S1200E con
encapsulado FG320 (figura 2.1). Estas FPGA tienen respectivamente 500 000 o 1 200 000
puertas lógicas equivalentes.
18
Diseño básico en FPGA con VHDL
19
Diseño básico en FPGA con VHDL
Como se puede apreciar, los pulsadores tampoco tienen circuitería de anulación de rebotes.
En la figura también se indican los pines de la FPGA que se conectan a éstos.
Figura 2.3Conexiones de los pulsadores, interruptores y LED de propósito general en la tarjeta Nexys2
20
Diseño básico en FPGA con VHDL
21
Diseño básico en FPGA con VHDL
3 ORGANIZACIÓN DE VHDL
Objetivo de la unidad
3.2 Entidad
Una entidad (entity) es el bloque elemental de diseño en VHDL, Las entidades son todos
los elementos electrónicos (sumadores, contadores, compuertas, flip-flops, memorias,
multiplexores, etc.) que forman de manera individual o en conjunto un sistema digital. La
entidad puede representarse de muy diversas maneras; por ejemplo, la figura 3.1a) muestra
la arquitectura de un sumador completo a nivel de compuertas; ahora bien, esta entidad se
puede representar a nivel de sistema indicando tan sólo las entradas (Cin, A y B) y salidas
(SUMA y Cout) del circuito: figura 3.1b). De igual forma, la integración de varios
subsistemas (medio sumador) puede representarse mediante una entidad [Fig. 3.1c)]. Los
subsistemas pueden conectarse internamente entre sí; pero la entidad sigue identificando
con claridad sus entradas y salidas generales.
22
Diseño básico en FPGA con VHDL
Cada una de las señales de entrada y salida en una entidad son referidas como puerto, el
cual es similar a una terminal (pin) de un símbolo esquemático.
Todos los puertos que son declarados deben tener un nombre, un modo y un tipo de dato. El
nombre se utiliza como una forma de llamar al puerto; el modo permite definir la dirección
que tomará la información y el tipo define qué clase de información se transmitirá por el
puerto. Por ejemplo, respecto a los puertos de la entidad que representan a un comparador
de igualdad (Figura 3.2), las variables a y b denotan los puertos de entrada y la variable c se
refiere al puerto de salida.
23
Diseño básico en FPGA con VHDL
3.2.2 Modos
• Modo in. Se refiere a las señales de entrada a la entidad. Este sólo es unidireccional y
nada más permite el flujo de datos hacia dentro de la entidad.
• Modo out. Indica las señales de salida de la entidad.
• Modo inout. Permite declarar a un puerto de forma bidireccional —es decir, de
entrada/salida—; además permite la retroalimentación de señales dentro o fuera de la
entidad.
• Modo buffer. Permite hacer retroalimentaciones internas dentro de la entidad, pero a
diferencia del modo inout, el puerto declarado se comporta como una terminal de salida.
Los tipos son los valores (datos) que el diseñador establece para los puertos de entrada y
salida dentro de una entidad; se asignan de acuerdo con las características de un diseño en
particular. Algunos de los tipos más utilizados en VHDL son:
• Bit El cual tiene valores de 0 y 1 lógico.
• Boolean (Booleano) que define valores de verdadero o falso en una expresión
• Bit_vector (Vectores de bits) que representa un conjunto de bits para cada variable de
entrada o salida.
• Integer (Entero) que representa un número entero.
• Std_logic Extensiones del tipo Bit, pueden tomar 9 valores diferentes:
‘U’ --No inicializado
‘X’ --Forzando valor desconocido
‘0’ --Forzando un 0
‘1’ --Forzando un 1
24
Diseño básico en FPGA con VHDL
Los números de las líneas (1, 2, 3, 4, 5) no son parte del código; se usan como referencia
para explicar alguna sección en particular. Las palabras en negritas están reservadas para el
lenguaje de programación VHDL; esto es, tienen un significado especial para el programa;
el diseñador asigna los otros términos.
Ahora comencemos a analizar el código línea por línea. Observemos que la línea 1 inicia
con dos guiones (--), los cuales indican que el texto que está a la derecha es un comentario
cuyo objetivo es documentar el programa, ya que el compilador ignora todos los
comentarios. En la línea 2 se inicia la declaración de la entidad con la palabra reservada
entity, seguida del identificador o nombre de la entidad (sumador) y la palabra reservada is.
Los puertos de entrada y salida (port) se declaran en las líneas 3 y 4, respectivamente —en
este caso los puertos de entrada son A, B y Cin—, mientras que SUMA y Cout representan
los puertos de salida. El tipo de dato que cada puerto maneja es del tipo bit, lo cual indica
25
Diseño básico en FPGA con VHDL
que sólo pueden manejarse valores de '0' y '1' lógicos. Por último, en la línea 5 termina la
declaración de entidad con la palabra reservada end, seguida del nombre de la entidad
(sumador).
Debemos notar que como cualquier lenguaje de programación, VHDL sigue una sintaxis y
una semántica dentro del código, mismas que hay que respetar. En esta entidad conviene
hacer notar el uso de punto y coma (;) al finalizar una declaración y de dos puntos (:) al
asignar nombres a las entradas y salidas.
3.2.5 Identificadores
Los identificadores son simplemente los nombres o etiquetas que se usan para referir
variables, constantes, señales, procesos, etc. Pueden ser números, letras del alfabeto y
guiones bajos ( _ ) que separen caracteres y no tienen una restricción en cuanto a su
longitud. Todos los identificadores deben seguir ciertas especificaciones o reglas para que
se puedan compilar sin errores, mismas que aparecen en la tabla 3.1.
La entidad sumador realizada en el circuito del listado 3.1, usa bits individuales, los cuales
sólo pueden representar dos valores lógicos (0 o 1). De manera general, en la práctica se
utilizan conjuntos (palabras) de varios bits; en VHDL las palabras binarias se conocen
como vectores de bits, los cuales se consideran un grupo y no como bits individuales.
Como ejemplo considérense los vectores de 4 bits que se muestran a continuación:
26
Diseño básico en FPGA con VHDL
En la figura 3.4 se observa la entidad del sumador analizado antes, sólo que ahora las
entradas A, B y la salida SUMA incorporan vectores de 4 bits en sus puertos. Obsérvese
cómo la entrada Cin y la salida Cout son de un bit.
Esta declaración define los vectores (A, B y SUMA) con cuatro componentes distribuidos
en orden descendente por medio del comando:
3 downto 0 (3 hacia 0) los cuales se agruparían de la siguiente manera.
entity sumador is
port (A,B: in bit_vector (3 downto 0);
Cin: in bit;
Cout: out bit;
SUMA: out bit_vector(3 downto 0));
end sumador;
27
Diseño básico en FPGA con VHDL
Una librería o biblioteca es un lugar al que se tiene acceso para utilizar las unidades de
diseño predeterminadas por el fabricante de la herramienta (paquete) y su función es
agilizar el diseño. En VHDL se encuentran definidas dos librerías llamadas ieee y work.
library ieee;
Lo anterior permite el uso de todos los componentes incluidos en la librería ieee. En el caso
de la librería de trabajo (work), su uso no requiere la declaración library, dado que la
carpeta work siempre está presente al desarrollar un diseño.
3.3 Paquetes
use nombre_librería.nombre_paquete.all;
por ejemplo:
use IEEE.STD_LOGIC_1164.ALL;
28
Diseño básico en FPGA con VHDL
3.4 Arquitecturas
La gran ventaja que presenta VHDL para definir una arquitectura radica en la manera en
que pueden describirse los diseños; es decir, mediante el algoritmo de programación
empleado se puede describir desde el nivel de compuertas hasta sistemas complejos.
29
Diseño básico en FPGA con VHDL
La declaración del proceso (línea 10) se utiliza para la definición de algoritmos y comienza
con una etiqueta opcional (en este caso compara), seguida de dos puntos (:), la palabra
reservada process y une la lista sensitiva (a y b), que hace referencia a las señales que
determinan el funcionamiento del proceso. Al seguir el análisis, puede notarse que de la
línea 12 a la 17 el proceso se ejecuta mediante declaraciones secuenciales del tipo if-then-
else (si-entonces- si no). Esto se interpreta como sigue (línea 12): si el valor de la señal a es
igual al valor de la señal b, entonces '1' se asigna a c, si no (else)se asigna un '0' (el
símbolo < = se lee como "se asigna a"). Una vez que se ha definido el proceso, se termina
con la palabra reservada end process y de manera opcional el nombre del proceso
(compara); de forma similar se añade la etiqueta (funcional) al terminar la arquitectura en la
línea 18.
30
Diseño básico en FPGA con VHDL
La descripción por flujo datos indica la forma en que los datos se pueden transferir de una
señal a otra sin necesidad de declaraciones secuenciales (if-then-else). Este tipo de
descripciones permite definir el flujo que tomarán los datos entre módulos encargados de
realizar operaciones. En este tipo de descripción se pueden utilizar dos formatos: mediante
instrucciones when else (cuando-si no) o por medio de ecuaciones booleanas.
A continuación se muestra el código del comparador de igualdad de dos bits descrito antes
(figura 3.6) Nótese que la diferencia entre los listados 3.2 y 3.3 radica en la eliminación del
proceso y en la descripción sin declaraciones secuenciales (if-then-else).
Figura 3.6 a) Entidad del comparador de dos bits, b) Comparador de dos bits realizado con
compuertas.
Otra forma de describir el circuito comparador de dos bits es mediante la obtención de sus
ecuaciones booleanas. En el listado 3.4 se observa este desarrollo. El interior del circuito
31
Diseño básico en FPGA con VHDL
comparador de la figura 3.6a) puede representarse por medio de compuertas básicas [Fig.
3.7b)] y este circuito puede describirse mediante la obtención de sus ecuaciones booleanas.
Listado 3.4 Arquitectura de forma de flujo de datos construido por medio de ecuaciones booleanas.
La forma de flujo de datos en cualquiera de sus representaciones describe el camino que los
datos siguen al ser transferidos de las operaciones efectuadas entre las entradas a y b a la
señal de salida c.
32
Diseño básico en FPGA con VHDL
Objetivo de la unidad
En este capítulo se describe la manera de utilizar el programa Xilinx ISE Design Suite,
como se encuentra constituido así como la creación de un nuevo proyecto y la creación del
archivo bit para descargarlo a la tarjeta de desarrollo Nexys 2.
En la pantalla inicial del programa se observan cuatro (4) ventanas como muestra la Figura
4.2
33
Diseño básico en FPGA con VHDL
Nos puede aparecer una ventana con el Tip of the day que son indicaciones que hace la
herramientas cada vez que la arrancamos. Damos clic en OK, con lo que se cierra dicha
ventana.
La forma corta para iniciar el Integrated Software Enviroment (ISE) es dar doble clic en el
icono del programa ISE mostrado en la Figura 4.3, el cual está ubicado en el escritorio.
34
Diseño básico en FPGA con VHDL
Figura 4.3. Ícono del programa Xilinx ISE Design Suite 12.1
La página de creación de nuevo proyecto aparece, aquí damos la información general del
proyecto de la siguiente manera:
NOTA: Cada proyecto debe tener su propia carpeta. Si múltiples proyectos quedan en la
misma carpeta pueden ocurrir conflictos.
Top-Level Source Type: Especifique el top-level source type. Seleccione HDL de la lista.
En la configuración de los parámetros en un nuevo proyecto puede obtener ayuda para las
diferentes ventanas dando clic en el botón de More Info.
Use esta página (figura 4.6) para seleccionar el dispositivo y otra información del diseño de
su proyecto, seleccionar la herramienta de síntesis y lenguaje, y el simulador.
Product Category: Específica la categoría del producto según su aplicación. Esta selección
filtra las familias de dispositivos y dispositivos disponibles en los dos siguientes campos,
seleccionar All en este campo.
36
Diseño básico en FPGA con VHDL
Speed: Especifíca la velocidad del dispositivo seleccionado. Para este caso escoja -4.
C. Haga clic en next nuevamente, así se muestra en pantalla el resumen de las propiedades
del nuevo proyecto creado (figura 4.7).
37
Diseño básico en FPGA con VHDL
Haga clic en finish, de esta manera el proyecto esta creado, En la ventana sources se
observa el icono del nuevo proyecto (figura 4.8).
En esta sección, se muestra la creación del archivo fuente HDL para el diseño, para lo cual
se procede como sigue:
38
Diseño básico en FPGA con VHDL
C. Digite en el campo file name el nombre iniciando por una letra (A-Z, a-z) y debe
contener solamente caracteres alfanuméricos (A-Z, a-z, 0-9) y underscores (_).
Verifique que la casilla Add to project este seleccionada, para adicionar el archivo fuente
al proyecto como muestra la figura 4.10, para información y ayuda detallada dar clic en
botón More Info
D. Clic en Next.
E. Declare los puertos para el diseño de la compuerta con cuatro entradas y una salida, esta
se define seleccionando out, llenando la información como se muestra en la figura 4.11
40
Diseño básico en FPGA con VHDL
Como se pudo apreciar en la figura 4.13, no sólo se ha creado la entidad, sino que se han
incluido unas cabeceras, bibliotecas y la declaración de la arquitectura.
La cabecera es un apartado con comentarios para que lo rellenemos nosotros, para que
tengamos un control del autor, la fecha y la descripción del diseño, entre otra información.
Recuerda que en VHDL los comentarios se identifican con dos guiones “—”. Es interesante
que se rellene, especialmente si se trabaja en grupo. Pero incluso si se trabaja solo es
conveniente rellenarlo porque es común olvidarse de lo que se hace una vez que ha
transcurrido cierto tiempo.
Después de la cabecera se incluyen las referencias a las bibliotecas del IEEE, que son
necesarias para poder utilizar los tipos de datos que emplearemos.
41
Diseño básico en FPGA con VHDL
a) b)
Figura 4.14 Bibliotecas más usadas en VHDL
Después de las referencias a las bibliotecas hay unos comentarios que puedes quitar. A
continuación está la entidad. Para describir el funcionamiento o la estructura interna del
circuito se utiliza la arquitectura.
Si se tiene algún error, se debe localizar y corregir. Cuando no se tengan errores, se puede
hacer clic directamente en Synthesize - XST para sintetizar.
Una vez que hayamos sintetizado tenemos que indicar los pines de la FPGA que vamos a
utilizar y su correspondencia con los puertos de la entidad, esto se logra por medio de un
archivo con terminación UCF (User Constraints File), para lo cual se selecciona
Project>New Source y se escoge Implementation Constraints File, se le da un nombre y se
42
Diseño básico en FPGA con VHDL
da clic en Next (Figura 4.16). Después aparece una pantalla de confirmación en la que se
debe dar clic en Finish.
En un principio, el archivo UCF aparecerá en blanco, por lo que se debe escribir que
terminal del FPGA le corresponde a cada una de las entradas y salidas del proyecto en el
que se esté trabajando, como se puede observar en la figura 4.17, se está haciendo uso de
tres terminales en un proyecto, a la variable A le corresponde la terminal G18, a la B la
43
Diseño básico en FPGA con VHDL
terminal H18 y finalmente a la C le corresponde la J14, esa es la sintaxis que debe llevar
para una correcta configuración con cada una de las variables del proyecto.
Recuerde que las terminales del FPGA se encuentran en la figura 2.3, impresos en la misma
tarjeta Nexys 2 o en el manual de usuario de la misma.
Ahora hacemos doble clic en Generate Programming File dentro de la ventana Processes,
y esperamos a que termine el proceso de síntesis e implementación, viendo si hay algún
error o advertencia de importancia (warning).
Aunque la tarjeta Nexys2 se puede programar con el conector JTAG, viene con un puerto
USB que permite programarla de manera más cómoda. El único inconveniente es que hay
que instalar el programa gratuito Adept.
Se debe asegurar que los jumpers de POWER SELECT (jumpers de selección alimentación)
se encuentren en la posición USB.
A continuación se explica cómo se programa la tarjeta Nexys2 con la versión 2 del Adept.
44
Diseño básico en FPGA con VHDL
La primera vez que conectemos la tarjeta puede ser que Windows haya detectado un nuevo
hardware y tengamos que dar permiso para la instalación de los drivers que vienen con la
tarjeta (no tenemos que introducir un disco, la propia tarjeta le proporciona los drivers).
Ahora se hace clic en Initialize Chain y, como se ve en la figura 4.19, aparecerán dos
componentes: uno es la FPGA y otro la memoria (PROM). Indicará también el modelo de
FPGA, que en este caso es la XC3S500E.
Figura 4.19 Pantalla del Adept que ha detectado la cadena JTAG de dispositivos (FPGA y PROM)
Otra cosa es que salga un mensaje de error indicando: “Unable to associate file with device
due to IDCODE conflicto”. Esto es un error que indica que la FPGA que hemos escogido
45
Diseño básico en FPGA con VHDL
no es la misma que la que está en la placa. En este caso, tendremos que verificar que el
modelo de FPGA sea el mismo.
Si todo ha salido bien, sólo tenemos que hacer clic en Program y se programará la FPGA.
Ahora solo queda verificar el correcto funcionamiento de nuestro diseño en la tarjeta de
desarrollo.
Crear e implementar en la tarjeta Nexys 2 el diseño explicado del subtema 4.1 al 4.4.
46
Diseño básico en FPGA con VHDL
En este capítulo se diseñan los circuitos combinacionales más utilizados en el diseño lógico
a través del lenguaje de descripción en hardware. Esto permite introducir nuevos conceptos,
palabras reservadas, reglas, algoritmos, etc., que muestran la potencia y profundidad del
lenguaje VHDL.
Las declaraciones concurrentes suelen usarse en las descripciones de flujo de datos. Esto se
debe a que en una declaración concurrente no importa el orden en que se escriban las
señales, ya que el resultado para determinada función sería el mismo.
La declaración when-else se utiliza para asignar valores a una señal, determinando así la
ejecución de una condición propia del diseño. Para ejemplificar, consideremos la entidad
mostrada en la figura 5.1, cuyo funcionamiento se define en la tabla de verdad.
47
Diseño básico en FPGA con VHDL
Nótese que la función de salida f (línea 10) depende directamente de las condiciones que
presentan las variables de entrada, además y dado que la ejecución inicial de una u otra
condición no afecta la lógica del programa, el resultado es el mismo; es decir, la condición
de entrada "111", visualizada en la tabla de verdad, puede ejecutarse antes que la condición
"000" sin alterar el resultado final.
48
Diseño básico en FPGA con VHDL
Ejercicio 5.2.-Segundo ejercicio con declaración When-Else
Realizar haciendo uso de la declaración When-Else un diseño lógico de 4 entradas que van
desde 0000 hasta 1111 y que produzca una salida alta siempre que la entrada decimal
equivalente sea mayor que 10. Verificar el correcto funcionamiento del diseño realizado.
49
Diseño básico en FPGA con VHDL
library ieee;
use ieee.std_logic_1164.all;
Realizar un diseño lógico por medio de compuertas que tenga 4 entradas que van desde
0000 hasta 1111 y que produzca una salida alta siempre que la entrada decimal equivalente
sea mayor que 10. Verificar el correcto funcionamiento del diseño realizado.
La declaración with – select - when se utiliza para asignar un valor a una señal con base en
el valor de otra señal previamente seleccionada. Por ejemplo, en el listado correspondiente
a la figura 5.3 se muestra el código que representa a este tipo de declaración. Como puede
observarse, el valor de la salida c depende de las señales de entrada seleccionadas a(0) y
a(1), de acuerdo con la tabla de verdad correspondiente.
50
Diseño básico en FPGA con VHDL
library ieee;
use ieee.std_logic_l164.all;
entity circuito is port(
a: in std_logic_vector (1 downto 0) ;
c: out std_logic);
end circuito;
architecture behavioral of circuito is
begin
with a select
c <= '1' when "00",
'0' when "01",
'1' when "10",
'0' when others1;
end behavioral;
51
Diseño básico en FPGA con VHDL
ENTRADAS SALIDA
A B C X
0 0 0 1
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 1
1 1 1 1
Como ya se mencionó, las declaraciones secuenciales son aquellas en las que el orden que
llevan puede tener un efecto significativo en la lógica descrita. A diferencia de una
declaración concurrente, una secuencial debe ejecutarse en el orden en que aparece y
formar parte de un proceso (process).
Esta declaración sirve para seleccionar una condición o condiciones basadas en el resultado
de evaluaciones lógicas (falso o verdadero). Por ejemplo, observemos que en la instrucción:
Si (if) condición se evalúa como verdadera, entonces (then) la instrucción indica que se
ejecutará la operación 1. Por el contrario, si la condición se evalúa como falsa (else) correrá
la operación 2. La instrucción que indica el fin de la declaración es end if (fin del si). Un
ejemplo que ilustra este tipo de declaración se ilustra en la figura 5.4.
52
Diseño básico en FPGA con VHDL
Muchas veces sólo son necesarias dos condiciones por evaluar, pero no en todos los diseños
es así. Por tanto, cuando se requieren más condiciones de control, se utiliza una nueva
estructura llamada elsif (si no-si), la cual permite expandir y especificar prioridades dentro
del proceso. La sintaxis para esta operación es:
53
Diseño básico en FPGA con VHDL
Ejercicio 5.7.- Comparador de 2 bits
Introducir el diseño anterior del comparador en la tarjeta Nexys 2. Utilizar de SW0 a SW1
como la entrada a y SW6 Y SW7 como entrada b. La salida estará dada por el led LD0.
Verificar el correcto funcionamiento.
5.3.Buffers triestado
Los registros de tres estados (buffers tri-estado) tienen diversas aplicaciones, ya sea como
salidas de sistemas (modo buffer) o como parte integral de un circuito. En VHDL estos
dispositivos son definidos a través de los valores que manejan (0,1 y alta impedancia 'Z').
En la figura 5.5 se observa el diagrama correspondiente a este circuito, y en el listado el
código que describe su funcionamiento.
54
Diseño básico en FPGA con VHDL
library ieee;
use ieee.std_logic_1164.all ;
entity tri_est is port(
enable, entrada: in std_logic;
salida: out std_logic);
end tri_est;
architecture behavioral of tri_est is
begin
process (enable, entrada) begin
if enable = '0' then
salida <= 'Z';
else
salida <= entrada;
end if;
end process ;
end behavioral;
El listado anterior se basa en un proceso, el cual se utiliza para describir los valores que
tomará la salida del registro (buffer). En este proceso se indica que cuando se confirma el
habilitador del circuito (enable), el valor que se encuentra a la entrada del circuito se asigna
a la salida; si por el contrario no se confirma enable, la salida del buffer tomará un valor de
alta impedancia (Z).
El tipo std_logic soporta este valor —al igual que 0 y 1—. A esto se debe que en el diseño
se prefiera utilizar el estándar std_logic_l164 y no el tipo bit, ya que el primero es más
versátil al proveer valores de alta impedancia y condiciones de no importa, los cuales no
están considerados en el tipo bit.
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar a SW0 para la entrada “enable” y
BTN0 como “entrada”. La salida estará dada por el led LD0. Verificar el correcto
funcionamiento.
5.4.Multiplexores
55
Diseño básico en FPGA con VHDL
En la figura 5.6 a) se observa que el multiplexor dual tiene como entrada de datos las
variables a, b, c y d, cada una de ellas representadas por dos bits (al, a0), (bl, b0), etc., las
líneas de selección (s) de dos bits (s1 y s0) y la línea de salida z (zl y z0).
library ieee;
use ieee.std_logic_1164.all ;
entity mux is port(
a,b,c,d: in std_logic_vector(1 downto 0);
s: in std_logic_vector (1 downto 0) ;
Z: out std_logic_vector (1 downto 0) ;
end mux;
architecture behavioral of mux is
begin
with s select
Z <= a when "00",
b when "01",
c when "10",
d when others ;
end behavioral;
56
Diseño básico en FPGA con VHDL
5.5.Sumadores
57
Diseño básico en FPGA con VHDL
library ieee;
use ieee.std_logic_1164.all ;
entity m_sum is port (
A,B: in std_logic;
SUMA, Cout: out std_logic) ;
end m_sum;
architecture behavioral of m_sum is
begin
SUMA <= A XOR B;
Cout <= A AND B;
end behavioral;
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar a SW0 la entrada “A”, SW1
como la entrada “B”. LDO como la salida “SUMA” y LD1 como la salida “Cout”.
Verificar el correcto funcionamiento.
Un sumador completo (SC) a diferencia del circuito medio sumador considera un acarreo
de entrada (Cin) tal y como se muestra en la figura 5.8a, el comportamiento de este
sumador se describe a través de su tabla de verdad.
58
Diseño básico en FPGA con VHDL
library ieee;
use ieee.std_logic_1164.all;
entity sum is port (
A,B,Cin: in std_logic;
Suma, Cout: out std_logic);
59
Diseño básico en FPGA con VHDL
end sum;
architecture behavioral of sum is
begin
Suma <= A xor B xor Cin;
Cout <= (A and B) or (A xor B) and Cin;
end behavioral;
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar a SW0 como la entrada A, SW1
como la entrada B y SW2 como la entrada Cin, LD0 como la salida Suma y LD1 como la
salida Cout. Verificar el correcto funcionamiento.
En la figura 5.10 a) se muestra un circuito decodificador, el cual acepta código BCD en sus
entradas y proporciona salidas capaces de excitar un display de siete segmentos que indica
el dígito decimal seleccionado. En la figura 5.10 b) se observa la distribución de los
segmentos dentro del display.
Figura 3.13 a) Decodificador BCD a siete segmentos, b) Configuración del display de siete segmentos.
Como se puede apreciar, la entidad del decodificador cuenta con una entrada llamada A,
formada por cuatro bits (AO, Al, A2, A3), y siete salidas (a, b, c, d, e, f, g) activas en nivel
bajo, las cuales corresponden a los segmentos del display. En la tabla 5.3 se indican los
valores lógicos de salida correspondientes a cada segmento.
60
Diseño básico en FPGA con VHDL
La función del programa cuyo código se exhibe en el listado mostrado más abajo utiliza
declaraciones secuenciales del tipo case-when que, como se puede apreciar, ejecutan un
conjunto de instrucciones basadas en el valor que pueda tomar una señal. En nuestro
ejemplo, se describe de qué manera se maneja el decodificador de acuerdo con el valor que
toma la señal A. Para fines prácticos se declararon todas las salidas como un solo vector de
bits (identificado como d). Por otro lado, la palabra reservada others, como ya se indicó,
define los valores que puede tomar en la síntesis la salida d.
library ieee;
use ieee.std_logic_1164.all ;
entity deco is port (
A: in std_logic_vector (3 downto 0);
d: out std_logic_vector (6 downto 0);
anodo: out std_logic_vector (3 downto 0));
end deco;
architecture behavioral of deco is
begin
anodo <= “1110”
process (A) begin
case A is
when "0000" => d <= "0000001";
when "0001" => d <= "1001111";
when "0010" => d <= "0010010";
when "0011" => d <= "0000110";
when "0100" => d <= "1001100";
when "0101" => d <= "0100100";
when "0110" => d <= "0100000";
when "0111" => d <= "0001110";
61
Diseño básico en FPGA con VHDL
La señal ánodo se utiliza en este diseño para especificar cuál es el display que queremos
activar, en este caso es el display que se encuentra más a la derecha de nuestra tarjeta.
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar de SW0 a SW3 como entradas y
los valores del display de 7 segmentos como la salida d. Recuerde que los valores de los
displays de 7 segmentos los puede localizar impresos en la tarjeta de desarrollo o en el
manual de usuario. Verificar el correcto funcionamiento del diseño.
62
Diseño básico en FPGA con VHDL
Objetivo de la unidad
El participante aplicará los principios del diseño secuencial en VHDL mediante diversos
ejercicios prácticos utilizando la tarjeta de desarrollo Nexys 2 de manera adecuada.
Los circuitos digitales que se han manejado fueron del tipo combinacional; es decir, son
circuitos que dependen por completo de los valores que se encuentran en sus entradas en
determinado tiempo. Sin embargo, la mayoría de los sistemas que se encuentran en la
práctica incluyen elementos de memoria, los cuales requieren que el sistema se describa en
términos de lógica secuencial.
En esencia, la salida de un sistema secuencial no sólo depende del valor presente de las
entradas, sino también de la historia del sistema, según se observa en la figura 6.1.
63
Diseño básico en FPGA con VHDL
momento en el cual se aplican sus señales de entrada, por lo que no requieren un pulso de
reloj para sincronizar sus acciones.
6.2 Flip-flops
6.2.1 Flip-Flop D
Figura 6.2 a) Diagrama y tabla de verdad del flip-flop D, b) Flujo de información en el dispositivo
Cuando el valor de la entrada D es igual a 1, figura 6.2 b), la salida Qt + i adopta el valor de
1: Qt+i = 1 siempre y cuando se genere un pulso de reloj.
En el diseño secuencial con VHDL las declaraciones If-then-else son las más utilizadas; por
ejemplo, el programa del listado mostrado más abajo usa estas declaraciones.
La ejecución del proceso es sensible a los cambios en clk (pulso de reloj); esto es, cuando
clk cambia de valor de una transición de 0 a 1 (clk = 1), el valor de D se asigna a Q y se
conserva hasta que se genera un nuevo pulso.
1 library ieee;
2 use ieee.std_logic_1164.all ;
3 entity Flip_Flop_D is
4 Port ( D : in STD_LOGIC;
5 CLK : in STD_LOGIC;
6 Q : out STD_LOGIC;
7 Qn: out STD_LOGIC);
8end Flip_Flop_D;
9architecture Behavioral of Flip_Flop_D is
10begin
11process (CLK)
12begin
13if clk'event and clk='1' then
14Q <= D;
15Qn<=not D;
16end if;
17end process;
18end Behavioral;
En el lenguaje VHDL los atributos sirven para definir características que se pueden asociar
con cualquier tipo de datos, objeto o entidades. El atributo event (evento) se utiliza para
describir un hecho u ocurrencia de una señal en particular.
En el código del listado anterior podemos observar que la condición if clk 'event es cierta
sólo cuando ocurre un cambio de valor; es decir, un suceso (event) de la señal clk. Como se
puede apreciar, la declaración (if-then) no maneja la condición else, debido a que el
compilador mantiene el valor de Q hasta que no exista un cambio de valor en la señal clk.
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar SW0 como entrada D y LD0
como la salida Q. Recuerde que la terminal que corresponde al reloj interno de la tarjeta es
B8. Verificar el correcto funcionamiento del diseño.
65
Diseño básico en FPGA con VHDL
6.4 Flip-Flop SR
Escriba un programa que describa el funcionamiento de un flip-flop SR con base en la
siguiente tabla de verdad (figura 6.3).
Por último, cuando no existe cambio en las entradas S y R, es decir, son igual a 0, el valor
de Qt+i mantiene su estado actual Q.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Flip_Flop_SR is
Port ( S : in STD_LOGIC;
R : in STD_LOGIC;
clk : in STD_LOGIC;
Q : out STD_LOGIC;
Qn : out STD_LOGIC);
end Flip_Flop_SR;
66
Diseño básico en FPGA con VHDL
if S = '0' and R = '1' then
Q <= '0';
Qn <= '1';
elsif (S = '1' and R = '0') then
Q <= '1';
Qn <= '0';
elsif (S = '0' and R = '0') then
else
Q <= '-';
Qn <= '-';
end if;
end if;
end process;
end Behavioral;
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar SW0 como entrada S, SW1
como entrada R, LD0 como la salida Q y LD1 como salida Qn. Recuerde que la terminal
que corresponde al reloj interno de la tarjeta es B8. Verificar el correcto funcionamiento del
diseño.
6.5 Registros
library ieee;
use ieee.std_logic_1164.all;
entity reg is port (
D: in std_logic_vector(0 to 7);
clk: in std_logic;
67
Diseño básico en FPGA con VHDL
Q: out std_logic_vector(0 to 7));
end reg ;
architecture behavioral of reg is
begin
process (clk) begin
if (clk'event and clk='1') then
Q <= D;
end if;
end process;
end behavioral;
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar SW0 a SW7 como entrada D y
LD0 A LD7 como la salida Q. Recuerde que la terminal que corresponde al reloj interno de
la tarjeta es B8. Verificar el correcto funcionamiento del diseño.
6.6 Contadores
Los contadores son entidades muy utilizadas en el diseño lógico. La forma usual para
describirlos en VHDL es mediante operaciones de incremento, decremento de datos o
ambas.
Como ejemplo veamos la figura 6.5 que representa un contador ascendente de 4 bits, así
como el diagrama de tiempos que muestra su funcionamiento.
Cabe mencionar que la presentación del diagrama de tiempos de este circuito tiene la
finalidad de ilustrar el procedimiento que se sigue en la programación, ya que puede
observarse con claridad el incremento que presentan las salidas cuando se aplica un pulso
de reloj a la entrada.
library ieee;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all;
entity cont4 is port (
68
Diseño básico en FPGA con VHDL
clk: in std_logic;
Q: out std_logic_vector(3 downto 0));
end cont4;
Se necesita una señal auxiliar llamada Qaux porque la salida Q no puede usarse dentro del
proceso, la salida no puede emplearse para hacer lógica.
Notemos el uso del paquete std_arith que, como ya se mencionó, permite usar el operador +
con el tipo std_logic_vector.
Introducir el diseño anterior en la tarjeta Nexys 2. Utilizar SW0 como entrada D y LD0
como la salida Q. Recuerde que la terminal que corresponde al reloj interno de la tarjeta es
B8. ¿Es correcto el comportamiento de la tarjeta?
69
Diseño básico en FPGA con VHDL
library ieee;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all;
entity contador is port (
clk: in std_logic;
UP:in std_logic;
Q: inout std_logic_vector(3 downto 0));
end contador;
architecture behavioral of contador is
begin
process (UP, clk)
variable Qaux: std_logic_vector(3 downto 0);
begin
if (clk'event and clk = '1')then
if (UP = '0') then
Qaux := Qaux + 1;
else
Qaux := Qaux - 1;
end if ;
end if ;
Q <= Qaux;
end process ;
end behavioral;
70
Diseño básico en FPGA con VHDL
7. VHDL ESTRUCTURAL
Objetivo de la unidad
Para diseñar un circuito grande es conveniente separarlo en bloques funcionales. Cada uno
de estos bloques se diseña como se ha realizado hasta ahora (entidad y arquitectura). Y
estos bloques se juntan en una arquitectura que hace referencia a estos bloques.
Habitualmente este tipo de arquitectura se denomina Estructural.
En un diseño grande puede haber varios niveles de jerarquía, donde unas arquitecturas
estructurales contienen a otras. Las ventajas de realizar el diseño de esta manera son varias,
entre ellas se cuentan las siguientes:
Es fácil modificar algún bloque del diseño, mientras que se deja el resto igual.
Para explicar cómo se describe una arquitectura estructural en VHDL, en este ejemplo se
asume que se han implementado en un nuevo proyecto el diseño de una compuerta XNOR
y en otro proyecto el diseño de una compuerta AND.
Con los diseños anteriores se pretende implementar el diseño del comparador de 2 bits de la
figura 7.1.
71
Diseño básico en FPGA con VHDL
1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity comp is port (
4 a,b: in std_logic_vector (0 to 1);
5 c: out std_logic);
6 end comp;
7 architecture estructural of comp is
8 component xnor
9port (a0,b0: in std_logic;
10salida: out std_logic);
11 end component
12 component and
13 port (a1,b1: in std_logic;
14 salida: out std_logic);
15 end component
16
17 signal x0,x1: std_logic;
18
19 begin
72
Diseño básico en FPGA con VHDL
20
21 U0: xnor port map (a,b,x0);
22 Ul: xnor port map (a,b,x1);
23 U2: and port map (x0,x1, c);
24 end estructural;
Por último, podemos observar que la compuerta and recibe las dos señales provenientes de
x0 y xl, ejecuta la operación y asigna el resultado a la salida c del circuito.
Ya sea que se decida utilizar mapeo explícito o mapeo ordenado, el resultado es el mismo.
7.2.Divisor de frecuencia
Como se ha observado anteriormente con el diseño del contador binario de 4 bits o con los
Flip-Flops, la frecuencia a la que trabaja la tarjeta Nexys 2 es muy alta para poder observar
a detalle los cambios que suceden en este tipo de diseños, por lo que es necesario crear un
diseño denominado “divisor de frecuencia” en el cual nos da como salida una frecuencia
73
Diseño básico en FPGA con VHDL
más baja y a través de este alimentar nuestros contadores o nuestros Flip-Flops, cosa que se
puede realizar a través de un diseño estructural en VHDL.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Div2 is
PORT (Clk50Mhz: IN STD_LOGIC;
Clk: OUT STD_LOGIC
);
end Div2;
begin
process (Clk50Mhz)
variable count: integer;
begin
if Clk50Mhz'EVENT and Clk50Mhz = '1' then
if
count < max then count := count + 1;
else count := 0;
end if;
if
count < half then Clk <= '0';
else Clk <= '1';
end if;
end if;
end process;
end Behavioral;
Se pueden observar varios aspectos del diseño anterior, uno de ellos es el uso de la palabra
reservada “constant” en lugar de usar una variable, esto debido a que los valores que se
74
Diseño básico en FPGA con VHDL
obtengan para max y half se mantienen constantes a lo largo del tiempo, notese también que
las constantes han sido inicializadas. Es cierto que estas constantes bien pudieron colocarse
inmediatamente después del process, sin embargo el hacer esto implicaría que cada vez que
se activara dicho proceso la variable max automáticamente tomaría el valor de 50000000,
con lo cual nunca se llevaría a cabo el correcto funcionamiento del divisor de frecuencia
propuesto.
Dentro del proceso Clk50Mhz se lleva a cabo el conteo de los flancos de subida en la
variable count, la cual se resetea al llegar a los 50000000 pulsos, por otra parte se lleva a
cabo el conteo de los pulsos para variar la salida entre un ‘1’ y un ‘0’ lógico cada 25000000
pulsos de reloj, de esta manera se obtiene como resultado una frecuencia de salida de 1Hz.
Ya que se cuentan con los diseños del divisor de frecuencia a 1Hz y el contador binario de
4 bits, realizar un diseño estructural en el cual la señal de reloj que entra al contador
provenga del divisor de frecuencia en lugar de la tarjeta.
75
Diseño básico en FPGA con VHDL
8. Simulación de diseños
Objetivo de la unidad
Los siguientes diseños se tienen que realizar en el software Xilinx ISE en un mismo
proyecto.
library ieee;
use ieee.std_logic_1164.all;
entity c_and is
port(a,b: in std_logic;
z: out std_logic);
76
Diseño básico en FPGA con VHDL
end c_and;
library ieee;
use ieee.std_logic_1164.all;
entity c_or is
port(a,b: in std_logic;
z: out std_logic);
end c_or;
library ieee;
use ieee.std_logic_1164.all;
entity c_xor is
port(a,b: in std_logic;
z: out std_logic);
end c_xor;
library ieee;
use ieee.std_logic_1164.all;
entity Circuito is
port (a,b,c: in std_logic;
y: out std_logic);
end Circuito;
77
Diseño básico en FPGA con VHDL
component c_and
port(a,b: in std_logic;
z: out std_logic);
end component;
component c_or
port(a,b: in std_logic;
z: out std_logic);
end component;
component c_xor
port(a,b: in std_logic;
z: out std_logic);
end component;
begin
end str;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Circuito_test is
end Circuito_test;
component Circuito
Port (a : in std_logic;
b : in std_logic;
c : in std_logic;
y : out std_logic);
end component;
78
Diseño básico en FPGA con VHDL
begin
end tst;
Nótese que en el diseño del archivo de prueba la entidad se encuentra vacía y que al
principio de la arquitectura se hace referencia solamente a la entidad del diseño estructural.
Así como en la arquitectura de un diseño comportamental y en un diseño estructural se
denota por beh y str, en un diseño de prueba o testbench la arquitectura se denota con las
letras tst.
Por último tenemos la sección en donde deben colocarse las estímulos de las señales de
cada entrada con las que pretendemos probar nuestro diseño digital, algunas de las bases de
tiempo utilizadas son las siguientes:
ps para picosegundos.
ns para nanosegundos.
ms para hacer referencia a los milisegundos.
En ocasiones es necesario que una de las entradas de nuestro diseño tenga una entrada de
reloj (clk), para lo cual puede utilizarse como referencia el siguiente código que simulará la
entrada mencionada anteriormente:
79
Diseño básico en FPGA con VHDL
La figura 8.2 muestra como se ve este proyecto en el software Xilinx ISE en la ventana de
diseño.
No se debe sintetizar tst, puesto que no es un diseño en sí, sino solamente un archivo de
prueba.
Debe de recordarse que al momento de crear un proyecto en Xilinx ISE, el software nos
pregunta con que programa queremos realizar la simulación de nuestro diseño, es
indispensable elegir el software de simulación ModelSim.
Para realizar lo anterior se debe ir a Edit > Preferences, ahí se debe escoger el apartado
Integrated Tools. Se debe poner la ruta del simulador en Model Tech Simulator (figura
8.3).
80
Diseño básico en FPGA con VHDL
Una vez realizado lo anterior damos clic en aceptar y volvemos a la ventana principal de
Xilinx ISE, seleccionando el archivo tst de la ventana de diseño se da clic en Simulation
(figura 8.4).
Una vez realizado lo anterior aparecerá la ventana de la figura 8.6, en la que debemos elegir
No para poder acceder a la pantalla principal de ModelSim.
81
Diseño básico en FPGA con VHDL
Para poder observar mejor la gráfica se hace uso de la barra de herramientas zoom
y se ajusta hasta que pueda ser leída de mejor manera (figura 8.8).
82
Diseño básico en FPGA con VHDL
Si se desea resetear todas las señales de la gráfica se puede hacer uso del botón Restart ,
el cual al hacer clic sobre este, nos aparece una pantalla en la cual se nos pide seleccionar lo
que deseamos conservar (figura 8.9). Se deja todo como está y se da clic en Ok
Ya que la gráfica con los datos de la simulación se ha borrado, se puede hacer clic en el botón Run
para comenzar con la simulación.
Realizar un archivo de prueba para el diseño del Flip-Flop D del ejercicio 6.1 y simúlelo en
ModelSim. Corra la simulación con al menos dos tipos diferentes de estímulos, los cuales quedan a
elección del participante.
Realizar un archivo de prueba para el diseño del divisor de frecuencia del ejercicio 7.2 y simúlelo
en ModelSim.
Realizar un archivo e prueba para el diseño del contador de 4 bits con divisor de frecuencia del
ejercicio 7.3 y simúlelo en ModelSim.
83
Diseño básico en FPGA con VHDL
Figura 9.1 Descripción del circuito secuencial. (a) Diagrama de estados. (b) Tabla de estados.
(c) Formato de tabla de verdad.
84
Diseño básico en FPGA con VHDL
Máquina de Mealy: Es la máquina de estado en la cual la salida depende tanto del estado
presente como de las entradas externas. (figura 9.2).
Lógica de estado siguiente (F): Una función de las entradas y del estado actual.
Memoria de estados: Es un conjunto de n flip flops que almacenan el estado
presente de la máquina, que tiene 2n estados diferentes. La señal de reloj controla el
cambio de estado en tales flip flops.
La señal de reloj: Dispone el funcionamiento de los flip flops ya sea por disparo de
flanco o por disparo de pulso.
Lógica de salida (G): Una función del estado actual y/o de las entradas.
Máquina de Moore: Es la máquina de estado en la cual las salidas solo dependen del estado
presente (figura 9.3).
85
Diseño básico en FPGA con VHDL
Donde:
Debido a que es una máquina Moore el vector de estado próximo está en función del vector
de entrada y del vector de estado actual, es decir, Y=g(x,y) y la salida Z se encuentra en
función del estado actual, es decir, Z=f(y).
library ieee;
use ieee.std_logic_1164.all;
entity maquina is
reset: in std_logic;
z: out std_logic);
end maquina;
Esta primer parte del código no muestra nada nuevo, ya que solo se están especificando las
entradas y salidas de la máquina de estados, nótese que se tiene una señal de reset, la cual
se recomienda colocar en cada diseño de máquina de estados para regresar al estado inicial.
Esta declaración está formada por un identificador que nos permitirá usar el nuevo tipo al
llamarlo y la descripción del conjunto de valores que forman el tipo de datos. Para ello
usamos la palabra reservada type.
Se declaran alfa, beta, gama, delta, eta como estado (son los estados de la máquina referida
en la figura 9.4), así como las señales actual y próximo como pertenecientes al tipo antes
declarado.
begin
begin
case actual is
when alfa=> if x(1)=’0’
then proximo <= beta;
else proximo <= alfa;
end if;
when beta=> if x(0)=’0’
then proximo <= delta;
else proximo <= gama;
end if;
when gama=> proximo <= eta;
when delta=> próximo <= eta;
when eta=> próximo <= alfa;
end case;
end process;
87
Diseño básico en FPGA con VHDL
El código anterior muestra las transiciones que debe realizar nuestra máquina de estados
dependiendo de los valores del vector de entrada, posteriormente se debe colocar el diseño
del registro, que se encargará de guardar el valor actual y próximo del estado de nuestra
máquina.
begin
if clk’event and clk=’1’
then if reset = ‘0’
then actual <= alfa;
else actual <= proximo;
end if;
end if;
end process;
Dicho registro se realiza con un proceso sensible a una señal de reloj. Por último queda
definir las salidas del diseño.
En caso de que se requiera construir una máquina Mealy en lugar de una Moore, la
estructura de este último código es la que cambiaría un poco, agregando las entradas para
los posibles valores de entrada.
library ieee;
use ieee.std_logic_1164.all;
entity maquina is
begin
case actual is
when alfa=> if x(1)=’0’
then proximo <= beta;
else proximo <= alfa;
end if;
when beta=> if x(0)=’0’
then proximo <= delta;
else proximo <= gama;
end if;
when gama=> proximo <= eta;
when delta=> proximo <= eta;
when eta=> proximo <= alfa;
end case;
end process;
begin
if clk’event and clk=’1’
then if reset = ‘0’
then actual <= alfa;
else actual <= proximo;
end if;
end if;
end process;
salida: process (actual)
begin
case actual is
when alfa => z <=’0’;
when beta => z <=’0’;
when gama => z <=’1’;
when delta => z <=’0’;
when eta => z <=’1’;
end case;
end process;
end beh;
89
Diseño básico en FPGA con VHDL
90
Diseño básico en FPGA con VHDL
BIBLIOGRAFIA
López Núñez, Adolfo Rafael: Documento tesis de maestría “Sistema de control digital para
obtención de máxima potencia de celdas fotovoltaicas”. Instituto Tecnológico de Celaya,
2011.
Pardo Carpio Fernando, “VHDL. Lenguaje para síntesis y modelado de circuitos”, Ra-Ma,
2003.
91