Professional Documents
Culture Documents
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.
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-
Editor VHDL
LogiBLOX
Modelo de simulacin del componente LogiBLOX. VHDL Simulacin RTL.
Plantillas de instantacin
VHI
UNISIM VITAL
SINTETIZADOR VHDL
XNF EDIF VHDL
.NGC
LogiBLOX Comportamiento
HERRAMIENTAS DE IMPLEMENTACIN
Ficheros de informes
EDIF
VHDL
SDF
SIMPRIM VITAL
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.
Ingeniera Electrnica.
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.
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-
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
-3-
Ingeniera Electrnica.
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
PAR
Emplazamiento del diseo fsico Interconexin del diseo fsico.
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-
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.
-5-
Ingeniera Electrnica.
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
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-
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.
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-
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.
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".
-10-
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;
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;
-11-
Ingeniera Electrnica.
S1, S2, S3, S4); signal state: signal actualizar: begin -----
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-
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.
end if;
end if;
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
Elementos de memoria
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-
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;
-15-
Ingeniera Electrnica.
library IEEE; use ieee.std_logic_1164.all;
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-
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.
-17-
Ingeniera Electrnica.
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. 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.
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-
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 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.
Ingeniera Electrnica.
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-
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.
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.
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-
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
Ingeniera Electrnica.
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
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.
-27-
Ingeniera Electrnica.
Figura 19:
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-
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.
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
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.
-30-
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.
Laboratorio de Diseo de Circuitos y Sistemas Electrnicos. Cancela el comando force una vez transcurrido el tiempo especificado.
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
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
/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.
-33-
Ingeniera Electrnica. !
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
-34-
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.
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
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-
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.
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.
-38-
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.
Optimizacin temporal .work Diseo VHDL compilado en memoria Anlisis Elaboracin .work
(diseo con puertas genricas)
RTL
OPTIMIZACIN
DISEO EN MEMORIA
ESCRITURA LECTURA
EDIF XNF
Ficheros fuente.
Ingeniera Electrnica.
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-
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";
-41-
Ingeniera Electrnica.
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-
genricos mdulo
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.
Ingeniera Electrnica.
Barra de mens
Barra de herramientas
Pestaas de flujo
Ventana de comandos
Lnea de estado
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-
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.
Ingeniera Electrnica.
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-
.. -- 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
...
-47-
Ingeniera Electrnica.
nombre_librera.nombre_entidad.nombre_arquitectura.
Segn esto para nuestro diseo el comando a emplear ser: present_design .work.cronometro.inside
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
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
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-
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
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-
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-
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
-53-
Ingeniera Electrnica.
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
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
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% -----------------------------------------------
-55-
Ingeniera Electrnica.
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 ----------------------------------------------------------------------------------------
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.
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.
-57-
Ingeniera Electrnica.
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.
-59-
Ingeniera Electrnica.
(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";
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-
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,
-61-
Ingeniera Electrnica.
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
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.
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).
-63-