You are on page 1of 67

DISEO EN VHDL PARA FPGAs

Ral Mateos Gil. Ignacio Fernndez Lorenzo. Pedro Martn Snchez.

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

NDICE
1. FLUJO DE DISEO VHDL SOBRE FPGAs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1. INTRODUCCIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. STANDARD VITAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. CREACIN DEL MODELO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. SNTESIS DEL MODELO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5. IMPLEMENTACIN DEL MODELO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 3 4

2. DESCRIPCIN DEL DISEO A REALIZAR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1. CREACIN DEL MDULO LOGIBLOX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2. MDULO BCD2SEG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3. MDULO CRONO.VHD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.1. Declaracin de libreras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3.2. Definicin de la entidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.3. Parte declarativa de la arquitectura. . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.4. Instantacin de componentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.5. Contador de dcadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.6. Registros de lapso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.7. Mquina de estados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.4. BANCO DE PRUEBAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.5. FICHERO CONFBEHAVIORAL.VHD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3. SIMULACIN FUNCIONAL DEL DISEO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1. INTRODUCCIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1. Libreras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. MANEJO DEL SIMULADOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1. Creacin del proyecto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2. Creacin de nuevas libreras y mapeado de las libreras a reutilizar . 3.2.3. Compilacin del cdigo fuente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.4. Carga de la unidad de diseo a simular . . . . . . . . . . . . . . . . . . . . . . . 3.2.5. Seleccin de puntos de prueba. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.6. Avance y detencin de la simulacin. . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.7. Introduccin de estmulos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.8. Anlisis de resultados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.9. Finalizar una sesin de simulacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. PUNTOS DE RUPTURA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4. METODOLOGA DE TRABAJO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. SNTESIS DEL DISEO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. OPERACIN INTERNA DEL SINTETIZADOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1. Generadores de mdulos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. MANEJO DEL SINTETIZADOR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1. Inicializacin del sintetizador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2. Seleccin de la tecnologa destino. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3. Seleccin del mtodo de codificacin de las mquinas de estados. . . 4.2.4. Lectura de ficheros del diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.5. Seleccin del diseo actual. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.6. Configuracin de opciones de optimizacin. . . . . . . . . . . . . . . . . . . . 4.2.7. Optimizacin del diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.8. Almacenamiento del diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-i-

20 20 21 23 24 24 25 26 27 31 33 35 36 36 38 39 39 42 43 45 45 45 47 47 48 51 52

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

4.2.9. Exportacin de la lista de conexiones. . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.10. Uso de ficheros de scripts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.3. ANLISIS DE RESULTADOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5. IMPLEMENTACIN DEL DISEO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.1. USO DE FICHEROS DE RESTRICCIONES. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6. SIMULACIN A NIVEL DE PUERTAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

-ii-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

1. FLUJO DE DISEO VHDL SOBRE FPGAs.


1.1. INTRODUCCIN.
La figura 1.1 muestra el diagrama de flujo para el diseo en VHDL de sistemas implementados sobre FPGAs de Xilinx. El proceso de diseo se divide en tres fases: creacin del modelo, sntesis e implementacin. Al finalizar cada una de las fases es preciso comprobar la validez del diseo mediante simulacin, utilizandose distintos tipos de simulacin en cada una de ellas: ! ! ! Simulacin funcional RTL para validar el modelo VHDL creado. Simulacin funcional post-sntesis a nivel de puertas para validar el modelo sintetizado. Simulacin temporal post-implementacin para validar la implementacin del modelo implementado.
El diseo contiene componentes LogiBLOX instanciados

Editor VHDL

LogiBLOX
Modelo de simulacin del componente LogiBLOX. VHDL Simulacin RTL.

SIMULADOR VHDL SIMULACIN FUNCIONAL. SIMULACIN TEMPORAL.

Fichero fuente RTL VHDL

Plantillas de instantacin

VHI

UNISIM VITAL

Restricciones de diseo. Fichero de lista de conexiones de salida.

SINTETIZADOR VHDL
XNF EDIF VHDL

LIsta de conexiones en formato nativo.

.NGC

Simulacin post-sintesis pre-implementacin.

LogiBLOX Comportamiento

Fichero de restricciones de usuario.

HERRAMIENTAS DE IMPLEMENTACIN

Banco de pruebas VHDL

BIT JEDEC Fichero de programacin del dispositivo.

Ficheros de informes

EDIF

VHDL

SDF

SIMPRIM VITAL

Ficheros de lista de conexiones para simulacin post-implementacin

Figura 1: Flujo de diseo en VHDL para FPGAs de Xilinx. El banco de pruebas creado para validar el modelo es nico, siendo utilizado en todos los tipos de simulacin mencionados. Las dos ltimas son simulaciones a nivel de puertas, ya que el diseo esta expresado como una descripcin estructural VHDL en trminos de las celdas de la tecnologa destino para la que se va implementar.

1.2. STANDARD VITAL


Para poder realizar simulaciones temporales mediante un simulador VHDL se necesitan modelos VHDL con informacin temporal de los elementos de la librera de la tecnologa destino. El standard VITAL (VHDL Initiative Towards ASIC Library) define las tcnicas de generacin de estos modelos de
-1-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

simulacin mediante dos paquetes denominados VITAL_Timing y VITAL_Primitives. En este caso el fabricante del ASIC debe proporcionar las libreras VITAL en la que estn descritas las celdas bsicas de la tecnologa destino. La retroanotacin de los retardos internos (tanto debidos a elementos activos como a interconexiones) se realiza mediante ficheros SDF. Se pueden utilizar distintos ficheros SDF a lo largo de las distintas etapas del proceso de diseo. Alguno de estos ficheros pueden contener datos temporales pre-layout. Otros pueden contener restricciones de caminos crticos de seales o informacin temporal post-layout. Xilinx proporciona varias libreras VITAL para realizar simulaciones VHDL de diseos para FPGAs. La librera UNISIM es una librera VITAL en la que se han desactivado las comprobaciones de violaciones de temporizacin para realizar simulaciones funcionales con retardos unitarios. Al sintetizar una descripcin VHDL RTL para FPGAs de Xilinx las celdas de la tecnologa destino que aparecen en el fichero de salida corresponden a las celdas primitivas definidas en la biblioteca unificada de Xilinx de las herramientas de captura de esquemas. La librera UNISIM contiene los modelos VITAL de estas celdas bsicas. Adems se incluyen los modelos de otras celdas primitivas que se pueden instanciar como componentes para aprovechar los recursos de la FPGA (por ejemplo, el oscilador integrado OSC4 de la familia Spartan XL). Sin embargo UNISIM no dispone de modelos para los componentes de tipo macro que aparecan en la librera unificada de las herramientas de captura de esquemas. Esto impide realizar simulaciones RTL de diseos en los que se instancien estas macros como componentes descritos por una lista de conexiones. La librera XILINXCORELIB se utiliza para realizar simulaciones funcionales de diseos en los que aparezcan componentes creado con la herramienta COREGEN. Finalmente la librera SIMPRIMS es una librera VITAL para realizar simulaciones temporales a nivel de puertas. En esta librera se almacenan los modelos de los componentes fsicos que aparecen en el interior de una FPGA (LUTs, biestables, etc). En este caso las comprobaciones de violaciones de temporizacin si estn activadas. La retroanotacin de los retardos de los elementos activos (LUTs, biestables, buffers triestado, etc) y de las interconexiones se realizan mediante un fichero SDF.A continuacin se describirn en detalle cada una de las fases del flujo de diseo as como las peculiaridades de la simulacin utilizada para la verificacin de los resultados obtenidos.

1.3. CREACIN DEL MODELO.


El primer paso consiste en crear un modelo RTL del diseo que se pretende realizar. Para ello se puede utilizar un editor de texto. El diseo puede contener: ! Cdigo VHDL genrico que describe lgica independiente de la tecnologa donde se va a implementar. Componentes instanciados propios de la arquitectura del dispositivo en el que se va a implementar. Un ejemplo de esto sera el uso del oscilador interno OSC4 de la familia Spartan XL. Componentes instanciados creados mediante COREGEN. Un ejemplo de esto sera el uso de una memoria, un contador, etc creados mediante COREGEN.

Para el caso de utilizacin de componentes propios de la arquitectura del dispositivo el sintetizador obtiene la descripcin de dichos componentes de la biblioteca de celdas de la tecnologa destino. El formato de esta biblioteca depender de la herramienta de sntesis utilizada. En algunos casos dicha biblioteca est integrada en la propia herramienta como una biblioteca ms del sistema. Tal es el caso del sintetizador Leonardo Spectrum. En otros casos la biblioteca aparece como conjunto
-2-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

de macros expresadas como listas de conexiones en formato XNF. Estos componentes aparecen como mdulos sin definicin (cajas negras) en la descripcin VHDL donde se instancian. Si el diseo utiliza componentes COREGEN es preciso crearlos previamente mediante esta herramienta. Al crear un componente COREGEN, se genera un fichero VHDL con una definicin abstracta del funcionamiento del mismo, que puede ser simulado y sintetizado. Tambin se crea un archivo de lista de conexiones para la implementacin (.EDN). Ser posteriormente durante la implementacin del diseo cuando las herramientas de implementacin de Xilinx enlacen esta lista de conexiones con la del diseo principal obtenida tras el proceso de sntesis. Si bien el componente obtenido es un mdulo sin definicin aparente, COREGEN puede crear un fichero VHDL de comportamiento para permitir la verificacin del diseo completo mediante simulacin. Este fichero tiene extensin .VHD. Tambin puede generar un fichero de declaracin del componente en VHDL con extensin VHO. Este fichero contiene una plantilla con las construcciones necesarias para la declaracin e instanciacin del componente COREGEN en el fichero VHDL donde se vaya a utilizar, lo que facilita el desarrollo de diseos con este tipo de componentes. Antes de proceder a la sntesis del diseo es preciso verificar el modelo creado mediante simulacin. Se trata de una simulacin funcional en la que el diseo est descrito con construcciones RTL de alto nivel. Si el diseo utiliza componentes propios de la tecnologa destino es preciso utilizar la librera de simulacin XILINXCORELIB. Estos componentes COREGEN no son sintetizables por lo que su declaracin se intercala entre directivas de inhabilitacin/ habilitacin del proceso de sntesis. Estas directivas aparecen como comentarios sintticos en el fichero fuente. La sintaxis de tales directivas debe ser aceptada por la herramienta de sntesis en cuestin. Estas directivas son
-- synopsys translate_off

.........

-- synopsys translate_on

las cuales son aceptadas por Leonardo Spectrun.

1.4. SNTESIS DEL MODELO.


Una vez validado el modelo creado se procede a la sntesis de ste. El resultado de la sntesis es una lista de conexiones en formato EDIF o XNF. Si en el proceso de sntesis se fijan restricciones de diseo (topolgicas o temporales) que afectan al proceso de implementacin stas se exportan en la propia lista de conexiones. Para comprobar los resultados de la sntesis es preciso realizar una simulacin funcional (retardos unitarios) a nivel de puertas (expresadas como componentes de UNISIM). Para ello se debe disponer de una herramienta capaz de generar una descripcin estructural VHDL equivalente a las listas de conexiones mencionadas. El procedimiento a seguir es similar a la simulacin funcional RTL. Los modelos de los componentes COREGEN siguen siendo modelos de comportamiento. Si la herramienta de sntesis no es capaz de proporcionar este fichero VHDL habr que utilizar las herramientas de implementacin para poder realizar este tipo de simulacin.

-3-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

1.5. IMPLEMENTACIN DEL MODELO.


Una vez sintetizado el diseo se procede a su implementar. La figura 1.2 muestra el diagrama de flujo de las herramientas de implementacin de Xilinx. En ella aparecen las distintas fases en que se divide la implementacin del diseo y las herramientas utilizadas en cada una de stas.

FASES

HERRAMIENTAS
.XNF o EDIF Lista de conexiones de entrada

NGDBUILD
Diseo jerrquico aplanado

.NGD

MAP
Traduccin lgica a fsica. Agrupamiento de LUTs y FFs en CLBs

.NCD TRCE

.PCF

Estimacin de retardos estticos.

PAR
Emplazamiento del diseo fsico Interconexin del diseo fsico.

.NCD TRCE NGDANNO & NGD2VHDL


Retroanotacin de retardos. Generacin de ficheros simulacin temporal VHDL .

Estimacin de retardos estticos.

Obtencin del fichero de configuracin.

BITGEN

VHDL .BIT

SDF

Figura 2: Flujo de implementacin. El diseo a implementar puede estar descrito en base a un conjunto de ficheros de listas de conexiones XNF o EDIF formando una estructura jerrquica. En esta jerarqua pueden aparecer componentes en uno de los ficheros cuya estructura interna est descrita en otro fichero. Tal es el caso de aquellos diseos que contienen componentes COREGEN en los que cada uno de ellos est descrito por una lista de conexiones EDN. En la fase de traduccin (traslate), realizada mediante la herramienta NGDBUILD, se enlazan los ficheros de lista de conexiones creando un nico fichero de salida en el que queda reflejada la jerarqua citada. El formato de este fichero de salida se denomina

-4-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

NGD (Native Generic Design) y contiene componentes lgicos: puertas lgicas, biestables, RAMs, etc. Esta herramienta puede generar tambin un fichero VHDL que contiene una descripcin estructural del diseo en base a componentes contenidos en la librera UNISIM. El cual se puede utilizar para realizar simulaciones funcionales post-sntesis cuando el sintetizador no es capaz de generar este tipo de ficheros VHDL. En este caso, los componentes generados mediante COREGEN estn descritos tambin mediante elementos de la librera UNISIM, por lo que no se ha de emplear los ficheros VHDL de comportamiento de estos componentes ni la librera XILINXCORELIB. En la fase de mapeado (map) se mapean mediante la herramienta MAP los componentes lgicos en los componentes fsicos de que dispone la FPGA: tablas LUT, biestables, buffers triestado, etc. A continuacin se encapsulan estos componentes fsicos en bloques configurables (CLBs e IOBs), creando un fichero de salida en formato NCD (Native Circuit Design). En esta fase se realiza un anlisis esttico de tiempos mediante la herramienta TRCE. En l se analizan los caminos crticos de las seales comprobando el cumplimiento de las restricciones temporales introducidas mediante el fichero PCF (Project Constrains File). Esta evaluacin es slo preliminar ya que todava no se dispone de la informacin de los retardos debidos a las interconexiones. Si el diseo cumple las restricciones temporales impuestas se pasa a realizar el emplazamiento e interconexin de los bloques configurables en la FPGA mediante la herramienta PAR. Esto corresponde a la fase denominada place & routing. La herramienta PAR genera un fichero de lista de conexiones en formato NCD. Una vez finalizado este proceso se dispone de toda la informacin de retardos internos (elementos activos e interconexiones). Con la herramienta TRCE se puede realizar de nuevo un anlisis esttico de tiempos esta vez con todos los datos de retardos internos. En la siguiente fase se obtienen la informacin para realizar simulaciones temporales del diseo completo. En primer lugar la herramienta NGDANNO retroanota la informacin de retardos internos. A continuacin la herramienta NGD2VHDL crea un fichero VHDL estructural en base a los componentes fsicos de la FPGA y un fichero SDF con los retardos internos de la FPGA. Los modelos de simulacin de estos componentes se encuentran en la librera SIMPRIM. La retroanotacin de retardos se realiza mediante un fichero SDF. Utilizando estos ficheros se puede realizar la verificacin del diseo final mediante una simulacin temporal VHDL post-sntesis post-implementacin tal y como muestra la figura 1.1. Finalmente la herramienta BITGEN genera el fichero de configuracin de la FPGA.

2. DESCRIPCIN DEL DISEO A REALIZAR.


Para ilustrar el proceso de diseo en VHDL para FPGAs se emplear como ejemplo de diseo la realizacin de un cronometro digital con precisin de segundos y valor mximo de cuenta de un minuto. Con este diseo se pretende ilustrar las situaciones ms frecuentes que aparecen en los diseos para FPGAs descritos en VHDL. El diseo se implementar en una FPGA XC2S50ETQ144-6 , utilizando para su desarrollo la placa empleada en el laboratorio. La figura 1.3 muestra el diseo a realizar.

-5-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

OSCILADOR Vcc Vcc R R

FPGA
clk
MARCHA lapso rst UPDOWN

DisplayUnidades

RST

P1

DisplayDecenas

Figura 3: Diseo a realizar La seal de reloj del sistema proviene de un osiclador externo, que proporciona una seal de frecuencia 10 MHz. El nmero de segundos transcurridos se visualizar sobre sendos displays de 7 segmentos conectados a la FPGA. El sistema dispone de un pulsador de reset para inicializar la cuenta del tiempo transcurrido. Adems se dispone de otro pulsador para implementar la funcin de lapso. Al pulsar este pulsador se congela el tiempo actual de forma que sobre los displays se muestra dicho instante de tiempo mientras que el cronmetro sigue contando internamente. Al volver a pulsar el pulsador de lapso se muestra el tiempo transcurrido actualmente. Si bien en la figura anterior las resistencias conectadas a los pulsadores aparecen como componentes externos, en el diseo a realizar stas se implementarn mediante las resistencias de pull-up de los IOBs correspondientes a estos terminales de la FPGA. La figura 1.4 muestra el diagrama de bloques del diseo a realizar.
PRESCALER DIVISOR 1 / 10E10 prescaler.vhd clk
EN

CONTADOR 0-59
EN1HZ

REGISTROS BCD2SEG

EN

BCD2SEG

rst lapso FSM

bcd2seg.vhd

crono.vhd

Figura 4: Diagrama de bloques del diseo. La descripcin VHDL de este diseo est compuesta de varios ficheros. El fichero bcd2seg.vhd contiene la descripcin de un decodificador BCD a 7 segmentos para displays de ctodo comn. Este decodificador se instanciar como sendos componentes en la entidad de mayor jerarqua que se encuentra almacenada en el fichero crono.vhd. En esta entidad se intancia tambin el componente PRESCALER que proporciona la seal de 1 Hz, emplada para contar los segundos. Esta seal se
-6-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

obtiene de dividir la frecuencia de la seal de reloj clk por un factor de 10E10. Este componente se generar mediante COREGEN. El tiempo transcurrido viene indicado mediante un contador de dcadas de 2 dgitos (unidades y decenas). Para implementar la funcin de congelacin del tiempo se intercalan sendos registros entre la salida del contador y los decodificadores BCD a 7 segmentos. Cuando la seal de habilitacin de estos registros est activa la salida de los registros reflejan el valor actual de cuenta. Si por el contrario la seal de habilitacin est desactivada no se actualiza la salida del contador sobre los displays implementando de esta forma la funcin de congelacin. La seal de habilitacin de estos registros se controla mediante una mquina de estados que recibe como entrada la seal procedente del pulsador de lapso, y cuyo grafo se muestra en la figura 1.5. La variable P indica el estado del pulsador: 1 sin pulsar, 0 pulsado.
P=1 S1 1 P=1

P=0

P=0

S2 0

S4 1

P=0

P=1

S3 0

P=0

P=1

Figura 5: Grafo de la mquina de estados. Inicialmente la mquina parte del estado S1 (la salida est a 1), de forma que la cuenta no est congelada. Si en este estado se pulsa el pulsador (P=0) se pasa al estado S2, inhabilitandose el refresco de los registros (la salida pasa a 0). Se permanece en este estado mientras el pulsador se encuentre activado. Al liberarse (P=1) se pasa al estado S3 (la salida permanece a 0), donde se espera hasta que se vuelva a activar el pulsador (P=0) momento en el cual se pasa al estado S4 (la salida pasa a 1), habilitando de nuevo el refresco de los registros. El sistema permanece en S4 mientras el pulsador permanece activado, pasando a S1 al liberarse. Una vez descrito el comportamiento del diseo se pasar describir el cdigo VHDL a utilizar para implementarlo. En el archivo codigo.zip se encuentran todos los ficheros VHDL necesarios para realizar la aplicacin antes descrita. Estos archivos se almacenarn en el directorio raz del diseo. En este grupo se incluyen todos los ficheros fuente VHDL empleados, tanto los desarrollados por el diseador, como los generados automticamente por las herramientas de sntesis (Leonardo), as como las de implementacin (ISE 4.1): stos ultimo sern utilizados, ademas de configurar la FPGA, para realizar la simulacin temporal del diseo. Otros ficheros son los pertenecientes a los componentes COREGEN utilizados. Por tanto, si el diseo contiene componentes COREGEN (como es el caso que nos ocupa), el directorio de proyecto de estos componentes deber ser el directorio raz. Finalmente tambin se almacenar en el directorio raz el fichero de restricciones de usuario (.ucf) empleado para asociar las seales externas del diseo a terminales concretos de la FPGA. En el archivo herramientas.zip se encuentran archivos scrips a utilizar con las herramientas de simulacin y sntesis que permitirn simplificar la fase de diseo. a lo largo de este manual se irn explicando la funcionalidad de cada uno de ellos.
-7-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

2.1. CREACIN DEL MDULO COREGEN.


Como se ha comentado el mdulo prescaler se va a crear mediante COREGEN. Esta herramienta permite generar nuevos componentes a partir de un modelo bsico predefinido que el usuario parametriza y ajusta a sus necesidades. Esta herramienta se ejecuta seleccionando:
Inicio Programas Xilinx ISE4.1 Accesorios

Esto arranca la herramienta COREGEN apareciendo la pantalla de Setup mostrada en la figura 1.7, que nos permite crear un proyecto nuevo o acceder a uno ya creado. Un proyecto se considera como el subdirectorio donde se almacenan los componentes creados por esta herramienta. Para nuestra aplicacin ser el mismo en el que se almacena el cdigo VHDL.

Figura 7: Seleccin de un proyecto para COREGEN. Sise ha optado por la opcin de crear un proyecto nuevo (Create New Project) aparece la ventana mostrada en la figura 1.8, en la que se selecciona el formato del archivo de salida. En nuestro caso se debe seleccionar las opciones VHDL y la herramienta de sntesis utilizada (exemplar, para el caso de utilizar Leonardo Spectrum). As mismo, tambin se selecciona la familia de FPGAs para la que se va a crear el componente.

-8-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Figura 8: Ventana de configuracin de COREGEN. En la pestaa Project Directory debe aparecer el path del directorio donde se almacenar el componente creado con COREGEN. Segn lo indicado, para este ejemplo debe ser c:\tutorial. Una vez creado un proyecto se pueden modificar las anteriores opciones utilizando la herramienta Project Options del men Project. Una vez fijadas las distintas opciones se validan mediante el botn Aceptar mostrandose a continuacin la ventana principal de COREGEN (figura 1.9)

Figura 9: Ventana principal de COREGEN. En el campo Target Family se muestran el tipo de agrupacin de los elementos que se poden crear, pudendose cambiar la seleccin con la pestaa View Catalog. En el campo Contens Of se representan los componentes que podemos crear. Por su parte, en el campo Generated Modules se muestran todos los componentes que se encuentra en el proyecto de trabajo, haciendo doble clic sobre cada uno de ellos se pueden volver a editar y en consecuencia a modificar su funcionalidad. Una vez seleccionado un componente en la ventana Contens Of, seleccionando se accede a un archivo en formato PDF en el que se detalla la funcionalidad de cada uno de los terminales del
-9-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

componente. El prescaler se va a crear a partir de un contador, para ello se selecciona la carpeta Counters en Basic Elements para entran en el modelado del componente se hace doble clic sobre el elemento de la ventana Contens Of o se ejecuta , apareciendo el men de la figura 1.10 que permite parametrizar el componente de acuerdo con nuestras necesidades. En este caso debemos disear un contador de 0 a 10E10-1(98967FH ) con seal de reset asncrono (ACLR) y fin de cuenta (THRESH0), para acceder a estas opciones se debe seleccionar el botn Next.

Figura 10: Plantilla de los contadores. Una vez parametrizado el componente se crea actuando sobre Generate, creandose el archivo VHDL. A su vez se crea un archivo, de extensin vho, que proporciona las lineas de cdigo para definir y instanciar el componente en un archivo VHDL. El contenido del fichero de plantilla prescaler.vho es:
-- This file is owned and controlled by Xilinx and must be used --- solely for design, simulation, implementation and creation of --- design files limited to Xilinx devices or technologies. Use --- with non-Xilinx devices or technologies is expressly prohibited --- and immediately terminates your license. ----- Xilinx products are not intended for use in life support --- appliances, devices, or systems. Use in such applications are --- expressly prohibited. ----- Copyright (C) 2001, Xilinx, Inc. All Rights Reserved. ------------------------------------------------------------------------ The following code must appear in the VHDL architecture header: ------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG component prescaler port ( Q: OUT std_logic_VECTOR(23 downto 0); CLK: IN std_logic; THRESH0: OUT std_logic; ACLR: IN std_logic); end component; -- COMP_TAG_END ------ End COMPONENT Declaration ------------- The following code must appear in the VHDL architecture -- body. Substitute your own instance name and net names. ------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG your_instance_name : prescaler port map ( Q => Q, CLK => CLK, THRESH0 => THRESH0, ACLR => ACLR); -- INST_TAG_END ------ End INSTANTIATION Template ---------------You must compile the wrapper file prescaler.vhd when simulating the core, prescaler. When compiling the wrapper file, be sure to reference the XilinxCoreLib VHDL simulation library. For detailed instructions, please refer to the "Coregen Users Guide".

2.2. MDULO BCD2SEG.

-10-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

El modelo del decodificador BCD a 7 segmentos se almacena en el fichero bcd2seg.vhd. La decodificacin se realiza mediante una asignacin concurrente de seal seleccionada tal y como se muestra en el siguiente listado. La salida de este mdulo es un bus de 7 lneas donde la de menor peso corresponde al segmento a y la de mayor peso al segmento g.
library ieee; use ieee.std_logic_1164.all; entity BCD2SEG is port ( BCD: in Display:out end BCD2SEG; begin std_logic_vector(3 downto 0); -- input data std_logic_vector(6 downto 0));

architecture inside of BCD2SEG is with BCD select Display <= "0111111" "0000110" "1011011" "1001111" "1100110" "1101101" "1111101" "0000111" "1111111" "1100111" "0000000" when when when when when when when when when when when "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", others; --0 --1 --2 --3 --4 --5 --6 --7 --8 --9 --0

end inside;

2.3. MDULO CRONO.VHD


Este es el fichero principal del diseo sobre el que se instancian los componentes bcd2seg y prescaler. El resto de los mdulos que aparecen en el diagrama de bloques de la figura 1.4 (contador, registros, FSM, etc) aparecern como procesos dentro de la arquitectura del cronometro. El listado completo de este fichero se muestra a continuacin.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity crono is port ( lapso: rst: clk: DisplayUnidades: DisplayDecenas: in std_logic; std_logic; std_logic; std_logic_vector(6 downto 0); std_logic_vector(6 downto 0));

in in out out

attribute pull:string; attribute pull of rst,lapso:signal is "pullup"; end crono ; architecture rtl of crono is -- Declaracin del decodificador BCD a 7 segmentos. component BCD2SEG port( BCD: in std_logic_vector (3 downto 0); Display: out std_logic_vector (6 downto 0)); end component; -- Declaracin del prescaler (COREGEN). component prescaler port ( Q: OUT std_logic_VECTOR(23 downto 0); CLK: IN std_logic; THRESH0: OUT std_logic; ACLR: IN std_logic); end component; signal Unidades: signal Decenas: signal CntUnidades: signal CntDecenas: signal EN1HZ,rst_n: std_logic_vector(3 downto 0); std_logic_vector(3 downto 0); unsigned(3 downto 0); unsigned(3 downto 0); std_logic;

-- Estados de la FSM que controla el sistema. type stateFSM is (

-11-

Ingeniera Electrnica.
S1, S2, S3, S4); signal state: signal actualizar: begin -----

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.


RunningWaitingOnPush RunningWaitingOnRelease FrozenWaitingOnPush FrozenWaitingOnRelease

stateFSM; std_logic;

-- Instantacin de los decodificadores BCD a 7 segmentos. U1 : BCD2SEG BCD DISPLAY U2 : BCD2SEG BCD DISPLAY port map ( => Unidades, => DisplayUnidades); port map ( => Decenas, => DisplayDecenas);

-- Instantacin del prescaler (COREGEN). U3 : prescaler port map ( CLK => clk, THRESH0 => EN1HZ, ACLR =>rst_n); rst_n<= not rst; -- Proceso contador. process(clk,rst) begin if(rst='0') then CntUnidades <= (others => '0'); CntDecenas <= (others => '0'); elsif(clk='1' and clk'event) then if(EN1HZ='1') then if (CntUnidades = 9) then CntUnidades <= (others => '0'); if (CntDecenas = 5) then CntDecenas <= (others => '0'); else CntDecenas <= CntDecenas + 1; end if; else CntUnidades <= CntUnidades + 1; end if; end if; end if; end process; -- Proceso de registros de lapso. process(clk,rst) begin if(rst='0') then Unidades <= (others => '0'); Decenas <= (others => '0'); elsif (clk'event and clk='1') then if (actualizar = '1') then Unidades <= std_logic_vector(CntUnidades); Decenas <= std_logic_vector(CntDecenas); end if; end if; end process; -- Maquina de estados de control del lapso: -Control del cambio de estados. process(clk,rst) begin if(rst='0') then state <= S1; elsif (clk'event and clk='1') then case state is when S1 => if (lapso = '1') then state <= S1; else state <= S2; end if; when S2 => if (lapso = '0') then state <= S2; else state <= S3; end if; when S3 => if (lapso = '1') then state <= S3; else state <= S4; end if; when S4 => if (lapso = '0') then state <= S4; else state <= S1; end if; end case; end if; end process;

-12-

Diseo en VHDL para FPGAs.


-- Maquina de estados de control del lapso: -Control de la salida. process(state) begin case state is when S2 | S3 => actualizar <= '0'; when S1 | S4 => actualizar <= '1'; end case; end process; end rtl ;

R. Mateos, I. Fernndez. P. Martn

2.3.1. Declaracin de libreras. Este fichero comienza con la declaracin de las libreras a emplear. El paquete numeric_std contiene la declaracin de tipos y operadores que permiten realizar operaciones aritmticas con vectores de bits. 2.3.2. Definicin de la entidad. Respecto a la declaracin de la entidad la nica cuestin a destacar sobre lo ya expuesto es la asignacin del atributo pull a los puertos correspondientes a los pulsadores. Este atributo es reconocido automticamente por el sintetizador como indicador de que debe emplear la resistencia de pull-up de los IOBs correspondientes a dichos puertos. Esto se ver con ms detalle en el apartado dedicado al sintetizador. 2.3.3. Parte declarativa de la arquitectura. En esta parte del cdigo se declaran los componentes a instanciar (decodificadores BCD a 7 segmentos y el prescaler creado con COREGEN) as como las seales internas empleadas para conectar los distintos elementos que aparecen en el diagrama de bloques de la figura 1.4. Tambin aparece un tipo enumerado empleado en la descripcin de la seal de estado de la FSM. 2.3.4. Instanciacin de componentes. Al principio del cuerpo de la arquitectura se realiza la instanciacin de los componentes mencionados. As el puerto clk se conecta a la entrada de reloj del prescaler, obtenindose su salida la seal EN1Hz, utilizada para habilita la cuenta del contador. 2.3.5. Contador de dcadas. Este contador se implementa mediante el proceso cuyo listados se muestra a continuacin. Dicho proceso es sensible a las seales de reset asncrona (rst) y reloj (clk) . El carcter asncrono de la seal de reset se fija mediante la posicin de la sentencia if dentro de la estructura de if anidados que evala su estado. El valor de cuenta se almacena sobre las seales CntUnidades y CntDecenas. Estas seales estn declaradas de tipo unsigned. Este es un tipo derivado de std_logic_vector que permite realizar operaciones aritmticas. El valor de cuenta slo se modifica si la seal EN1HZ est a 1. Esta seal se obtiene del mdulo prescaler.
-- Proceso contador. process(clk,rst) begin if(rst='0') then CntUnidades <= (others => '0'); CntDecenas <= (others => '0'); elsif(clk='1' and clk'event) then if(EN='1') then if (CntUnidades = 9) then CntUnidades <= (others => '0'); if (CntDecenas = 5) then CntDecenas <= (others => '0');

-13-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.


else else end if; CntDecenas <= CntDecenas + 1;

end if; end process;

end if;

end if;

CntUnidades <= CntUnidades + 1;

2.3.6. Registros de la visualizacin. Los registros empleados para implementar la funcin de congelacin de la visualizacin se describen mediante el siguiente proceso.
process(clk,rst) begin if(rst='0') then Unidades <= (others => '0'); Decenas <= (others => '0'); elsif (clk'event and clk='1') then if (actualizar = '1') then Unidades <= std_logic_vector(CntUnidades); Decenas <= std_logic_vector(CntDecenas); end if; end if; end process;

Si la seal actualizar correspondiente a la salida de la FSM est a uno (visualizacin no congelada) las seales Unidades y Decenas reflejan el valor de cuenta en cada flanco activo de la seal de reloj. Las cuales se conectan a las entradas de los decodificadores BCD a 7 segmentos. Hay que destacar que estas seales son de tipo std_logic_vector mientras que las seales de cuenta CntUnidades y CntDecenas son de tipo unsigned. Por este motivo es preciso emplear una conversin cast en la asignacin. 2.3.7. Mquina de estados. La figura 1.11 muestra el diagrama de bloques de una mquina de estados. Como se aprecia sta se describe mediante sendos procesos: uno para controlar las transiciones entre estados y otro para generar la salida de la mquina.

Proceso sncrono Prximo estado Clculo del prximo estado Lgica combinacional Reloj

Entradas asncronas

Entradas (slo para tipo Mealy) Estado actual

Entradas

Elementos de memoria

Clculo de las salidas. Lgica combinacional

Salidas

Lgica secuencial

Proceso combinacional

Figura 11: Estructura de una mquina de estados. Para representar el estado de la mquina se ha definido el tipo enumerado stateFSM que puede tomar los valores correspondientes a dichos estados. El valor del estado actual de la FSM se almacena en la seal state. La salida de la FSM es la seal actualizar que toma el valor cero cuando la cuenta est congelada. Para declarar estas seales se emplea el siguiente cdigo:
-14-

Diseo en VHDL para FPGAs.


type stateFSM is ( S1, -- RunningWaitingOnPush S2, -- RunningWaitingOnRelease S3, -- FrozenWaitingOnPush S4); -- FrozenWaitingOnRelease signal state: signal actualizar: stateFSM; std_logic;

R. Mateos, I. Fernndez. P. Martn

El proceso empleado para modelar las transiciones entre estados es sensible a las seales de control asncronas (rst) y reloj (clk). La decodificacin del siguiente estado en funcin del
estado actual y las entradas se realiza mediante una sentencia case. El cdigo VHDL de este proceso es el siguiente
-- Maquina de estados de control del lapso: -Control del cambio de estados. process(clk,rst) begin if(rst='0') then state <= RunningWaitingOnPush; elsif (clk'event and clk='1') then case state is when S1 => if (lapso = '1') then state <= S1; else state <= S2; end if; when S2 => if (lapso = '0') then state <= S2; else state <= S3; end if; when S3 => if (lapso = '1') then state <= S3; else state <= S4; end if; when S4 => if (lapso = '0') then state <= S4; else state <= S1; end if; end case; end if; end process;

El proceso empleado para modelar la lgica combinacional empleada para generar las salidas es sensible al estado de la FSM. Si se tratar de una mquina de tipo Mealy en esta lista deberan declararse tambin las entradas de la FSM.
-- Maquina de estados de control del lapso: -Control de la salida. process(state) begin case state is when S2 | S3 => actualizar <= '0'; when S1 | S4 => actualizar <= '1'; end case; end process;

2.4. BANCO DE PRUEBAS.


A continuacin se proporciona el listado del fichero VHDL correspondiente al banco de pruebas empleado para validar el diseo. Se trata de una entidad sin puertos. En la parte declarativa de la arquitectura se declara el componente a verificar (crono) y un conjunto de seales correspondientes a cada uno de los puertos de dicho componente. stas son fcilmente reconocibles porque tienen el sufijo _tb.

-15-

Ingeniera Electrnica.
library IEEE; use ieee.std_logic_1164.all;

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

entity testbench is generic ( PUSHTIME: time := 500 ns; -- Tiempo de duracin de una tecla. RSTTIME: time := 10 ns; -- Tiempo de activacin del reset. Tclk: time := 100 ns); -- Periodo de la seal de reloj. end testbench; architecture simula of testbench is -- Declaracin del componente crono. component crono port ( lapso: in std_logic; rst: in std_logic; clk: in std_logic; DisplayUnidades: out std_logic_vector(6 downto 0); DisplayDecenas: out std_logic_vector(6 downto 0)); end component; -- Seales auxiliares para de excitacin para el banco de pruebas. signal lapso_tb: std_logic; signal rst_tb: std_logic:='0'; signal clk_tb: std_logic:='0'; signal DisplayUnidades_tb: std_logic_vector(6 downto 0); signal DisplayDecenas_tb: std_logic_vector(6 downto 0);

begin

-- Instantacin del componente crono. uut : crono port map ( lapso => lapso_tb, rst => rst_tb, clk => clk_tb, DisplayUnidades => DisplayUnidades_tb, DisplayDecenas => DisplayDecenas_tb); -- Generacin de la seal de reset. rst_tb <= '1' after RSTTIME; -- Generacin de la seal de reloj. clk_tb <= not clk_tb after Tclk/2; -- Proceso principal control de la excitacion. process --------------------------------------------------------- PULSAR: Simula la pulsacin del pulsador de lapso -- Parmetros de entrada: -No tiene. --------------------------------------------------------procedure pulsar is begin lapso_tb <= '0'; wait for PUSHTIME; lapso_tb <= '1'; wait for PUSHTIME; end pulsar; begin -- Valor inicial de los estmulos. lapso_tb <= '1'; -- Secuencia de operacin. wait for 1 ms; pulsar; wait for 10 ms; pulsar; wait for 10 ms; pulsar; -- Termina la simulacin. assert FALSE report "Finalizacion controlada de la simulacion" severity failure; end process; end simula;

El control de la introduccin de estmulos propiamente dicha se realiza mediante un proceso. En l se declara un procedimiento para cada una de las acciones a llevar a cabo en la verificacin del diseo. En este ejemplo el procedimiento pulsar reproduce la pulsacin de la tecla lapso. En el cuerpo del proceso se controla el instante en que se realiza cada accin (ejecucin del proceso asociado) mediante sentencias wait for. Notese que este proceso no tiene lista de sensibilidades por lo que se estara ejecutando siempre. Para controlar la finalizacin de la simulacin desde el propio banco de pruebas se emplea la sentencia assert.

2.5. FICHERO

CNF_FUNCIONAL.VHD

-16-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Co el fn de que el testbench creado pueda ser utilizado tanto para realizar una simulacin funcional como temporal se deben crear sendas configuraciones, que nos permitan seleccionar arquitecturas diferentes para el componente crono. En el caso de realizar la simulacin funciona, para el componente cronol instanciado en el testbench, se debe se debe seleccionar la arquitectura rtl . El cdigo del archivo de configuracin es el siguiente:
configuration funcional of testbench is for simula for dut : crono use entity work.crono(rtl); end for; end for; end funcional ;

Todas las cuestiones anteriores referidas a la configuracin de componentes son innecesarias si a la hora de referenciar el componente crono en el testbench, se utiliza la referencia a componente de VHDL-93, en la cual se puede referenciar un componente sin ser previamente declarado en la parte declarativa de la arquitectura y en la cual puede especificarse la entidad y la arquitectura a usar. En el caso de utilizar esta alternativa ser necesario crear dos archivos de testbench, uno para realizar la simulacin funcional y otro para la temporal, si bien el contenido sera el mismo. La nica diferencia estara en la instanciacin del componente, as en el testbench de para la simulacin funcional se pondra:
dut : entity work.crono(rtl) port map ( lapso => lapso_tb, rst => rst_tb, clk => clk_tb, DisplayUnidades => DisplayUnidades_tb, DisplayDecenas => DisplayDecenas_tb);

El listado completo del testbench para realizar la simulacin temporal utilizando la anterior declaracin de componente se encuentra en el archivo tb_funcional.vhd. Tambin se aporta un nuevo scrip para la compilacin de todo el diseo, caso de utilizar el anterior testbench. Dicho archivo scrip es compila2.do. As mismo, se aade el archivo sim_funcional2.do para realizar la simulacin funcional.

3. SIMULACIN FUNCIONAL DEL DISEO.


3.1. INTRODUCCIN.
Para verificar la validez del diseo realizado se realizar una simulacin de funcional (tambin denominada de comportamiento o RT) empleando para ello el simulador ModelSim de Mentor Graphics. Para ello arranque el simulador seleccionando
Inicio Programas ModelSim SE EE ModelSim

En ese momento se muestra la pantalla que aparece en la figura 1.12.

-17-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Figura 12: Pantalla del simulador VHDL.

Este simulador se puede controlar mediante una interface grfica de usuario basada en mens y cajas de dilogo desplegables o bien mediante una lnea de comandos. En este tutorial se explicar el uso del simulador mediante comandos. Esta decisin se basa en el hecho de que el interface de usuario puede variar de una versin a otra, no ocurriendo esto con los comandos. Concretamente para realizar este tutorial se ha empleado la versin 5.5c, por lo que algunas de las ventanas mostradas pueden variar ligeramente. La secuencia de comandos a emplear para realizar una simulacin se pueden almacenar en un fichero de script. Conceptualmente los ficheros de scripts son similares a los ficheros de proceso por lotes de un sistema operativo (por ejemplo .bat para DOS). Se les suele asignar la extensin .do. Para ejecutar un fichero de script se emplea el comando do cuya sintaxis es:
do <nombre_fichero_script>

La posibilidad de almacenar estas secuencias de comandos en ficheros de script permite reutilizarlos en los distintos tipos de simulacin a realizar (funcional, post-implementacin y temporal) durante el flujo de diseo VHDL para FPGAs. 3.1.1. Libreras. Las libreras son directorios que contienen unidades de diseo compiladas. Estas unidades de diseo pueden ser primarias o secundarias. Las unidades de diseo primarias (entidades, declaraciones de paquetes y configuraciones) almacenadas en una librera deben tener un nombre nico. Por otro lado las unidades de diseo secundarias (arquitecturas y cuerpos de paquetes) pueden tener nombres comunes. Por ejemplo, las arquitecturas de dos entidades distintas pueden tener el mismo nombre. Este simulador clasifica las libreras en dos tipos: libreras de trabajo y libreras de recursos. Todo diseo dispone de una nica librera de trabajo que por defecto se denomina work, donde se almacenan una vez que se han compilado las unidades de diseo descritas en los ficheros fuente del
-18-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

diseo. La librera de trabajo debe crearse antes de compilar los ficheros fuente del diseo. Por otro lado las libreras de recursos contienen unidades de diseo a las que se puede hacer referencia desde diseo que se est compilando. Estas libreras se declaran mediante las sentencias library y use. As para nuestro ejemplo, la entidad y arquitectura del cronmetro se almacena en la librera work mientras que el componente OSC4 se encuentra almacenado en la librera unisim. Para crear una librera se utiliza el comando vlib. La sintaxis de este comando es:
vlib <library_name>

donde <library_name> es el nombre de la librera. Este comando crea el directorio asociado a dicha librera en el directorio de trabajo actual. Una vez creada la librera se pueden proceder a compilar los ficheros fuente VHDL que contienen la descripcin de las unidades de diseo que se almacenarn en dicha librera. Para ello se emplea el comando vcom. La sintaxis resumida de este comando es:
vcom [-93] [-work <nombre_librera>] <fichero1>.vhd <fichero2>.vhd ...

El parmetro -93 indica que se emplee el la versin 93 de VHDL frente a la 87. Si no se especifica este parmetro se emplea la versin especificada mediante la opcin Options Compile... de la barra de mens. Mediante el parmetro -work se especifica la librera destino en la que se almacenar el cdigo compilado. Si no se especifica este parmetro por defecto se almacena en la librera work. Recuerdese que la librera destino debe haber sido creada con anterioridad y en caso de que no se encuentre en el directorio actual haber sido hecha visible mediante el comando vmap. Por ltimo se especifican los ficheros VHDL a compilar. stos se compilan en el orden de aparicin. El orden en que se especifican los ficheros fuente depender de las dependencias existentes entre las unidades de diseo descritas en ellos. Segn esto se debe compilar: ! ! ! ! ! ! La entidad antes que la arquitectura. La declaracin del paquete antes que el cuerpo de ste. Las unidades de diseo antes de las referencia a ellas. Los paquetes antes que las entidades/arquitecturas que los utilicen. Las entidades/Configuraciones antes de las arquitecturas a que hacen referencia. Las configuraciones se compilan las ltimas.

Puede ocurrir que el directorio donde se almacena una librera no este contenido en el directorio de trabajo actual. Esta es una situacin tpica que se da cuando se pretenden utilizar unidades de diseo compiladas con anterioridad para otro diseo en el diseo actual. Por ejemplo, las libreras unisim, simprim y xilinxcoregenlib se reutilizarn en cada nuevo diseo para FPGAs de Xilinx. Para gestionar estas situaciones ModelSim asigna a cada librera un nombre fsico y un nombre lgico. El nombre fsico corresponde al path del directorio donde se almacenan las unidades de diseo compiladas. El nombre lgico es la denominacin que recibe la librera cuando se hace referencia a ella desde el simulador o desde el cdigo fuente VHDL, por ejemplo mediante la sentencia use. Cuando una librera se encuentra almacenada en el directorio de trabajo actual el nombre fsico coincide con el nombre lgico. En caso contrario es preciso asignar a la librera un nombre lgico mediante el comando vmap. A este proceso se le denomina mapeado. La sintaxis de este comando es:
vmap <nombre_logico> <path_del_directory> -19-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Otros comandos empleados para la gestin de libreras son vdir y vdel que se emplean respectivamente para mostrar el contenido de una librera y para borrar elementos de sta. La sintaxis de vdir es:
vdir [-lib <nombre_librera>]

Si se emplea el comando sin parmetros se muestra el contenido de la librera work. Por otro lado la sintaxis del comando vdel es:
vdel [-lib <nombre_librera>] [-all |<unidad_de_diseo>]

donde <nombre_librera> es la librera de donde se desea borrar la unidad de diseo en cuestin. Si no se especifica la librera se toma por defecto la librera work. En cuanto a las unidades de diseo a borrar stas se pueden especificar individualmente o bien borrar todas ellas utilizando el parmetro -all. En este ltimo caso se borra incluso el directorio correspondiente a la librera por lo que si se desean compilar con posterioridad nuevos ficheros fuente sobre sta ser preciso crearla de nuevo con el comando vlib. Al igual que ocurre en los compiladores de C, los cuales proporcionan en la librera de soporte del sistema las funciones definidas por ANSI C, los simuladores VHDL suelen disponer de una serie de libreras predefinidas que no es necesario compilar cada vez que se realiza un nuevo diseo. En el caso concreto de ModelSim se encuentran predefinidas las siguientes libreras: ! ! ! La librera std que contiene los paquetes standard y textio. La librera IEEE que contiene paquetes aritmticos precompilados de Synopsys e IEEE. La librera vital empleada para realizar simulaciones temporales.

Estas libreras estn optimizadas para la simulacin por lo que no es recomendable que el usuario realice modificaciones de ellas. Teniendo en cuenta lo expuesto, siguiendo con nuestro ejemplo se proceder a crear las libreras VHDL de Xilinx (unisim, simprim y XilinxCoreLib) y compilarlas. Para ello cree el directorio donde se almacenarn estas libreras. Por ejemplo:
c:\VHDL_Xilinx_lib

El cdigo fuente de estas libreras se encuentra en c:\ise41\vhdl\src. Dentro de este directorio se encuentran tres subdirectorios correspondientes a cada una de las libreras citadas. Para compilar las libreras cambie el directorio actual del simulador al directorio donde se almacenarn ejecutando desde la consola de ModelSim el comando:
cd c:/VHDL_Xilinx_lib

Notese que la sintaxis empleada por ModelSim para especificar la jerarqua de un directorio es la misma que la de Unix, ya que las primeras versiones de este simulador se desarrollaron para dicho sistema operativo. Para crear estas libreras se deben ejecutar los siguientes comandos desde la consola de ModelSim: ! Compilacin de la librera unisim.
vlib unisim vcom -work unisim C:/ise41/vhdl/src/unisims/unisim_VPKG.vhd -20-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

vcom -work unisim C:/ise41/vhdl/src/unisims/unisim_VCOMP.vhd vcom -work unisim C:/ise41/vhdl/src/unisims/unisim_VITAL.vhd vmap unisim c:/VHDL_Xilinx_lib/unisim

Compilacin de la librera simprim.


vlib vcom vcom vcom vmap simprim -work simprim C:/ise41/vhdl/src/simprims/simprim_Vpackage.vhd -work simprim C:/ise41/vhdl/src/simprims/simprim_Vcomponents.vhd -work simprim C:/ise41/vhdl/src/simprims/simprim_VITAL.vhd simprim c:/VHDL_Xilinx_lib/simprim

Compilacin de la librera XilinxCoreLib. vlib XilinxCoreLib vcom -work XilinxCoreLib C:/ise41/vhdl/src/XilinxCoreLib/mvlutil.vhd vcom -work XilinxCoreLib C:/ise41/vhdl/src/XilinxCoreLib/mvlarith.vhd vcom -work XilinxCoreLib C:/ise41/vhdl/src/XilinxCoreLib/XilinxCoreLib.vhd vmap XilinxCoreLib c:/VHDL_Xilinx_lib/XilinxCoreLib

Para facilitar el trabajo junto con el cdigo fuente del diseo se proporcionan un fichero script xilinx_lib.tcl que permite realizar las operaciones anteriores de una manera ms simple. La ejecucin del script se realiza mediante el comando source.:
source xilinx_lib.tcl

una vez ejecutado aparece la ventana mostrada en la figura 1.13. Se deben seleccionar las opciones que aparecen en dicha figura, pudiendose variar el subdirectorio destino.

Figura 13: Configuracin de las libreras. La creacin de las estas libreras slo se realiza una vez, es decir, no es preciso compilar estas libreras para cada nuevo diseo a realizar. Ademas el archivo de inicializacin de ModelSim es modificado de forma que dichas libreras sern siempre visibles para posteriores diseos.

3.2. MANEJO DEL SIMULADOR.


Los pasos a dar para realizar una simulacin son los siguientes. Creacin del proyecto. Creacin de nuevas libreras y mapeado de las libreras a reutilizar. Compilacin del cdigo fuente.
-21-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Carga de la unidad de diseo a simular. Definicin de puntos de prueba. Avance y detencin de la simulacin. Introduccin de estmulos. Anlisis de resultados. Finalizacin de la sesin de simulacin.

3.2.1. Creacin del proyecto. Al igual que ocurre con otros entornos de desarrollo ModelSim gestiona la informacin de cada diseo mediante un proyecto, facilitando de esta forma su gestin. Un proyecto se compone de: ! ! ! ! Un directorio de trabajo en el que se almacenan los distintos ficheros generados durante la compilacin y simulacin de un diseo. Los ficheros fuente VHDL del diseo. Las libreras creadas. La configuracin empleada en el simulador.

Esta informacin se almacena en un fichero con el mismo nombre que el proyecto y la extensin .mpf. Las operaciones que se pueden realizar con un proyecto son crearlo, abrirlo, cerrarlo o borrarlo. Estas se realizan mediante las opciones New, Open, Close y Delete del men File. Para crear el proyecto empleado para realizar la simulacin funcional del diseo del ejemplo seleccione la opcin File New Project de la barra de mens. En ese momento se mostrar en la pantalla la ventana Create Project. Configure las opciones de estas ventana tal y como se muestra la figura 1.14. Con esto se crear automticamente el subdirectorio behavioral dentro del directorio c:\tutorial. Adems crea automticamente la librera work definiendola como la librera de trabajo para este nuevo diseo. Por tanto, el path de esta librera ser c:/tutorial/behaviral/work.

Figura 14: Ventana de creacin de proyecto. Si bien el empleo de proyectos no es obligatorio su uso facilita la gestin del diseo. En caso de no desear emplear esta facilidad habra que ejecutar los siguientes comandos:
cd c:/tutorial mkdir behavioral cd behavioral vlib work -22-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

3.2.2. Creacin de nuevas libreras y mapeado de las libreras a reutilizar Si se desea compilar alguno de los ficheros fuente sobre alguna librera distinta de work ser preciso crearla previamente con el comando vlib. De igual forma si dentro de nuestro cdigo se hace referencia a alguna librera creada con anterioridad ser preciso mapearla mediante el comando vmap. Claro est que esto no es aplicable a las libreras predefinidas del simulador. As, para hacer visibles las libreras de Xilinx en un diseo se emplearan los siguientes comandos:
vmap unisim c:/VHDL_Xilinx_lib/unisim vmap simprim c:/VHDL_Xilinx_lib/simprim vmap XilinCoreLib c:/VHDL_Xilinx_lib/XilinCoreLib

Conviene aclarar que cuando se realiza el mapeado de una librera, el simulador almacena esta informacin en el fichero de descripcin del proyecto, de forma que se mantenga esta configuracin la prxima vez que se abra el proyecto. El simulador considera esta configuracin como un aspecto general siendo aplicable a todos aquellos proyectos que se creen a partir de ese momento. Para ello almacena la informacin de mapeado en el fichero de configuracin general denominado modelsim.ini. Este fichero se encuentra en el directorio donde ha sido instalado ModelSim. En tal caso, en dicho fichero deben aparecer las siguientes lneas:
simprim = C:/VHDL_Xilinx_lib/simprim unisim = C:/VHDL_Xilinx_lib/unisim XilinCoreLib = C:/VHDL_Xilinx_lib/XilinCoreLib

En el caso de este tutorial no es necesario mapear la libreras de Xilinx ya que esa labor se ha realizado con la ejecucin del scrip xilinx_lib.tcl. Otra forma sencilla de verificar si las libreras son visibles para el proyecto actual es mediante la opcin Design Browse Libraries de la barra de mens tal y como muestra la figura 1.15. En caso de que no aparezcan las libreras citadas ser preciso realizar el mapeado de stas.

Figura 15: Ventana de listado de libreras. 3.2.3. Compilacin del cdigo fuente.

-23-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Una vez creado el proyecto se proceder a la compilacin de los ficheros VHDL que forman parte del diseo. Por defecto las unidades de diseo se almacenarn en la librera work. Si un fichero VHDL proporciona una unidad de diseo que ser utilizada en otro fichero el primero de ellos debe compilarse en primer lugar. Para compilar los ficheros fuente del diseo se han de ejecutar los siguientes comandos desde la consola de ModelSim:
vcom vcom vcom vcom vcom -93 -93 -93 -93 -93 bcd2seg.vhd prescaler.vhd crono.vhd testbench.vhd cnf_funcional.vhd

El fichero script compila.do recoge estos comandos. Por tanto se debe ejecutar el comando:
do compila.do

Durante la compilacin el simulador muestra en la consola informacin referente a la evolucin de sta. Si aparecen errores, la descripcin de estos se muestra en color rojo. Haciendo doble click sobre la lnea de error se muestra automticamente la lnea del fichero fuente que produjo este error en la ventana de cdigo fuente. En la figura 1.16 aparece un ejemplo de sto.

Figura 16: Visualizacin automtica de errores en el cdigo fuente.

3.2.4. Carga de la unidad de diseo a simular Para poder simular el diseo realizado es preciso cargarlo en el simulador. Para ello se emplea el comando vsim. El formato resumido de este comando es:
vsim [-lib <nombre_librera>] [-t [mltiplo]<unidades_tiempo>] -24-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

[-sdfmin | -sdftyp | -sdfmax <instancia>=<fichero_sdf>] <entidad> [<arquitectura>] | <configuracin>

Como se puede observar todos los parmetros son opcionales excepto el ltimo de ellos que indica la unidad de diseo superior. Este ltimo indica la entidad a simular, siendo posible especificar tambin la arquitectura concreta a emplear. Esto resulta especialmente til cuando la entidad dispone de varias arquitecturas. Por ejemplo si se deseara simular nicamente el decodificador bcd a 7 segmentos el comando a emplear sera:
vsim work.BCD2SEG inside

o bien simplemente
vsim BCD2SEG

La librera que contiene la unidad de diseo a simular tambin se puede especificar mediante el parmetro opcional -lib. Si no se especifica, por defecto se supone que dicha unidad se encuentra almacenada en la librera de trabajo. El parmetro -t indica la resolucin de la simulacin. Dicha resolucin se especifica en unidades de tiempo segn el formato indicado en la tabla 1.1. Adicionalmente puede emplearse un factor multiplicador siendo los valores admisibles 1, 10 o 100. Si no indica la resolucin del simulador, por defecto este trabaja con una resolucin de 1 ns. Tabla 1.1: Nomenclatura empleada para especificar unidades de tiempo. Unidades fs ps ns us Valor 10-15 sg 10-12 sg 10-9 sg 10-6 sg Unidades ms sec min hr Valor 10-3 sg segundos minutos horas

Para el caso de una simulacin temporal de un diseo para FPGAs teniendo en cuenta que los retardos internos se expresan con una resolucin de 0.1 ns la opcin a emplear para fijar la resolucin sera -t 100ps. Notese que no hay espacios en blanco entre el multiplicador y las unidades. Por ltimo el parmetro -sdfxxx slo se usa en simulaciones temporales, empleandose para especificar el fichero sdf que contiene la retroanotacin de retardos. Por este motivo su explicacin detallada se pospondr al apartado destinado a simulaciones temporales. Segn lo expuesto, una vez compilados los ficheros fuente del diseo de nuestro ejemplo se puede proceder a cargar la unidad de diseo a simular. Para nuestro ejemplo sta es la configuracin ConfBehavioral, por lo que el comando a emplear ser:
vsim cnf_funcional

3.2.5. Seleccin de puntos de prueba.


La verificacin del diseo mediante simulacin se basa en observar los distintos elementos que aparecen en ste. Por analoga con un simulador digital clsico a los puntos del circuito a observar (seales) los denominaremos puntos de prueba, si bien en diseos descritos en VHDL la variedad es ms amplia: variables, seales, procesos en ejecucin, etc.Tal -25-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

y como muestra la figura 1.17 el simulador define un total de ocho ventanas destinadas a representar los distintos tipos de elementos. Estas ventanas son: ! ! ! ! ! ! ! structure. Muestra la estructura jerrquica del diseo en forma de rbol. En nivel seleccionado en esta ventana afectar al contenido de las ventanas de formas de onda, variables, etc. source. Muestra la el cdigo fuente del diseo. Se suele emplear para ejecutar el cdigo paso a paso. signal. Muestra las seales contenidas en el nivel seleccionado en la ventana de estructura. process. Proporciona informacin del estado de ejecucin de los procesos. wave. Permite representar los cronogramas de la evolucin de las seales y variables del diseo. dataflow. La ventana de flujo de datos permite realizar un seguimiento grfico de la conexin de procesos mediante las seales del diseo. list. La ventana de listado permite observar los resultados de la simulacin de forma tabular y reflejando los ciclos delta

Figura 17: Ventanas del simulador.


Para abrir una de estas ventanas se emplea el comando view cuyo formato es: view <nombre_ventana> Este comando admite el carcter comodn *. As el siguiente comando abre todas las ventanas citadas: view * -26-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

La descripcin detallada del uso de todas las ventanas queda fuera de los objetivos de este texto. Por este motivo slo se expondr el uso de la ventana de formas de onda, al ser ste el mtodo ms empleado para depurar sistemas digitales mediante simulacin. Para abrir esta ventana seleccione la opcin View Wave de la barra de mens, o bien ejecute el comando: view wave A continuacin es preciso seleccionar las seales a visualizar. Si el nmero de seales a visualizar es elevado esta operacin puede ser un tanto tediosa. En ese caso se puede optar por realizar esta operacin mediante el interface grfico. Para ello es preciso abrir las ventanas de estructura y de seales. La primera de ellas nos servir para navegar por la estructura jerrquica del diseo, mientras que la segunda nos permitir seleccionar las seales a aadir a la ventana de formas de onda. Para abrir la ventana de estructura seleccione la opcin View Structure de la barra de mens, o bien ejecute el comando: view structure De forma similar, para abrir la ventana de seales seleccione la opcin View Signal de la barra de mens, o bien ejecute el comando: view signal Tal y como muestra la figura 1.18 al seleccionar un nivel en la ventana de estructura, se muestran todas las seales contenidas en dicho nivel sobre la ventana de formas de onda.

Figura 18: Seleccin de las seales de un determinado nivel jerrquico.


Una vez mostradas las seales de inters en la ventana de seales se proceder a aadirlas a la ventana de formas de onda. Para ello se seleccionan las seales en cuestin en la ventana de seales y a continuacin se elige la opcin View Wave Selected Signals de la barra de mens. O de una forma ms simple, se seleccionan y se arrastran hasta la ventana wave. Una vez finalizado este proceso la ventana de formas de onda presenta el aspecto mostrado en la figura 1.19.

-27-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Figura 19:

Ventana wave una vez seleccionadas las seales a visualizar.

Tambin es posible representar en la ventana de formas de onda la evolucin de las variables de los procesos. Para ello es preciso que el proceso al que pertenece la variable a visualizar est etiquetado. Esta etiqueta sirve como elemento identificador dentro de la ventana de estructura. El proceso a seguir es el mismo que el utilizado para seleccionar las seales, pero utilizando la ventana de variables. El color de las seales, el formato numrico utilizado en el caso de los vectores, etc. se puede fijar mediante las distintas opciones del menu sensible al contexto que aparece al seleccionar una seal determinada y pulsar a continuacin el botn derecho del ratn (o con Format de la barra de mens). La configuracin utilizada en la ventana de formas de onda puede almacenarse en un fichero de scripts denominado wave.do para volverla a utilizar en posteriores sesiones de simulacin (por ejemplo cuando se realice la simulacin temporal). Para ello seleccione la opcin File Save Format de la barra de mens. Bsicamente, este fichero contiene comandos del tipo add wave, los cuales se utilizan para aadir seales o variables a la ventana de formas de onda. Su sintaxis resumida es: add wave [-<format>] [-<radix>] <nombre_elemento> El parmetro <nombre_elemento> especifica el nombre de la variable o seal a visualizar. Si dicho elemento no se encuentra en la entidad superior de la jerarqua se debe indicar el camino completo dentro de sta. En el caso de las variables, se especificar el camino hasta la arquitectura donde reside el proceso que contiene la variable. El parmetro opcional radix especifica la base numrica con que se representan los vectores. Los valores que puede tomar este parmetro son binary, octal, decimal (o signed), unsigned, hexadecimal, ascii, symbolic o default. Puesto que estos nombres son suficientemente ilustrativos hay poco que aadir a este respecto. Tan slo indicar, que la opcin -symbolic se emplea con tipos enumerados. Si no se indica nada se representa segn la base numrica fijada por defecto (-default) en las opciones del simulador. El parmetro opcional format indica el formato de representacin (numrico o grfico) a emplear de los vectores. Los valores que puede tomar son literal, logic, analog-step, analog-interpolated y analog-backstep. Normalmente esta opcin no se suele emplear, dejando que estos los vectores se representen en formato numrico. Las tres ltimas opciones permiten -28-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

representar la secuencia de valores que toma el vector como las muestras de una seal analgica digitalizada. Esto es especialmente til en la implementacin de sistemas de tratamiento digital de seal. La figura 1.20 muestra un ejemplo de esto.

Figura 20: Ejemplo de representacin analgica de seales.


Una descripcin ms detallada de los formatos analgicos, como de los digitales, se encuentra en el manual del simulador, al que se puede acceder desde Help de la barra de mens. En el ejemplo de diseo considerado, para analizar el funcionamiento del sistema se van a observar los puertos del cronmetro, las seales de cuenta (clkla y EN1HZ) y el estado de la presentacin (seal actualizar). A la hora de especificar una seal es preciso indicar el camino completo dentro de la jerarqua. Segn esto los comandos a ejecutar seran:

add add add add add add add add add add

wave wave wave wave wave wave wave wave wave wave

/testbench/rst_tb /testbench/clk_tb /testbench/dut/en1hz /testbench/lapso_tb /testbench/dut/state /testbench/dut/actualizar -unsigned /testbench/dut/cntunidades -unsigned /testbench/dut/cntdecenas /testbench/displayunidades_tb /testbench/displaydecenas_tb

Tal y como se ha indicado una forma sencilla de obtener estos comandos es realizar una seleccin manual y a continuacin generar el fichero de configuracin wave.do, de este ltimo se extraen las variables que queremos visualiza, y se aaden al archivo scrip para la simulacin. Tngase presente que el formato de los comandos add wave tienen diferente contenido al mostrado anteriormente, por lo que, si el usuario lo considera pertinente puede retocarlos, para tener una sintaxis ms corta, si bien la semntica sigue siendo la misma. A continuacin se muestran estos comandos tal y como se encuentran en el archivo wave.do.

-29-

Ingeniera Electrnica.
add add add add add add add add add add wave wave wave wave wave wave wave wave wave wave -noupdate -noupdate -noupdate -noupdate -noupdate -noupdate -noupdate -noupdate -noupdate -noupdate -format -format -format -format -format -format -format -format -format -format

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.


Logic /testbench/rst_tb Logic /testbench/clk_tb Logic /testbench/dut/en1hz Logic /testbench/lapso_tb Literal /testbench/dut/state Logic /testbench/dut/actualizar Literal -radix unsigned /testbench/dut/cntunidades Literal -radix unsigned /testbench/dut/cntdecenas Literal /testbench/displayunidades_tb Literal /testbench/displaydecenas_tb

Los comandos utilizados para cargar el diseo a simular y configurar la ventana de formas de onda se recogen en el script sim_funcional.do proporcionado.

3.2.6. Avance y detencin de la simulacin.


Para provocar un avance de la simulacin se emplea el comando run, siendo su sintaxis: run[<magnitud>[<unidades_tiempo>]] | <modo> El tiempo a avanzar en la simulacin se puede especificar de varias formas, de acurdo a una serie de modos predeterminados. Una primera especificacin del tiempo de simulacin es: run[<magnitud>[<unidades_tiempo>]] En este formato se avanza el tiempo especificado por el parmetro. Este tiempo se da como un valor numrico seguido de unas unidades de tiempo empleando para ello el formato descrito en la tabla 1.1. Si no se especifican las unidades se entiende que el tiempo viene expresado en la resolucin del simulador (por defecto es 1ns). Por ejemplo, el siguiente comando provocara un avance en la simulacin de 400 ns: run 400ns Otra forma de emplear el comando run responde al formato: run<modo> donde el parmetro <modo> puede ser uno de los siguientes valores: ! ! ! ! ! -all Ejecuta la simulacin indefinidamente hasta que sta se detenga debido a un punto de ruptura o a un error de simulacin (sentencia assert). -step Avanza la simulacin hasta la siguiente sentencia VHDL. -stepover Es exactamente igual que la anterior salvo que las llamadas a procedimientos o funciones se tratan como una nica sentencia, ejecutandose de una vez. -continue Continua la simulacin desde el punto en que se detuvo debido a un punto de ruptura. -next Ejecuta la simulacin hasta el siguiente evento.

Segn esto el comando: run -all

-30-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

ejecutara la simulacin del ejemplo hasta que se detuviera debido a la lnea del fichero testbench:
assert FALSE report "Finalizacion controlada de la simulacion" severity failure;

Para reiniciar la simulacin, volviendo el tiempo a 0 ns, e iniciar una nueva simulacin se emplea el comando restart. Al ejecutar este comando aparece la ventana mostrada en la figura 1.21. En ella se puede seleccionar qu elementos mantendrn la configuracin fijada durante la sesin de simulacin actual.

Figura 21: Ventana Restart.


Si durante la sesin de simulacin se descubre un error de diseo que obliga a modificar el cdigo fuente ser preciso finalizar la simulacin mediante el comando quit -sim. A continuacin se modifica el cdigo fuente, se compila y se vuelve a cargandolo de nuevo tal y como se ha descrito.

3.2.7. Introduccin de estmulos.


Normalmente los estmulos del diseo se introducen mediante el cdigo del fichero de banco de pruebas o testbencs. Sin embargo en un diseo tpico el sistema est compuesto por varios mdulos ms sencillos que se instanciarn en el diseo final. Antes de obtener el diseo final ser preciso validar los mdulos que lo componen. La realizacin de un banco de pruebas para cada uno de estos mdulos tan sencillos puede resultar una tarea tediosa. Para solventar esta situacin se puede emplear el comando force, que permite introducir estmulos sobre las seales resueltas del diseo de una forma sencilla. La sintaxis general de este comando es: force <nombre_seal> <valor1> <tiempo1>, <valor2> <tiempo2> ... Con este formato se introducen los estmulos especificados en pares (valor, instante de tiempo) para la seal en cuestin. Cuando se trata de una seal interna en el nombre se debe especificar el camino completo en la jerarqua del diseo. Los valores a asignar a una deben ajustarse al tipo de datos de misma. Los instantes de tiempo pueden expresarse en formato relativo al instante actual de simulacin o en valor absoluto respecto al origen de tiempos (t=0). En este ltimo caso se ha de aadir el prefijo @. Por defecto las unidades en que se expresan los tiempos coincide con la resolucin del simulador (ns). Existe un conjunto de parmetros adicionales que permiten introducir estmulos peridicos. Estos son: -repeat <periodo> Repite el comando force con el periodo de tiempo especificado. -31-

Ingeniera Electrnica. -cancel <tiempo>

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos. Cancela el comando force una vez transcurrido el tiempo especificado.

A continuacin se muestran varios ejemplos del uso de este comando.


force clr 0 force bus1 01XZ 100 ns force bus2 16#4F @200 Fuerza clr a 0 en el instante actual de simulacin. Fuerza bus1 a 01XZ 100 ns despus del instante actual de simulacin. Fuerza bus2 a 4Fh 200 unidades de tiempo (especificadas por la resolucin de simulacin) desde el inicio de sta. Genera una seal de periodo 50 ns con un ciclo de trabajo del 50% Fuerza clk a 0 en el instante actual de simulacin, 20 unidades de tiempo despus pasa a 1. Esto se repite cada 50 unidades de tiempo hasta alcanzar 1000 unidades de tiempo. Por tanto el siguiente 1 ocurrir en la unidad de tiempo 70.

force clk 0 0, 1 25 -repeat 50 force clk 0 0, 1 20 -repeat 50 -cancel 1000

Segn lo expuesto para validar de forma individual el mdulo prescaler se empleara la siguiente secuencia de comandos:
vsim work.prescaler add add add add wave wave wave wave /prescaler/aclr /prescaler/clk /prescaler/q /prescaler/thresh0

force aclr 1 0, 0 20 force clk 0 0,1 10 -repeat 20

Como se ha comentado este comando se emplea para aplicar estmulos a seales resueltas. En el caso de que se aplique un estmulo a una seal interna del diseo, la funcin de resolucin determinar el estado que toma esta seal. Existe un modo de operacin de este comando denominado modo congelado que permite imponer un valor a una seal interna. Esto es especialmente til para reducir el tiempo de simulacin de un diseo. As, en el diseo considerado la salida del sistema cambia cada segundo, por lo que para verificar el diseo se precisara mucho tiempo de simulacin. Para reducirlo se forzar la salida del prescaler (seal EN1Hz) a 1 mediante el comando: force -freeze testbench/dut/EN1HZ 1 En el caso de utilizar la opcin freeze con un comando force, para desactivarla se debe ejecutar en comando noforce. Por ejemplo para el caso anterior se utilizara: noforce testbench/dut/EN1HZ 1

Resumiendo, para realizar la simulacin del diseo se introducir la secuencia de comandos que se indica a continuacin. Esta secuencia se encuentra almacenada en el fichero de script sim_funcional.do proporcionado.

-32-

Diseo en VHDL para FPGAs. # scrip de simulacion destroy .wave vsim work.cnf_funcional # Definicion de seales a visualizar. add add add add add add add add add add wave wave wave wave wave wave wave wave wave wave

R. Mateos, I. Fernndez. P. Martn

/testbench/rst_tb /testbench/clk_tb /testbench/dut/en1hz /testbench/lapso_tb /testbench/dut/state /testbench/dut/actualizar -unsigned /testbench/dut/cntunidades -unsigned /testbench/dut/cntdecenas /testbench/displayunidades_tb /testbench/displaydecenas_tb

run 400 ns force -freeze testbench/dut/EN1HZ 1 run 50 us Para realizar la simulacin funcional del diseo, es algo tan sencillo como ejecutar el comando: do sim_funcional.do La figura 1.22 muestra el aspecto de la pantalla de cronogramas obtenida al ejecutar el comando anterior, donde se puede comprobar el funcionamiento correcto del diseo.

Figura 22: Resultado de la simulacin del cronmetro.

3.2.8. Anlisis de resultados.


En este apartado se comentar como navegar por la ventana de cronogramas as como la realizacin de mediciones de tiempos. Para ajustar el zoom de la visualizacin se emplean las cuatro lupas que aparecen en la barra de herramientas: ! ! ! Zoom de acercamiento. Zoom de alejamiento. Amplia una zona de los cronogramas.

-33-

Ingeniera Electrnica. !

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Muestra la totalidad de los cronogramas.

Para realizar medidas de tiempo se emplean los cursores, un cursor se aade con el elemento . La primera vez que se pulsa este botn aparece el cursor principal, que tal y como muestra la figura 1.23, ste aparece como una lnea azul de trazo grueso. Los cursores se pueden situar de forma manual pulsando directamente sobre un punto de los cronogramas. En este caso el cursor se sita sobre la transicin ms prxima al punto seleccionado. Si se desean desplazar los cursores hasta la siguiente transicin de la seal seleccionada se emplean los botones las medidas de tiempos. Las mediciones de tiempo se realizan utilizando un segundo cursor, para ello se sitan el cursor principal y el secundario sobre las dos transiciones, de la misma u otra seales. Estas transiciones delimitan el tiempo a medir. El segundo cursor se aade de igual forma que el primero, mostrndose en trazo discontinuo. El tiempo medido se muestra en la parte inferior de la pantalla. Finalmente para eliminar estos cursores se emplea el botn . . Esto es especialmente til para

Figura 23: Medida de tiempos. 3.2.9. Finalizar la sesin de simulacin.


La simulacin de un diseo permite comprobar el correcto funcionamiento del mismo. Desde que se crean un diseo hasta que se van a realizar varias simulaciones hasta depurar y obtener el cdigo correcto, por lo que ser preciso finalizar la sesin de simulacin, modificar el cdigo fuente, compilar y volver a simular. Para finalizar la sesin de simulacin se emplea el comando quit -sim. Notese que el finalizar la sesin de simulacin no supone cerrar ModelSim. El uso de este comando tiene su inters cuando el cdigo VHDL hace uso de ficheros. Una prctica muy habitual es emplear fichero del cual se toma la secuencia de estmulos (vectores de test) a aplicar al diseo. Por ejemplo en el caso de sistemas de tratamiento digital de seal implementados en FPGAs, el bando de pruebas puede obtener los datos a procesar desde un fichero previamente creado mediante Matlab. De forma similar los resultados del procesamiento se pueden almacenar en un fichero de salida para su posterior anlisis. En este caso, el simulador abre el ficheros de salida al cargar la unidad de diseo a simular, manteniendo el control sobre ste por lo que no se puede acceder a su contenido hasta que no finalice la sesin de simulacin. En ese momento el fichero de salida puede abrirse con otra herramienta.

-34-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

3.3. PUNTOS DE RUPTURA.


Una de las posibilidades ms empleadas en los simuladores son los puntos de ruptura (breakpoints). ModelSim permite trabajar con dos tipos de puntos de ruptura. El primero de ellos se fija sobre las lneas de cdigo de la ventana de cdigo fuente (source). Este tipo de puntos de ruptura se asemeja al empleado por los depuradores de software. Para activar un punto de ruptura de este tipo basta con pulsar con el ratn sobre la lnea en la que queremos poner el punto de ruptura. Para desactivarlo basta con una nueva pulsacin. Cuando se ejecuta la lnea de cdigo marcada se detiene la simulacin. Esto tambin se puede realizar mediante el comando bp. El formato empleado es: bp <nombre_fichero> <nmero_de_lnea> El segundo formato, denominado condicional, se asemeja al concepto empleado por un simulador digital, permitiendo asociarlo a seales., para ello se utiliza el comando when, cuya sintaxis es: when [-label <nombre>] {<expresin_condicin>} {<accin>} El parmetro -label asigna el identificador <nombre> al punto de ruptura definido. El parmetro <expresin_condicin> define la condicin a evaluar en el punto de ruptura. Cuando esta expresin es cierta se dispara el punto de ruptura. La sintaxis de esta expresin responde al siguiente formato: subexpresin1 operador_lgico subexpresin2 operador_lgico subexpresin3... Las subexpresiones vienen dadas por operadores relacionales y atributos de deteccin de eventos. Los siguientes ejemplos muestran las situaciones admitidas. ! ! ! Igualdad. Desigualdad Deteccin de eventos: clk = 1' clk==1' bus1 /= 0000" clkEVENT

Los operadores de igualdad y desigualdad slo admiten como segundo parmetro un literal, es decir no se puede comparar el estado de dos seales. Los operadores lgicos que ligan las subexpresiones pueden ser el operador and o el operador or. En la expresin condicional se admite el empleo de parntesis para establecer la prioridad con que se evalan las distintas subexpresiones. El parmetro <accin> define la secuencia de comandos a del simulador a ejecutar cuando se dispara el punto de ruptura. Este parmetro es opcional, si no se indica la accin a realizar consiste en detener la simulacin. Por ejemplo, para simular el prescaler se podra utilizar los siguientes el siguientes comandos

force aclr 1 0, 0 20 force clk 0 0,1 10 -repeat 20 run 30 when -label pto1 { thresh0'event} {stop} run -all

-35-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

De forma, la simulacin se realizar hasta que se detecte una transicin en la seal thresh0, o lo que es lo mismo cuando thresh0 pase a 1'. Para borrar un punto de ruptura de este tipo se emplea el comando nowhen, cuya sintaxis es: nowhen <identificador> Por ejemplo para borrar el punto de ruptura definido en el ejemplo se emplea el comando: nowhen pto1

3.4. METODOLOGA DE TRABAJO.


En la descripcin realizada a cerca del manejo del simulador se ha hecho especial incapi en su uso mediante comandos, obviandose el uso del interface grfico. Aparentemente el uso de comandos puede parecer ms complejo debido al esfuerzo inicial que supone la creacin de estos ficheros. Pero hay que tener en cuenta que en raras ocasiones se obtiene a la primera un diseo totalmente correcto. En tal caso la verificacin del diseo mediante simulacin se convierte en un proceso iterativo consistente en modificar el cdigo fuente, compilarlo, simular y observar los resultados. Mediante el uso de ficheros de scripts esto se reduce a seleccionar mediante el doskey de la consola la secuencia de comandos: do compila.do do simula.do quit -sim .... do compila.do A esto hay que aadir que este esfuerzo inicial que supone la creacin de los ficheros de script se ve recompensado por la facilidad de poder reutilizarlos. As los scripts creados para la simulacin funcional se pueden reutilizar con leves modificaciones en la simulacin temporal. Adems en su formato bsico no varan demasiado de un diseo a otro, por lo que tambin se suelen reutilizar en este caso.

3.5. UTILIZACIN DEL INTERFACE GRFICO


Como se coment con anterioridad, los diferentes comando tambin se pueden seleccionar por los iconos o elementos de la barra de herramientas. A continuacin se van a ver algunos de ello. Permite selecciona el o los archivo a compilar (comando vcom). Cuando

se activa se accede a la pantalla de la figura 1.24, donde se selecciona el archiv VHDL

a compilar. Haciendo uso de las teclas SHIFT y CTRL se pueden seleccionar ms de un archivo, teniendo en cuenta que se deben seleccionar en orden ascendente de la jerarqua

-36-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Figura 24: Compilacin de archivos VHDL.


Un campo importante de la figura anterior es el de las Default Options (figura 1.25), donde se

selecciona, entre otras cosas , el estndar VHDL utilizado.

Figura 25: Opciones de compilacin. Permite seleccionar la unidad VHD a simular (comando vsim). Cuando se selecciona se accede a la pantalla de la figura 1.26, donde se selecciona la unidad a simular.

-37-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Figura 26: Seleccin de la unidad de diseo a simular.

En la barra de herramientas se encuentran otros iconos que permiten controlar el avance del tiempo del simulador, a continuacin se detallan:

Permite selecciona la cantidad de tiempo que avanza la simulacin cuando se ejecuta el comando run. run. run -continue run -all Parar la simulacin (break). run - step run - step over restart

Merece la pena hacer incapie en la utilizacin del men help para acceder a una coleccin de archivos en formato pdf que van desde un manual de ModelSim hasta la explicacin de la semntica y sintaxis de todos los comandos.

4. SNTESIS DEL DISEO.

-38-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Una vez realizada la simulacin funcional del diseo descrito en VHDL se proceder a sintetizarlo. Para ello se emplear como herramienta de sntesis VHDL el sintetizador Leonardo Spectrum de Exemplar.

4.1. OPERACIN INTERNA DEL SINTETIZADOR.


Antes de proceder a la sntesis del diseo se mostrar el funcionamiento interno de este sintetizador. Esto facilitar la compresin de su manejo. Tal y como muestra la figura 1.28 la sntesis RTL se divide en las siguientes fases: ! ! ! anlisis. elaboracin. optimizacin.

Jerarqua del diseo

Diseo RTL a nivel de puertas.

Anlisis de caminos crticos.

Optimizacin temporal .work Diseo VHDL compilado en memoria Anlisis Elaboracin .work
(diseo con puertas genricas)

RTL

OPTIMIZACIN

Diseo mapeado en la tecnologa destino

DISEO EN MEMORIA

ESCRITURA LECTURA

VHDL VHDL EDIF

EDIF XNF

Ficheros de lista de conexiones de salida.

Ficheros fuente.

Diseo en celdas de la tecnologa destino.

HERRAMIENTAS SIMULADOR DE IMPLEMENTACIN VHDL

Figura 28: Proceso de sntesis.


Durante la fase de anlisis se verifica la sintaxis del fichero VHDL, se comprueban las dependencias y se resuelven los genricos que pudieran aparecer en el cdigo fuente. A partir de los ficheros analizados el sintetizador construye una base de datos interna del diseo. Si alguno de los ficheros fuente hace referencia a elementos que aperecen en libreras o paquetes propios del diseador estos deben ser procesados previamente. Muchas libreras y paquetes standard estn integrados en el propio sintetizador y no necesitan ser procesados explcitamente. En la fase de elaboracin, se sintetiza el cdigo VHDL en una lista de conexiones compuesta por funciones lgicas genricas y cajas negras asociadas a los operadores. Estas funciones lgicas genricas son primitivas propias del sintetizador (no de la FPGA), a partir de las cuales se construye el diseo sintetizado. Se trata pues, de un formato intermedio previo al mapeado tecnolgico en el que estas primitivas se sustituirn por las celdas propias de la tecnologa destino. Esto permite que una misma herramienta de sntesis se pueda utilizar con distintas tecnologas destino. Posteriormente, estas cajas negras asociadas a operadores se sustituirn con operadores implementados especficamente para la tecnologa destino. En -39-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

muchas ocasiones es el propio fabricante de los dispositivos para los que se sintetiza el circuito el que proporciona estos operadores en forma de una librera de macroceldas parametrizables. Este tratamiento diferenciado que se da a los operadores se debe a que las herramientas de sntesis no son muy eficientes a la hora de procesar la lgica aritmtica y relacional (denominada normalmente lgica del data path). Esto es especialmente cierto para las FPGAs, donde cada tecnologa destino tiene distintas formas de optimizar el uso de sus recursos internos. Un diseo VHDL puede estar formado por uno o varios ficheros fuente VHDL. Adems muchos sintetizadores permiten incorporar partes del diseo como componentes descritos mediante una lista de conexiones en la que aparecen celdas de la tecnologa para la que se va a sintetizar. Estos componentes se instanciarn en el cdigo fuente VHDL donde se vayan a utilizar mediante descripciones estructurales. Los sintetizadores pueden admitir formatos de listas de conexiones standard como EDIF, o propios de la herramienta de implementacin de la tecnologa para la que se va a sintetizar. Un ejemplo de esto ltimo es el formato XNF de Xilinx. La posibilidad de describir parte del diseo en este formato permite reutilizar partes de un diseo anterior realizado mediante esquemas. Para ello sera necesario generar una lista de conexiones en formato XNF de estos esquemas. Para facilitar la migracin de estos diseos algunos sintetizadores como Express de Synopsys disponen adems de bibliotecas de macros expresadas como listas de conexiones en formato XNF que corresponden a las macros que aparecen en las libreras de captura de esquemas. Internamente los sintetizadores almacenan los datos de un diseo en libreras cuyo formato depende de la cada herramienta. As la herramienta Leonardo Spectrum utiliza un formato similar al EDIF. La forma en que las distintas partes del diseo se almacena es estas libreras internas es la siguiente: ! Librera de la tecnologa destino. Al fijar en el sintetizador la tecnologa destino para la que se va a sintetizar, ste carga automticamente una librera que contiene todas las celdas de esa tecnologa. Los componentes contenidos en esta librera pueden ser instanciados en el cdigo VHDL para sacar partido a las caractersticas de la arquitectura del dispositivo para el que se va a sintetizar. Un ejemplo de esto sera el uso del oscilador interno de la familia Spartan XL de Xilinx. Libreras de trabajo. Al cargar una descripcin VHDL o una parte del diseo expresada como una lista de conexiones las entidades contenidas en stas quedan almacenadas por defecto en la librera work, si bien es posible, si se desea, definir otra librera como destino. Librera de primitivas. El sintetizador crea automticamente una librera de primitivas que contiene todas las funciones lgicas bsicas o primitivas que emplea el sintetizador cuando compila o elabora el cdigo VHDL. Mediante diseo estructural se pueden instanciar estos componentes independientes de la tecnologa (aunque dependen del sintetizador empleado). Librera de operadores. El sintetizador tambin crea una librera de operadores. Esta librera contiene celdas de operadores (sumadores, multiplicadores, multiplexores, etc). Al compilar una descripcin VHDL estos operadores se generan cuando es preciso.

Una vez finalizada la sntesis RT, se procede a realizar la sntesis lgica. En esta fase, las herramientas de sntesis permiten imponer restricciones temporales al diseo. Estas restricciones pueden controlar el proceso de mapeado tecnolgico y la optimizacin. Durante la optimizacin se persigue -40-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

la obtencin de implementaciones con el menor rea posible y el cumplimiento de restricciones temporales en aquellos caminos crticos en que han sido fijadas estas restricciones, dando lugar a un sistema rpido y que ocupa los menos posibles recursos de la FPGA. Tambin es posible imponer restricciones topolgicas que permitan guiar a la herramienta de implementacin durante el proceso de emplazamiento e interconexionado. Por ejemplo, desde la propia herramienta de sntesis se puede asignar los pads que infieren los puertos de la entidad de nivel superior a terminales del dispositivo sobre el que se va a implementar el diseo. Finalmente el sintetizador genera una lista de conexiones, es decir, un modelo estructural que contiene solamente referencias a celdas lgicas de la tecnologa destino. Esta lista de conexiones ser utilizada por la herramienta de implementacin para realizar el emplazamiento e interconexin y de esta forma proceder a la implementacin del diseo sobre un dispositivo fsico. No existe un formato standard para esta lista de conexiones, pero el ms extendido es el formato EDIF. Algunas herramientas de sntesis para FPGAs producen listas de conexiones en un formato propio de la tecnologa para la que se est sintetizando. Tal es el caso del sintetizador Leonardo Spectrum que puede generar una lista de conexiones en formato .XNF para posteriormente compilarlo con las herramientas de implementacin de Xilinx, aunque stas tambin interpretan el formato EDIF. Por otra parte, es posible que el sintetizador genere esta lista de conexiones como una descripcin estructural VHDL lo que validar el resultado de la sntesis con los mismos bancos de prueba utilizados con la descripcin RTL original. Es lo que normalmente se conoce como simulacin post-sntesis pre-implementacin. Ciertos aspectos del proceso de sntesis se pueden controlar mediante directivas que aparecen en el propio cdigo fuente. Se trata de directivas que aparecen como comentarios de forma que slo son reconocidas por el sintetizador siendo ignoradas por los simuladores. A este tipo de directivas se les denomina pragma (comentarios sintticos o metacomentarios). Su formato depende de cada herramienta de sntesis en particular, por ejemplo: -- synopsys translate_off

.........

-- synopsys translate_on En otras ocasiones se emplean atributos para controlar el proceso de sntesis. Cada sintetizador define sus propios atributos. Al analizar el cdigo fuente VHDL, el sintetizador reconoce automticamente dichos atributos operando segn proceda. Por ejemplo, Leonardo Spectrum al detectar el atributo pull aplicado sobre un puerto de entrada instancia una resistencia de pull-up o pull-down entre el IPAD y el IBUF asociado a dicho puerto. El tipo de resistencia a emplear depende del valor del atributo. Por ejemplo, para fijar una resistencia de pull-up en los puertos de los pulsadores de nuestro diseo se empleara el siguiente cdigo: attribute pull:string; attribute pull of rst,lapso:signal is "pullup";

4.1.1. Generadores de mdulos.

-41-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos. muy que las la

Como se ha comentado anteriormente las herramientas de sntesis no son eficientes a la hora de procesar la lgica aritmtica y relacional aparece en el data path, siendo especialmente problemtico en el caso de FPGAs, donde cada tecnologa tiene una forma distinta de optimizar implementacin de estos operadores.

Con el fn de obtener resultados ptimos, el diseador podra optar por utilizar macros hard (p.e. mdulos generados mediante COREGEN) o soft (ficheros de listas de conexiones) proporcionadas por el fabricante de FPGAs para implementar este tipo de lgica. Esta macro aparecera como un componente instanciado en el cdigo fuente. Sin embargo la instanciacin de componentes plantea los siguientes inconvenientes: ! ! ! La descripcin del diseo deja de ser comportamental. El cdigo VHDL se convierte en dependiente de la tecnologa. La instanciacin de componentes no est permitida en la definicin de operadores o funciones.

Normalmente los sintetizadores disponen de generadores de mdulos incorporados que proporcionan al diseador un mecanismo de sobrecarga de los operadores del data path, como por ejemplo para las funciones +, - y >, con implementaciones prediseadas especficas de una tecnologa. Esta generacin se realiza atendiendo al tamao (nmero de elementos) de los operandos. Normalmente los sintetizadores soportan los siguientes operadores: ! ! ! ! ! ! Multiplicador (operador * ). Sumador, restador y sumador/restador (operadores + y -). Incremento, decremento e incremento/ decremento (operadores + y -). Complemento a dos (operador unario -). Comparador (operadores relacionales <, <=, >, >=, =, /=, ==, !=). Multiplexor (estamentos de seleccin).

Puesto que los algoritmos de generacin de mdulos son especficos para cada familia de FPGAs soportada, las prestaciones y el rea de estos mdulos se optimizan especficamente para dicha arquitectura, igualando los resultados obtenidos con las macros proporcionadas por el fabricante. Al mismo tiempo, permite al diseador describir la lgica con un estilo de comportamiento puro. El hecho de que estos mdulos sean generados por el propio sintetizador le permite optimizar la lgica obtenida junto con la que aparece alrededor del mdulo, con lo que la lgica resultante es menor y ms rpida. Esto no es posible con macros hard ya que dichos componentes aparecen como cajas negras en el cdigo sintetizado. Adems el sintetizador puede aplicar algoritmos de comparticin de recursos, con lo que se puede optimizar an ms el circuito. La figura 1.29 muestra el flujo de datos general en el entorno de generacin de mdulos. Una vez que se ha analizado con xito el cdigo fuente, se pasa al motor de inferencia que compara los operadores soportados con las implementaciones prediseadas de la librera de generacin de mdulos. Cada vez que se encuentra en el cdigo fuente un operador soportado, se consulta la librera de generacin de mdulos especficos de la tecnologa. Si se encuentra una implementacin, se utiliza en el diseo. En caso contrario, el sintetizador proporciona la implementacin lgica por defecto de ese operador. Por ejemplo, si no se dispusiera de un mdulo del operador suma para la tecnologa destino, se podra generar un sumador con acarreo serie mediante lgica combinacional.

-42-

Diseo en VHDL para FPGAs.


Cdigo fuente VHDL

R. Mateos, I. Fernndez. P. Martn

Analizador sintctico VHDL.

Motor de inferencia para generacin de mdulos.

genricos mdulo

Librera de generacin de mdulos

Sntesis, optimizacin y mapeado.

Lista de conexiones para FPGA

Figura 29: Generador de mdulos.

4.2. MANEJO DEL SINTETIZADOR.


Una vez descrita la forma en que opera internamente el sintetizador, se pasar a exponer la forma de utilizar esta herramienta. Para ejecutar el sintetizador seleccionese la opcin: Inicio Programas LeonardoSpectrum LeonardoSpectrum

mostrandose la ventana que muestra la figura 1.30. Esta ventana permite fijar el nivel de operacin del sintetizador. El nivel de operacin determina el control que tendr el usuario sobre el proceso de sntesis: a mayor nivel mayor control.

Figura 30: Seleccin del nivel de operacin.


Seleccione el nivel 3 y pulse el botn OK. Con esto se entra en la ventana principal del sintetizador cuyo aspecto se muestra en la figura 1.31. -43-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Barra de mens

Barra de herramientas

Pestaas de flujo

Ventana de flujo de diseo

Ventana de comandos

Lnea de estado

Figura 31: Ventana principal del sintetizador.


Los principales elementos que aparecen en esta ventana son: ! ! ! ! Una barra de mens desde la que es posible seleccionar las distintas opciones que controlan el funcionamiento del sintetizador. Una barra de herramientas que permite acceder directamente a las opciones que se emplean con mayor frecuencia. Una lnea de estado. Proporciona cierta informacin como el estado del sintetizador, directorio de trabajo, etc. Una ventana de flujo de diseo con la que controlan las distintas fases del proceso de sntesis y se fijan las opciones de stas. Cada fase tiene una pestaa asociada. Con esta ventana se realiza la sntesis mediante un interface grfico. Ventana de comandos. Otra forma de controlar el proceso de sntesis es mediante la ejecucin de comandos. De hecho sta es la forma bsica de operacin del sintetizador mientras que la ventana de flujo de diseo es un mero caparazn grfico desde que se invocan los comandos necesarios. La ventana de comandos se divide en dos partes. La parte inferior es una consola desde la que se introducen los comandos, mientras que la informacin referente a su evolucin se muestra en la parte superior de esta ventana.

Como se ha comentado, el proceso de sntesis se puede controlar mediante una interface grfica (ventana de flujo de diseo) o mediante comandos (ventana de comandos). El uso de uno u otro mtodo depende de las preferencias personales de cada usuario. En cualquier caso es obvio que el primer mtodo resulta ms intuitivo pero permite un control menos exhaustivo del proceso de sntesis y resulta tedioso su manejo cuando la complejidad del diseo es elevada. Algunos diseadores aducen en contra del empleo de comandos que resulta complicado aprenderse toda una serie de nuevos comandos. A este respecto hay que indicar que para un control bsico del proceso de sntesis, el conjunto de comandos a emplear es bastante reducido, siendo posible adems almacenar la secuencia de comandos a emplear en un fichero de scripts y -44-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

ejecutarlos conjuntamente tal y como se hizo en el simulador. Por estos motivos se expondr el manejo del sintetizador mediante comandos, describiendo los comandos a emplear en cada una de las fases del proceso de sntesis. En el caso de que el usuario opte por la ejecucin de la sntesis desde el interface grfico, a medida que se ejecuta cada herramienta en la ventana de comandos se van listando los comandos a los que corresponde dicha herramienta, con lo que con una simple operacin de seleccin y copy-pastes, se puede obtener de una forma sencilla el scrip para la sntesis.

4.2.1. Inicializacin del sintetizador.


Para sintetizar un nuevo diseo en primer lugar es preciso inicializar el sintetizador, borrando el contenido de las libreras internas y fijando el directorio de trabajo actual. Esta operacin se realiza mediante el comando: clean_all El directorio de trabajo actual para nuestro ejemplo ser c:/tutorial/.

4.2.2. Seleccin de la tecnologa destino.


En primer lugar es preciso cargar la librera de la tecnologa destino (familia Spartan2 de Xilinx), seleccionando a continuacin el dispositivo en concreto para el que se va a sintetizar (XC2S50TQ144), la velocidad de ste (-6) y la estimacin de retardos debidos a interconexiones (sta se calcula en funcin del nmero de entradas conectadas a cada salida pudiendose dar como valor promedio o para el peor caso). Esta informacin temporal es empleada durante la optimizacin del diseo. Una forma sencilla de realizar estas operaciones es mediante el uso del interface grfico. Para ello seleccione la herramienta de sntesis avanzada pulsando el botn de la barra de herramientas. Tal y como se muestra en la figura anterior, mediante la pestaa Technology se pueden seleccionar las opciones citadas. Con el rbol que aparece a la izquierda se selecciona la familia en cuestin (familia Spartan2 de Xilinx), la opcin Device se emplea para seleccionar el dispositivo (XC2S50TQ144), el grado de velocidad se fija con la opcin Speed (-6) y finalmente la opcin Wire Load la forma de estimar los retardos debidos a interconexiones. Una vez realizadas estas operaciones, al pulsar el botn Load Library se desencadena la ejecucin de los comandos necesarios para configurar el sintetizador. Esta secuencia de comandos se muestra en la ventana de comandos. De entre todos los comandos mostrados (existen algunos cuyo uso es irrelevante) los que realizan las operaciones mencionadas son: load_library xisxl set part S10xlPC84 set process 4 set wire_table s10xl-4_avg

4.2.3. Seleccin del mtodo de codificacin de las mquinas de estados.


El lenguaje VHDL no define la forma en que se codifican los tipos enumerados. Si el diseo contiene mquinas de estado es preciso indicar como se codificar el tipo enumerado que define el estado de la mquina. Estas cuestiones relacionadas con el funcionamiento interno del sintetizador se pueden configurar mediante variables o atributos internos de la -45-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

herramienta. Como es lgico, estas variables y atributos internos dependen de cada herramienta en cuestin, variando de unas a otras. Las variables internas se emplean su uso debe afectar a la totalidad del diseo, fijandose el valor de dichas variables mediante el comando set. Por otro lado, los atributos internos se emplean cuando su uso debe afectar a un elemento concreto del diseo (p.e. un tipo enumerado, una seal, un componente, etc). En este caso el comando a emplear se denomina set_attribute. La mayora de los atributos internos del sintetizador (no todos!) se pueden fijar en el propio cdigo fuente. Un ejemplo de esto es el atributo pull utilizado en el ejemplo para fijar las resistencias de pull-up de los pulsadores. Volviendo a la cuestin del tipo de codificacin de los tipos enumerados, este sintetizador soporta los siguientes tipos de codificacin: ! ! ! Binario. Genera mquinas de estados con el menor nmero de biestables posible. Gray. Con este tipo de codificacin slo conmuta un biestable en las transiciones de la mquina. Aleatorio (ramdom). Asigna los cdigos de estado de forma aleatoria. Este tipo slo se debe utilizar si los restantes tipos no proporcionan los resultados adecuados. One Hot. Con este tipo de codificacin se emplea un biestable para cada estado de la mquina, proporcionando las mejores prestaciones en cuanto a consumo de recursos y mxima frecuencia de funcionamiento. Si bien el nmero de biestables empleado en la codificacin one-hot es mayor que en la binaria, es preferible su uso en dispositivos programables cuya arquitectura dispone de un gran nmero de biestables. Tal es el caso de las FPGAs de Xilinx.

Para fijar de forma global el tipo de codificacin se emplea la variable el comando set encoding cuyo formato es: set encoding <tipoo donde tipo puede ser binary, onehot, twohot, gray, random o auto. Por ejemplo para seleccionar una codificacin one hot en nuestro ejemplo se emplea el comando: set encoding onehot Para indicar de forma explcita la codificacin utilizada por un determinado tipo de datos se utiliza el atributo es TYPE_ENCODING. De esta forma es posible asignar individualmente el cdigo a cada estado de la mquina. Antes de asignar este atributo al tipo enumerado es preciso declararlo. As para nuestro ejemplo, si se desea asignar el cdigo 00 al estado S1, el 01 al S2, el 11 al S3 y 10 al S4 se empleara el siguiente cdigo:

-46-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

.. -- Declaracin del atributo TYPE_ENCODING: type exemplar_string_array is array (natural range <>,natural range <>) of character; attribute TYPE_ENCODING : exemplar_string_array ; -- Estados de la FSM que type stateFSM is ( S1, S2, S3, S4); signal state: stateFSM; controla el sistema. ----RunningWaitingOnPush RunningWaitingOnRelease FrozenWaitingOnPush FrozenWaitingOnRelease

-- Asignacin del atributo type-encoding. attribute TYPE_ENCODING of state:type is ("00","01","11","10") ;

...

4.2.4. Lectura de ficheros del diseo.


Una vez seleccionada la tecnologa destino para la que se va a sintetizar, se han de leer los ficheros VHDL que componen el diseo. El orden en que se leen estos ficheros depender de las dependencias que existen entre ellos. As si uno de ellos define una unidad de diseo que es utilizada en otro de ellos el primero de ellos debe leerse antes que el segundo. Por tanto el orden de lectura suele coincidir con la posicin que ocupan en la jerarqua del diseo, leyendose en primer lugar el de nivel inferior. Segn esto para el ejemplo considerado el comando a emplear es: read {../BCD2SEG.vhd ../crono.vhd} Notese que no se indican ni los ficheros de los mdulos COREGEN (son modelos de simulacin), ni los del banco de pruebas y el fichero de configuracin asociado (sol se emplea en simulacin para introducir los estmulos al diseo). Al realizar la lectura de un fichero el sintetizador analiza el cdigo fuente. Si aparece algn mensaje de error este aparece marcado con un circulo rojo en la parte superior de la ventana de comandos. Haciendo doble click con el ratn sobre dicho crculo aparece una ventana que muestra el cdigo fuente que produjo dicho error. La figura 1.32 muestra esto. Esto mismo es aplicable a los avisos (warnings), salvo que en este caso el crculo es de color azul.

Figura 32: Bsqueda automtica de errores en el cdigo fuente.


Para seleccionar de los archivos, mediante el interface grfico se utiliza la pestaa Imput( ), apareciendo la ventana de la figura 1.33

-47-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Figura 33: Seleccin de archivos.


Con las pestaas Work Directory y Open files se seleccionan los archivos VHDL a sintetizar, utilizando para ello un orden creciente en la jerarqua de diseo. A continuacin se selecciona el tipo de codificacin para los estados de las mquinas de estados (Encoding Style). Para finalizar se pulsa la pestaa read.

4.2.5. Seleccin del diseo actual.


Los distintos ficheros ledos proporcionan unidades de diseo que el sintetizador almacena internamente en las libreras de trabajo (por defecto work). Antes de realizar la sntesis propiamente dicha es preciso indicar el par entidad-arquitectura de mayor jerarqua del diseo que se va a sintetizar. La sintaxis empleada es:

nombre_librera.nombre_entidad.nombre_arquitectura.
Segn esto para nuestro diseo el comando a emplear ser: present_design .work.cronometro.inside

4.2.6. Configuracin de opciones de optimizacin.


Una vez ledos los ficheros que componen el diseo estos se analizan y elaboran. El siguiente paso consistira en realizar la optimizacin de la sntesis. Previamente a esta ltima operacin habr que fijar las restricciones a aplicar al proceso optimizacin. Al igual que ocurre con el tipo de codificacin de los tipos enumerados las restricciones se pueden aplicar de forma global mediante variables internas o de forma particular mediante atributos internos. Las restricciones impuestas desde el sintetizador se exportan a las herramientas de implementacin mediante un fichero de restricciones en formato nativo (.ncf) que acompaa a la lista de conexiones que genera el sintetizador. Como se ha comentado estas restricciones pueden ser topolgicas o temporales. Un ejemplo del primer caso consistira en la asignacin del IOB asociado a -48-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

un puerto de la entidad de mayor jerarqua a un terminal concreto de la FPGA. Para esto se puede emplear el siguiente comando:
set_attribute -port {.work.cronometro.inside.rst} -name PIN_NUMBER -value P28

En cualquier caso, ha de destacarse que este tipo de restricciones tambin es posible aplicarlas desde la herramienta de implementacin de Xilinx mediante un fichero de restricciones de usuario (.ucf). La eleccin del mtodo depender de las preferencias del diseador. En cuanto a las restricciones temporales es posible imponer el retardo mximo admisible entre dos puntos del diseo. Si esta restriccin no se cumple el sintetizador puede elegir otra estrategia de sntesis. Por ejemplo para el caso de un sumador se puede optar por sintetizarlo con acarreo paralelo frente a una implementacin con acarreo serie. Al igual que en el caso de las restricciones topolgicas, las restricciones temporales tambin se pueden fijar durante la implementacin. Sin embargo en este caso es deseable hacerlo durante la sntesis ya que ests pueden determinar la lgica inferida, de forma que si sta no es ptima los esfuerzos realizados por las herramientas de implementacin para buscar el emplazamiento ms adecuado de los CLBs pueden resultar vanos. Las restricciones temporales pueden ser globales o individuales. Las primeras se aplican a la totalidad del diseo, siendo stas las ms fciles de utilizar. Tal y como muestra la figura 1.34 existen cuatro tipos de restricciones globales. Para fijar estas restricciones Leonardo define cuatro variables internas. Estas son: ! ! input2reg. Indica el mximo retardo admisible entre los puertos de entrada y el primer registro del diseo. En este tiempo se incluye el tiempo de set-up de los biestables. register2register. Indica el mximo retardo admisible entre los dos registros del diseo. En este tiempo se incluye el tiempo de propagacin de los biestables del registro de salida y el de set-up de los de entrada. register2output. Indica el mximo retardo admisible entre los registros y los puertos de entrada. En este tiempo se incluye el tiempo de propagacin de los biestables del registro de salida. input2output. Indica el mximo retardo admisible entre los dos puertos conectados nicamente por lgica combinacional.

! !

-49-

Ingeniera Electrnica.
input2register

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.


register2register register2output

data_in

Bloque combinacional

D Q FF1 clk

Bloque combinacional B

D Q FF2 clk

Bloque combinacional

data_out

clock

data_in

Bloque combinacional D

data_out

output2output

Figura 34: Uso de restricciones temporales globales.


Para fijar estas restricciones se emplea el comando set <variable> <valor> donde <valor> es el tiempo de retardo mximo expresado en ns. As por ejemplo para garantizar que nuestro diseo pueda funcionar al menos a una frecuencia de 10 MHz (T= 100 ns) se emplearan los siguientes comandos: set set set set register2register 100 input2register 100 register2output 100 input2output 100

El otro tipo de restricciones permite fijar individualmente a cada uno de los puertos el mximo retardo admisible. A este tipo de restricciones se les denomina restricciones de puertos y se suelen emplear para optimizar aquellas seales de temporizacin ms crtica. El sintetizador impone una serie de limitaciones a la hora de fijar las restricciones de puertos. Concretamente en el anlisis temporal no se toman en consideracin los caminos de seal que afectan a las seales de inicializacin asncrona (reset y preset) de los biestables. Tampoco se permite fijar restricciones temporales en diseos con varios relojes asncronos. Sin embargo, si es posible el anlisis de diseos con varios relojes sncronos (diseos multifase). Aun as la variedad de situaciones que se pueden abordar con las restricciones es muy amplia por lo que nos limitaremos a exponer aquellas que aparecen en diseos sncronos con una nica seal de reloj. La figura 1.35 ilustra el uso de las restricciones individuales. A continuacin se describirn estas restricciones.

-50-

Diseo en VHDL para FPGAs.


input_arrival

R. Mateos, I. Fernndez. P. Martn


clock_cycle required_time

DATA_IN
Circuito externo virtual D Q
Bloque combinacional

Bloque combinacional

D Q FF1 clk

Bloque combinacional B

D Q FF2 clk

Bloque combinacional

DATA_OUT

FF
DATA_OUT2
clk

CLK

pulse_cycle pulse_width
CLK

DATA_IN

input_arrival
DATA_OUT

required_time

Figura 35: Modelado de restricciones individuales.

clock_cycle define el periodo mximo (frecuencia mnima ) admisible de la seal de reloj del bloque. Este periodo vendr dado por la suma del retardo de la salida de los biestables, el tiempo de propagacin de la lgica combinacional y el tiempo de set-up de la entrada de los biestables. pulse_width permite modelar el ciclo de trabajo de la seal de reloj. arrival_time define la demora respecto al flanco de reloj con que llegan los datos a la entrada del bloque. required_time define la demora mxima admisible desde el flanco de reloj hasta que los datos aparecen estables en el puerto de salida.

! ! !

Para fijar estas restricciones se emplean los siguientes comandos: clock_cycle <periodo_reloj> <puerto_seal_reloj> pulse_width <ancho_pulso_reloj> <puerto_seal_reloj> arrival_time <valor_retardo> <lista_puertos_entrada> required_time <tiempo_necesario> <lista_puertos_salida> Los primeros parmetros de estos comandos son valores de tiempo expresados en ns. Las lista de puertos se expresan como una lista de nombres entre llaves separadas por espacios. Como ejemplo se mostrarn los comandos a emplear para el circuito de la figura anterior bajo las siguientes suposiciones: ! ! ! ! ! Frecuencia mnima de funcionamiento: 10 MHz. Ciclo de trabajo de la seal de reloj: 25 % Tiempo de demora mximo de los datos de entrada: 12 ns Mximo retardo admisible en salidas secuenciales: 5 ns Mximo retardo admisible en salidas combinacionales: 10 ns

Segn esto los comandos a emplear seran: clock_cycle 100 clk pulse_width 25 clk -51-

Ingeniera Electrnica. arrival_time 12 {DATA_IN} required_time 5 {DATA_OUT}

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

En el modelado de una salida puramente combinacional, como es el caso de la seal DATA_OUT2, el tiempo necesario ser la suma de la demora de las entradas ms el mximo retardo admisible de estas salidas: required_time 22 {DATA_OUT2} Para acceder a las opciones de optimizacin desde el interface grfico se utiliza la pestaa , accediendo a la ventana de restricciones. Para generar las restricciones de cada uno de los elementos antes comentados se acta sobre las pestaas mostrados en la figura 1.36 que se encuentra en la parte inferior de dicha ventana.

Figura 36: Seleccin de las restricciones para la sntesis 4.2.7. Optimizacin del diseo.
La optimizacin del diseo se realiza mediante el comando optimize, o con la pestaa . Su sintaxis es: optimize [<design_name>] [-target <technology_name>] [-io_target <technology_name>] [-single_level] [-effort <effort_type>] [-chip]|[-macro] [-area]|[-delay]|[-auto] [-pass <pass_nums>]|[-nopass <pass_nums>] [-hierarchy <auto|preserve|flatten>]

El primer parmetro especifica el diseo a optimizar. Si no se especifica, ste corresponde al diseo actual. sta suele ser la situacin tpica, si bien para diseos complejos se pueden optimizar por separado cada uno de los mdulos que componen el diseo con objeto de obtener mejores resultados. El parmetro target indica la tecnologa destino para la que se va a sintetizar (xisxl para nuestro ejemplo). El parmetro chip indica al optimizador que aada buffers de I/O a los puertos de la entidad de mayor nivel. Los parmetros area y delay indican el factor sobre el que se va a tratar de minimizar (consumo de rea o retardos) en el diseo. Estos son mutuamente excluyentes. El parmetro efford fija el tipo de esfuerzo a realizar durante la optimizacin. Los valores vlidos son: ! ! remap Realiza ciertas optimizaciones locales y a continuacin el mapeado tecnolgico. quick Realiza la optimizacin de una sola pasada y a continuacin el mapeado tecnolgico. Normalmente esta es la opcin empleada en las primeras fases del diseo. standard (valor por defecto). Realiza varias pasadas durante la optimizacin y a continuacin el mapeado tecnolgico. Para ello se aplican distintas estrategias de optimizacin obteniendose mejores -52-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

resultados que en el modo quick pero se consume ms tiempo. Suele emplearse para afinar los resultados de la sntesis. El parmetro hierarchy indica si se mantendr la jerarqua de diseo indicada en el cdigo fuente (preserve) o bien si se aplanar el diseo (flatten). Por defecto la optimizacin de la sntesis se aplica individualmente a cada uno de los mdulos que componen la jerarqua del diseo. Sin embargo los lmites jerrquicos impiden o limitan las optimizaciones a realizar por lo que puede ser deseable aplanarla. En ciertas ocasiones puede ser deseable preservarla, por ejemplo, para dar un tratamiento especial a bloques de temporizacin crtica. En cualquier caso se establece como regla de oro que los bloques jerrquicos no tengan tamaos superiores a 50 K puertas. Segn lo expuesto el comando empleado en nuestro diseo para realizar la optimizacin es: optimize -target xisxl -delay -effort quick -chip -hierarchy preserve

4.2.8. Almacenamiento del diseo.


Una vez realizada la optimizacin, se pueden salvar los resultados de la sntesis para su uso posterior. Como se ha comentado estos consisten en una lista de conexiones en la que aparecen elementos de la tecnologa destino y otra informacin adicional (p.e. restricciones para la herramienta de implementacin). Esta lista de conexiones se puede salvar en distintos formatos standard (EDIF, VHDL, XNF, etc), si bien lo ms idneo es emplear el formato propio del sintetizador (XDB). Para salvar el diseo del ejemplo en el fichero crono.xdb se emplea el comando: write -format xdb crono.xdb

4.2.9. Exportacin de la lista de conexiones.


La ltima operacin a realizar durante la sntesis consiste en exportar los resultados de sta para que puedan ser empleados en las siguientes fases del flujo de diseo. El formato con que se almacene la lista de conexiones depender de la herramienta que la utilice en las siguientes fases del flujo de diseo. Si esta lista de conexiones se utiliza con las herramientas de implementacin de Xilinx el formato puede ser EDF o XNF. Por ejemplo si se exporta en formato EDIF el comando a emplear para nuestro ejemplo ser: auto_write -format edif ../crono.edf Normalmente el comando auto_write suele ir precedido por el comando lo2up que convierte los nombres de los objetos a maysculas. Esto evita problemas de interpretacin del contenido de la lista de conexiones. De igual forma cuando se utilizan componentes COREGEN se debe ejecutar con anterioridad el comando: set edif_write_arrays FALSE Esto evita que la lista de conexiones generada haga uso de la notacin compacta para la definicin de buses que emplea formato EDIF. Puesto que las herramientas de Xilinx no admiten esta posibilidad si se emplear esta notacin aparecera un error durante la implementacin al intentar enlazar ambas listas de conexiones (la generada por el sintetizador y la correspondiente al componente COREGEN).

-53-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Si por el contrario se desea exportar la lista de conexiones como un fichero VHDL estructural para realizar una simulacin post-sntesis preimplementacin la secuencia de comandos a emplear ser: set vhdl_write_component_package FALSE set vhdl_write_use_packages "library IEEE; use IEE.std_logic_1164.all; library UNISIM; use UNISIM.vcomponents.all;" write -format vhdl ../post-synthesis/crono.vhd La desactivacin del atributo vhdl_write_component_package evita que los componentes que aparecen en la lista de conexiones se escriba en un paquete a parte. Mediante el atributo vhdl_write_use_packages se indican la declaracin a incluir en cada entidad que aparece en el fichero VHDL generado. Finalmente el comando write salva el fichero VHDL La versin de Leonardo empleada en el laboratorio no realiza correctamente la exportacin de la lista de conexiones en formato VHDL para FPGAs de la familia Spartan XL. Para otras familias como Spartan II o Virtex no hay ningn tipo de problemas. Para generar el archivo EDIF para la herramientas de implementacin se puede utilizar la ventana de la figura 1.37 .

Figura 37: Seleccin del archivo EDIF de salida. 4.2.10. Uso de ficheros de scripts.
Toda esta secuencia de comandos se puede almacenar en un fichero de script para su posterior ejecucin permitiendo realizar la sntesis de una sola pasada. Con este ejemplo se proporciona el fichero sintetiza.tcl para tal fn. Para ejecutar este fichero ejecute en el comando: source sintetiza.tcl

4.3. ANLISIS DE RESULTADOS.


-54-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Para analizar los resultados obtenidos se pueden generar informes del rea consumida o de los retardos del diseo. Para generar un fichero con un informe del rea consumida se emplea el comando: report_area informe1.txt -cell_usage -hierarchy -all_leafs Parte del contenido de este fichero se muestra en la figura 1.38.
******************************************************* Cell: CRONO View: RTL Library: work ******************************************************* Cell BUFGP FDC FDCE FDP GND IBUF LUT1 LUT2 LUT3 LUT4 MUXF5 OBUF PRESCALER PULLUP Number Number Number Number of of of of Library xis2 xis2 xis2 xis2 xis2 xis2 xis2 xis2 xis2 xis2 xis2 xis2 work xis2 References 1 3 16 1 1 2 3 1 5 20 1 14 1 2 x x x x x x x x x x x x x x 17 72 71 0 1 20 29 1 2 1 14 1 2 26 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Total Area 1 3 16 1 1 2 3 1 5 20 1 14 1 2 BUFGP Dffs or Latches Dffs or Latches Dffs or Latches GND IBUF Function Generators Function Generators Function Generators Function Generators MUXF5 OBUF PRESCALER PULLUP

ports : nets : instances : references to this view :

Total accumulated area : Number of BUFGP : Number of Dffs or Latches : Number of Function Generators : Number of GND : Number of IBUF : Number of MUXF5 : Number of OBUF : Black Box PRESCALER : Number of PULLUP : Number of gates :

*********************************************** Device Utilization for 2s50tq144 *********************************************** Resource Used Avail Utilization ----------------------------------------------IOs 17 92 18.48% Function Generators 29 1536 1.89% CLB Slices 15 768 1.95% Dffs or Latches 20 2082 0.96% -----------------------------------------------

Figura 38: Informe de consumo de rea (fichero informe1.txt).


De forma similar para generar un informe de las temporizaciones del diseo se emplea el comando: report_delay informe2.txt -num_paths 1 -critical_paths -clock_frequency La figura 1.39 muestra parte del contenido de este fichero.

-55-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.


Clock Frequency Report

Clock : Frequency -----------------------------------CLK : 161.3 MHz Critical Path Report Critical path #1, (path slack = 10.0): NAME GATE ARRIVAL LOAD ---------------------------------------------------------------------------------------CLK/ 0.00 0.00 up 1.90 CLK_IBUF/O BUFGP 0.09 0.09 up 3.70 REG_UNIDADES(2)/C FDCE 0.00 0.09 up 0.00 data arrival time 0.09 data required time (default specified - setup time) 10.09 ---------------------------------------------------------------------------------------data required time 10.09 data arrival time 0.09 ---------slack 10.00 ----------------------------------------------------------------------------------------

Figura 39: Informe de retardos (fichero informe2.txt)

Para acceder a las opciones de generacin de archivos de informes desde el interface grfico se utiliza la pestaa , accediendo a la ventana de informes, en la que se puede seleccionar la generacin de un informe de rea y/o velocidad. Otra forma de analizar los resultados de la sntesis consiste en emplear un mtodo grfico que permite visualizar en forma de esquemas los mdulos inferidos durante la sntesis. Para ello seleccione la opcin Tools Design Browser de la barra de mens, o con el icono . En ese momento se muestra la pantalla que aparece en la figura 1.40. En la parte izquierda de esta ventana se muestra la jerarqua del diseo sintetizado, donde se pueden distinguir claramente las distintas libreras citadas con anterioridad. Navegando por este rbol se puede seleccionar el elemento para el cual se desean mostrar su implementacin.

Figura 40: Ventana del navegador de diseos.


Estos esquemas se pueden mostrar a nivel RTL o a nivel de puertas. En el primer caso los componentes que aparecen son las primitivas genricas empleadas por el sintetizador durante la sntesis. En el segundo caso los componentes empleados son elementos de la tecnologa destino para la que se ha sintetizado. Est claro que los esquemas a nivel de puertas no se pueden visualizar hasta que no se haya completado la fase de mapeado tecnolgico. -56-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Como se puede apreciar, en la ventana del navegador del diseo se muestran dos arquitecturas para la entidad de mayor jerarqua. La primera de ellas tiene el nombre empleado en el cdigo fuente VHDL. Al seleccionar los elementos que aparecen en esta arquitectura se muestran los esquemas RTL. La otra arquitectura tiene el mismo nombre con el sufijo _XRTL correspondiendo a la arquitectura generada tras el mapeado tecnolgico. Al seleccionar los elementos que aparecen en esta arquitectura se muestran los esquemas a nivel de puertas. En cualquier caso se puede visualizar uno u otro tipo de esquemas mediante las opciones Tools View RTL Schematic y Tools View Gate Level Schematic de la barra de mens, icono .

Tambin es posible visualizar el camino de mximo retardo pulsando sobre el botn de la barra de herramientas. En ese momento aparece la pantalla que se muestra en la figura 1.41.

Figura 41: Ventana de camino crtico.

5. IMPLEMENTACIN DEL DISEO.


La siguiente fase del proceso de diseo es la implementacin de ste empleando para ello las herramientas de Xilinx. Estas herramientas reciben la lista de conexiones en formato EDIF generada durante la sntesis. Para compilar el diseo sintetizado ejecute la herramienta Design Manager seleccionando Inicio Programas XilinxISE41 Accesories . A continuacin se debe crear un nuevo proyecto seleccionando la opcin File New Project de la barra de mens ( ). En el campo imput design se debe seleccionar el archivo EDIF creado por la herramienta de sntesis, tal y como se muestra en la figura 1.42.

-57-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Figura 42: Creacin de un proyecto con el Disign Manager.


Al pulsar la pestaa OK se va a crear un subdirectorio xproj en el que se van a almacenar los archivos generados durante la implementacin y aparece la ventana de la figura 1.43., que entre otras cosas permite seleccionar el dispositiva sobre el que se va a realizar la implementacin.

Figura 43: Seleccin del dispositivo.


En un proyecto pueden existir varias versiones y dentro de cada una de ellas, varias revisiones. Una versin corresponde a la compilacin del diseo en el que se han producido variaciones en el archivo fuente o se ha seleccionado una nueva familia de dispositivo. Por su parte el trmino revisin se corresponde con una compilacin del diseo en la que se han variado algunos parmetros u opciones de la misma, pero no el archivo fuente. Antes de proceder a la implementacin hay que seleccionar las opciones de la misma, para ello se seleccionando Design Options de la barra de mens. Con el icono , tambin se puede acceder a las opciones de implementacin, Estas opciones se dividen en tres campos (figura 1.44 ): Implementation que permite imponer restricciones para la implementacin, Simulation que permite seleccionar el formato del archivo de salida para realizar la simulacin temporal o post-implementacin y Configuration que permite seleccionar opciones concernientes a la fase de configuracin del dispositivo. Para el -58-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

diseo que nos trata slo se va a retocar el campo de Simulation para indicar que se genere un archivo un archivo VHDL para ser simulado con ModelSim.

Figura 44: Opciones de implementacin.


Con sto, a parte del fichero de configuracin (crono.bit), se generan los ficheros time_sim.vhd y time_sim.sdf empleados para realizar unas simulacin VHDL post-implementacin (tambin denominada simulacin a nivel de puertas). El fichero time_sim.vhd contiene una descripcin estructural de la entidad de jerarqua superior (crono). En este fichero, las herramientas de Xilinx asignan siempre el nombre STRUCTURE a la arquitectura de la entidad de jerarqua superior. Por su parte, el archivo time_sim.sdf contiene la informacin temporal con los retardos que sufren las seales, presentes en el archivo time_sim.vhd, dentro del dispositivo. Ha de tenerse en cuenta que para que la compilacin del diseo se realice correctamente el fichero de lista de conexiones asociado al mdulo COREGEN (prescaler.edn) debe encontrarse en el directorio donde ha sido almacenada la lista de conexiones generada por el sintetizador. Antes de proceder con la implementacin se puede generar un archivo de restricciones de usuario pueden emplearse para fijar restricciones durante el proceso de implementacin del diseo. Con estas restricciones se puede asignar las seales correspondientes a los puertos de la entidad de mayor jerarqua a sus terminales correspondientes, as como otras configuraciones de entrada/salida (slew-rate, estndar lgico, etc) (restricciones topolgicas) o bien imponer retardos mximos en los caminos de seal. El fichero de restricciones de usuario (User Constrains File- ucf) se crea con Tools Constrains Editor , o con , accediendo a la ventana de la figura 1.45.

-59-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

Figura 45: Creacin de un archivo de restricciones.


Con los elementos (crear nuevo archivo ucf) , (abrir archivo ucf) y

(guardar archivo ucf)se puede seleccionar el contenido del archivo de restricciones. En la figura 1.46. se muestra el contenido del archivo ucf utilizado en el diseo del tutorial.
NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET "CLK" LOC = "p55"; "DISPLAYDECENAS(0)" LOC = "p4"; "DISPLAYDECENAS(1)" LOC = "p5"; "DISPLAYDECENAS(2)" LOC = "p6"; "DISPLAYDECENAS(3)" LOC = "p7"; "DISPLAYDECENAS(4)" LOC = "p8"; "DISPLAYDECENAS(5)" LOC = "p10"; "DISPLAYDECENAS(6)" LOC = "p11"; "DISPLAYUNIDADES(0)" LOC = "p12"; "DISPLAYUNIDADES(1)" LOC = "p13"; "DISPLAYUNIDADES(2)" LOC = "p14"; "DISPLAYUNIDADES(3)" LOC = "p15"; "DISPLAYUNIDADES(4)" LOC = "p18"; "DISPLAYUNIDADES(5)" LOC = "p20"; "DISPLAYUNIDADES(6)" LOC = "p21"; "LAPSO" LOC = "p22"; "RST" LOC = "p23";

Figura 46: Fichero de restricciones crono.ucf.


Una vez creado o seleccionado el archivo de restricciones, se procede a la implementacin del diseo, para ello se ejecuta Tools Flor Engine, o se

acta sobre el botn de la barra de herramientas, creandose de forma automtica una nueva versin o revisin segn sea el caso. Cuando se ejecuta dicho comando aparece el cuadro de dilogo de la figura 1.47.

-60-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

Figura 47: Implementacin de un diseo.


Los Indicadores de Proceso que posee la ventana de la figura anterior muestran en qu etapa se encuentra el flujo del diseo en ese preciso momento. Las flechas entre cada paso se vuelven de color negro despus que el paso previo ha terminado. En la barra de proceso que muestra el estado en que se encuentra cada proceso, ya sea en ejecucin (Running), completado (Completed), abortado (Aborted) o con algn error en la ejecucin (Failed). Para el caso de trabajar con FPGAs, los procesos son: - Translate: Realizar la traduccin del diseo. - Map: Realizar la particin del diseo. - Place&Rute: Realizar el emplazamiento y ruteado del diseo. - Timing(Sim). Genera un archivo de retardos paar realizar simulacin temporal - Configure: Genera el archivo de configuracin.

una

El proceso de implementacin de un diseo conlleva la ejecucin secuencial de una serie de herramientas, cada una de las cuales genera un archivo ASCII de informes (reporters) en el que se reflejan todas las acciones realizadas por el mismo, as como los errores o avisos (warnings) que se producen. En la figura 1.48. se muestra el grupo de archivos de informes generados durante la implementacin de un diseo para una FPGA. Para acceder a la los informes de la barra de ejecuta Utilies Report Browser, o se acta sobre el botn herramientas,

Figura 48: Archivos de informes de la implementacin

6. SIMULACIN A NIVEL DE PUERTAS.

-61-

Ingeniera Electrnica.

Laboratorio de Diseo de Circuitos y Sistemas Electrnicos.

El proceso a seguir para llevar a cabo la simulacin post-implementacin es muy similar al descrito para la simulacin RTL variando nicamente los ficheros VHDL a emplear en cada caso. El archivo a compilar es ahora el time_sim.vhd, el cual contiene una descripcin estructural realizad con componentes de la tecnologa destino. Una vez compilado se crea la arquitectura structure para el componente crono, por lo que habr que crear una nueva configuracin para seleccionar el uso de dicha arquitectura en el testbench. El fichero que contiene la configuracin para la simulacin temporal es cnf_temporal.vhd. As la secuencia de comandos a ejecutar ser: vcom -87 time_sim.vhd vcom -93 testbench.vhd vcom -93 cnf_temporal.vhd Los comandos para realizar la compilacin de los archivos necesarios para realizar la simulacin temporal se encuentran en el scrip compila_tmp.do. En una simulacin temporal a la hora de cargar el diseo a simular es preciso indicar la entidad sobre la que se aplicar el fichero .sdf que contiene las retroanotaciones de retardos. La sintaxis empleada para ello por el comando vsim es: vsim [-sdfmin | -sdftyp | -sdfmax [<instance>=]<sdf_filename>] [<library_name>.<design_unit>]

Segn esto para nuestro caso mediante la opcin -sdfmax se emplear el valor mximo de los retardos retroanotados (simulacin del peor caso). Estos se aplicaran al componente uut que est instanciado en la raz (/) de la jerarqua. Estos retardos se encuentran almacenados en el fichero time_sim.sdf. Con esto el comando a emplear sera: vsim -sdfmax /dut=../time_sim.sdf cnf_temporal vsim -sdfmax dut=C:/tutorial/time_sim.sdf work.cnf_temporal -multisource_delay latest

Desde el interface grfico, una vez actuado sobre

y seleccionada la

unidad de diseo a simular (cnf_temporal) con la pestaa SDF se selecciona el archivo que contiene la informacin temporal haciendo uso de la ventana de la figura 1.49.

Figura 49: Seleccin del archivo sdf.


-62-

Diseo en VHDL para FPGAs.

R. Mateos, I. Fernndez. P. Martn

En la figura anterior actando sobre la pestaa add se selecciona el archivo sdf y el elemento sobre el que se aplica (figura 1.50 ), para ello se indica la referencia que el componente tiene en el testbenc (dut).

Figura 50: Parmetros del archivo sdf.


El resto de comandos a emplear son exactamente los mismos, salvo por un pequeo detalle. Durante el proceso de sntesis y su posterior implementacin puede ocurrir que determinadas seales internas desaparezcan debido a optimizaciones realizadas por estas herramientas. Por tanto es aconsejable visualizar nicamente los puertos de la entidad del diseo, nunca seales internas. Tan slo en el caso de que por motivos de depuracin fuese necesario visualizar seales internas nicamente es posible visualizar los puertos de los componentes instanciados en el cdigo VHDL y siempre que se preserve la jerarqua durante la sntesis. Con esto los comandos necesarios para seleccionar las seales a visualizar sern:
# Definicion de seales a visualizar. add add add add add add add add add add wave wave wave wave wave wave wave wave wave wave /testbench/rst_tb /testbench/clk_tb /testbench/dut/en1hz /testbench/lapso_tb /testbench/dut/state /testbench/dut/actualizar -unsigned /testbench/dut/cntunidades -unsigned /testbench/dut/cntdecenas /testbench/displayunidades_tb /testbench/displaydecenas_tb

run 400 ns force -freeze testbench/dut/EN1HZ 1 run 50 us

Estos comandos estn recogidos en el script sim_temporal.do

-63-

You might also like