DPTO. ELECTRNICA- UNIVERSIDAD DE ALCAL. Diseo con VHDL . -i- NDICE 0. INTRODUCCIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1. DESCRIPCIN DEL DISEO A REALIZAR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2. ARCHIVOS FUENTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1. MDULO BCD2SEG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2. MODULO PRESCALER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3. MDULO CONTROL VISUALIZACIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Mdulo antirrebotes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Mdulo Mquina de estados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4. MDULO CRONO.VHD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Contador de dcadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Registros de visualizacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.5. BANCO DE PRUEBAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3. CREACIN DE LOS ARCHIVOS FUENTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4. ENTORNO DE SIMULACIN ModelSim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.1 ARRANQUE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Libreras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.2. CREACIN DE UN PROYECTO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.3. COMPILACIN DEL CDIGO FUENTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Compilacin desde el entorno grfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.4. CARGA DE LA UNIDAD DE DISEO A SIMULAR. . . . . . . . . . . . . . . . . . . . . 24 4.5. SELECCIN DE PUNTOS DE PRUEBA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Simulacin desde el entorno grfico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.6. INTRODUCCIN DE ESTMULOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.7. AVANCE Y DETENCIN DE LA SIMULACIN. . . . . . . . . . . . . . . . . . . . . . . . 34 5. ANLISIS DE RESULTADOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.1.PUNTOS DE RUPTURA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 6. FINALIZAR LA SESIN DE SIMULACIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 7. METODOLOGA DE TRABAJ O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Diseo con VHDL . -1- 0. INTRODUCCIN. El objetivo perseguido con la elaboracin de este tutorial es familiarizar al alumno con el diseo de sistemas digitales en VHDL. El proceso de diseo se divide en tres fases: creacin, compilacin y simulacin. Para la creacin de los archivos fuente se puede utilizar cualquier editor de textos, aunque se recomienda emacs debido a que tiene precargadas plantillas con la sintaxis de VHDL, lo que facilita de forma notable la creacin de dichos archivos. Para la compilacin y simulacin se va a utilizar Modelsim de Mentor Graphics. Esta herramienta es suficientemente potente como para pretender conocerla en su totalidad con este tutorial. Si bien, se proporcionarn los conocimientos bsicos para poder manejarla. El usuario para profundizar en su manejo puede acceder en todo momento a los manuales completos de la herramienta proporcionados por el fabricante, tanto en formato HTML como en PDF. 1. DESCRIPCIN DEL DISEO A REALIZAR. Para ilustrar el proceso de diseo de un sistema digital en VHDL se emplear como ejemplo de diseo la realizacin de un cronometro digital con precisin de segundos y valor mximo de cuenta de un minuto. Con este diseo se pretende ilustrar las situaciones ms frecuentes que aparecen en los diseos con VHDL. La figura 1 muestra el diseo a realizar. En el archivo enunciado.pdf se indican las condiciones de funcionamiento impuestas. MARCHA DisplayUnidades DisplayDecenas Vcc R R MARCHA UPDOWN RST CAPTURA Vcc OSCILADOR CLK Figura 1. Diseo a realizar. La seal de reloj del sistema proviene de un oscilador externo, que proporciona una seal (CLK) de frecuencia 10 MHz y ciclo de trabajo del 50%. El nmero de segundos (unidades y decenas de 00 59) transcurridos se visualizar sobre sendos displays de 7 segmentos de ctodo comn. El sistema dispone de un pulsador RST para inicializar (puesta a cero) la cuenta del tiempo. Adems, se dispone de otro pulsador (CAPTURA) para implementar la funcin de congelacin de la visualizacin. 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 este pulsador se refresca la visualizacin, mostrando el tiempo transcurrido actualmente. Hay que hacer notar que los pulsadores son elementos mecnicos con lo que cada vez que se acta sobre ellos se producen rebotes (figura 2) siendo sus amplitudes y duraciones aleatorias, si bien se sabe que su duracin nunca excede de los 5 ms . Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -2- <5ms <5ms Figura 2. Rebotes producidos en los pulsadores. Para implementar el sistema se ha realizado un diseo jerrquico como el mostrado en la figura 3. Realizandose una realizacin estructural del diseo. El componente BCD2SEG realiza la funcin de un decodificador BCD a 7 segmentos para displays de ctodo comn, cuyo funcionamiento viene especificado en el fichero bcd2seg.vhd. Este decodificador se instanciar como sendos componentes en la entidad de mayor jerarqua declarada en el fichero crono.vhd. En esta entidad se instancia tambin el componente PRESCALER que proporciona una seal de 1 Hz empleada para contar los segundos, obtenida a partir de la seal de 10 MHz. La seal de 1 Hz se obtiene de dividir la frecuencia de la seal de reloj CLK por un factor de 10 7 . Este componente se modela en el archivo prescaler.vhd. As mismo, tambin se proporciona una seal de 5 ms a utilizar por el componente ANTIRREBOTES. El proceso CONTADOR es el encargado de medir el tiempo transcurrido. Para lo que se modela un contador BCD de dos dcadas o dgitos (unidades y decenas). BCD2SEG BCD2SEG CONTADOR 0-59 PRESCALER prescaler.vhd crono.vhd CAPTURA bcd2seg.vhd REGISTROS EN EN EN1HZ DIVISOR 10 y 5.10 7 4 CLK RST SET P P CE ANTIRREBOTES MQUINA DE ESTADOS ant_reb.vhd maq_fsm.vhd CONTROL DE LA VISUALIZACIN cnt_cap.vhd EN200Hz Figura 3. Diagrama de bloque del sistema a disear. En la jerarqua de mayor nivel, tambin, se instanciar el componente CONTROL DE LA VISUALIZACIN, el cual, a su vez, corresponde con un diseo jerrquico formado por los componentes ANTIRREBOTES y MAQUINA DE ESTADOS, encargado de controlar la habilitacin de los registros que permiten la congelacin de la visualizacin y se ubican entre el contador 0-59 y los decodificadores BCD a 7 segmentos. Cuando la seal de habilitacin de estos registros est activa sus salidas 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 CAPTURA, una vez eliminados los posibles rebotes, y cuyo grafo se muestra en la figura 4. La variable P indica el estado del pulsador: 1 sin pulsar, 0 pulsado. Diseo con VHDL . -3- P=1 P=0 P=1 P=1 P=1 P=0 P=0 P=0 S3 0 S2 0 S4 1 S1 1 Figura 4. 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 (CE=0). Se permanece en este estado mientras el pulsador se encuentre activado. Al liberarse (P=1) se pasa al estado S3 (CE=0), donde se espera hasta que se vuelva a activar el pulsador (P=0) momento en el cual se pasa al estado S4 (CE=1), habilitando de nuevo el refresco de los registros. El sistema permanece en S4 mientras el pulsador permanece activado, pasando a S1 al liberarse. Para saber si la seal procedente del pulsador est libre de rebotes es suficiente con examinarla en varios instantes de tiempo, de forma que si en todos ellos el valor es 0' o 1' se puede considerar que la seal no tiene rebotes. El intervalo de tiempo muestreado deber ser superior a 5 ms. Para realizar este filtrado de los rebotes se puede utilizar el circuito de la figura 5. En este caso, como se utiliza una seal(EN200Hz) de periodo 5 ms para habilitar los biestables tipo D, el intervalo muestreado es de 20 ms. CAPTURA D C CE Q S E T D C CE Q S E T D C CE Q S E T P EN200HZ CLK SET D C CE Q S E T S R CE C Q S E T Figura 5. Diagrama de bloques del circuito antirebotes. As, la descripcin VHDL de este diseo est compuesta por los siguientes ficheros, listados de menor a mayor jerarqua (orden que se deber mantener en la compilacin). Indicar que el ltimo de ellos (crono_tb.vhd) es un testbench utilizado para simular el diseo. ! bcd2seg.vhd. ! prescaler.vhd. ! ant_reb.vhd. ! maq_fsm.vhd. ! cnt_cap.vhd. ! crono.vhd ! crono_tb.vhd Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -4- Una vez descrito el comportamiento del diseo se pasar describir los archivos VHDL creados para modelarlo. 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 el archivo script.zip se encuentran archivos scripts a utilizar con la herramienta de compilacin y simulacin que permitirn simplificar la fase de diseo. A lo largo de este manual se irn explicando la funcionalidad de cada uno de ellos. 2. ARCHIVOS FUENTE. A continuacin se muestra el cdigo VHDL de cada uno de los archivos que forman el diseo. 2.1. MDULO BCD2SEG. 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; use ieee.numeric_std.all; entity BCD2SEG is port ( BCD : in std_logic_vector(3 downto 0); Display : out std_logic_vector(6 downto 0)); --gfedcba end BCD2SEG; architecture rtl of BCD2SEG is begin with BCD select Display <="0111111" when "0000", --0 "0000110" when "0001", --1 "1011011" when "0010", --2 "1001111" when "0011", --3 "1100110" when "0100", --4 "1101101" when "0101", --5 "1111101" when "0110", --6 "0000111" when "0111", --7 "1111111" when "1000", --8 "1100111" when "1001", --9 "0000000" when others; -- apaga todos los segmentos end rtl; Diseo con VHDL . -5- 2.2. MODULO PRESCALER. Para realizar la divisin de la frecuencia de la seal de entrada se emplean contadores. En este caso para optimizar los recursos en el caso de que el diseo se implementara en una FPGA, los factores de divisin son 10 7 y 5.10 4 , se han implementado tres contadores: el primero divide por 10000, el segundo por 5 y el tercero por 1000. Los contadores segundo y tercero al hacer uso de la seal FC como habilitacin proporcionan un factor de divisin de 5.10 4 y 10 7 respectivamente. Como las seales de fin de cuenta se van a utilizar para habilitar otros sistemas secuenciales, que utilizan la seal de 10 MHz como seal de reloj, deben estar a nivel alto un nico periodo de esta ltima. library ieee; use ieee.std_logic_1164.all; entity prescaler is port ( CLK : in std_logic; RST : in std_logic; EN1HZ : out std_logic; EN200HZ : out std_logic); end prescaler; architecture rtl of prescaler is signal cnt5 : integer range 0 to 5; signal cnt1000 : integer range 0 to 1000; signal cnt10000 : integer range 0 to 10000; signal fc : std_logic; begin process (clk, rst) begin if rst ='0' then cnt10000 <=0; elsif clk'event and clk ='1' then if cnt10000 =9999 then cnt10000 <=0; else cnt10000 <=cnt10000+1; end if; end if; end process; fc<='1' when cnt10000 =9999 else '0';
process (clk, rst) begin if rst ='0' then cnt5 <=0; elsif clk'event and clk ='1' then if fc ='1' then if cnt5 =4 then cnt5 <=0; else cnt5 <=cnt5+1; end if; end if; end if; end process; process (clk, rst) begin if rst ='0' then cnt1000 <=0; elsif clk'event and clk ='1' then if fc ='1' then if cnt1000 =999 then cnt1000 <=0; else cnt1000 <=cnt1000+1; end if; end if; end if; end process; EN200HZ <='1' when fc ='1' and cnt5 =4 else '0'; EN1HZ <='1' when fc ='1' and cnt1000 =999 else '0'; end rtl; Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -6- 2.3. MDULO CONTROL VISUALIZACIN. Este modulo es el encargado de activar la seal de habilitacin de los registros que congelan la visualizacin del tiempo. Para su creacin se ha realizado un diseo jerrquico que utiliza los bloques ANTIRREBOTES y MAQUINA DE ESTADOS, los cuales se modelan en las entidades ant_reb y maq_fsm, repectivamente. Mdulo antirrebotes. Es el encargado de eliminar los rebotes que se producen al pulsar y liberar el pulsador. La funcin implementada es la reflejada en el esquema de la figura 5. library ieee; use ieee.std_logic_1164.all; entity ant_reb is port ( captura, clk, en200hz, set : in std_logic; p : out std_logic); end ant_reb; architecture rtl of ant_reb is signal a, b, c, d, s_and, s_nor : std_logic; begin s_and <=captura and a and b and c and d; s_nor <=not(captura or a or b or c or d); process (clk, set) begin if set ='0' then a <='1'; b <='1'; c <='1'; d <='1'; p <='1'; elsif clk'event and clk ='1' then if en200hz ='1' then a <=captura; b <=a; c <=b; d <=c; if s_and ='1' then p <='1'; elsif s_nor ='1' then p <='0'; end if; end if; end if; end process; end rtl; Mdulo Mquina de estados. Atendiendo al grafo de la figura 4, la maquina a modelar es del tipo Moore, cuyo diagrama de bloques se muestra en la figura 6. En este caso se ha optado por modelar la mquina utilizando dos procesos: uno, secuencial, para controlar las transiciones entre estados y otro, combinacional, para generar la salida de la mquina. Lgica combinacional Proceso secuenci al Proceso combi naci onal Lgica secuencial Lgica combinacional Clculo del prximo estado Clculo de las salidas. Elementos de memoria Rst Clk Prximo estado Estado actual P CE Figura 6. Diagrama de bloques de la mquina de estados. Diseo con VHDL . -7- 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 ce que toma el valor cero cuando la cuenta est congelada. El cdigo completo que modela la maquina de estados es el mostrado a continuacin. library ieee; use ieee.std_logic_1164.all; entity maq_fsmis port ( p : in std_logic; rst : in std_logic; clk : in std_logic; ce : out std_logic); end maq_fsm; architecture rtl of maq_fsmis -- Estados de la FSM que controla el sistema. type stateFSM is ( S1, -- RunningWaitingOnPush S2, -- RunningWaitingOnRelease S3, -- FrozenWaitingOnPush S4); -- FrozenWaitingOnRelease signal state : stateFSM;
begin process(clk, rst) begin if(rst ='0') then state <=S1; elsif (clk'event and clk ='1') then case state is when S1 => if (p ='1') then state <=S1; else state <=S2; end if; when S2 => if (p ='0') then state <=S2; else state <=S3; end if; when S3 => if (p ='1') then state <=S3; else state <=S4; end if; when S4 => if (p ='0') then state <=S4; else state <=S1; end if; end case; end if; end process; process(state) begin case state is when S2 | S3 => ce <='0'; when S1 | S4 => ce <='1'; end case; end process; end rtl ; El modulo que controla el estado de la visualizacin est compuesto por la instanciacin de los dos ltimos componentes: ant_reb y maq_fsm, siendo su cdigo el mostrado a continuacin Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -8- library ieee; use ieee.std_logic_1164.all; entity cnt_cap is port ( captura : in std_logic; clk : in std_logic; en200hz : in std_logic; rst : in std_logic; ce : out std_logic); end cnt_cap; architecture rtl of cnt_cap is component ant_reb port ( captura : in std_logic; clk : in std_logic; en200hz : in std_logic; set : in std_logic; p : out std_logic); end component; component maq_fsm port ( p : in std_logic; rst : in std_logic; clk : in std_logic; ce : out std_logic); end component; signal p_i : std_logic; begin u1 : ant_reb port map ( captura =>captura, clk =>clk, en200hz =>en200hz, set =>rst, p =>p_i); u2 : maq_fsm port map ( p =>p_i, rst =>rst, clk =>clk, ce =>ce); end rtl; 2.4. MDULO CRONO.VHD. Este es el fichero principal o raz del diseo sobre el que se instancian los componentes bcd2seg, prescaler y cnt_cap. El resto de los mdulos que aparecen en el diagrama de bloques de la figura 1.4 (contador y registros) aparecern como procesos dentro de la arquitectura del cronometro, a continuacin se detalla el funcionamiento de estos dos elementos. 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. Diseo con VHDL . -9- 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; Registros de 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 (CE ='1') then Unidades <=std_logic_vector(CntUnidades); Decenas <=std_logic_vector(CntDecenas); end if; end if; end process; Si la seal CE 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.5. BANCO DE PRUEBAS. A continuacin se proporciona el listado del fichero VHDL correspondiente al banco de pruebas empleado para validar el diseo. Se trata de una entidad sin puertos. En la parte declarativa de la arquitectura se declara el componente a verificar (crono) y un conjunto de seales correspondientes a cada uno de los puertos de dicho componente. stas son fcilmente reconocibles porque tienen el sufijo _i. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -10- library IEEE; use ieee.std_logic_1164.all; entity crono_tb is end crono_tb; architecture simula of crono_tb is constant REBTIME : time :=50 us; -- Tiempo de duracin de un rebote. constant PUSHTIME : time :=100 ms; -- Tiempo de duracin de una tecla. constant RSTTIME : time :=10 ms; -- Tiempo de activacin del reset. constant Tclk : time :=100 ns; -- Periodo de la seal de reloj. -- Declaracin del componente crono. component crono port ( captura : 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 captura_i : std_logic :='1'; signal rst_i : std_logic :='0'; signal clk_i : std_logic :='0'; signal DisplayUnidades_i : std_logic_vector(6 downto 0); signal DisplayDecenas_i : std_logic_vector(6 downto 0); begin -- Instantacin del componente crono. dut : crono port map ( captura =>captura_i, rst =>rst_i, clk =>clk_i, DisplayUnidades =>DisplayUnidades_i, DisplayDecenas =>DisplayDecenas_i); -- Generacin de la seal de reset. rst_i <='1' after RSTTIME; -- Generacin de la seal de reloj. clk_i <=not clk_i after Tclk/2; -- Proceso principal control de la excitacion. process -------------------------------------------------------- -- PULSAR: Simula la pulsacin del pulsador captura -- Parmetros de entrada: -- No tiene. --------------------------------------------------------- procedure pulsar is begin captura_i <='1'; for i in 1 to 10 loop captura_i <=not captura_i; wait for REBTIME; end loop; captura_i <='0'; wait for PUSHTIME; for i in 1 to 10 loop captura_i <=not captura_i; wait for REBTIME; end loop; captura_i <='1'; wait for PUSHTIME; end pulsar; begin -- Secuencia de operacin. wait for 2 sec; pulsar; wait for 2 sec; pulsar; wait; 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 las acciones a llevar a cabo en la verificacin del diseo. En este ejemplo el procedimiento pulsar reproduce la pulsacin de la tecla CAPTURA. Diseo con VHDL . -11- 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 evitarlo se finaliza dicho proceso con una sentencia wait . 3. CREACIN DE LOS ARCHIVOS FUENTE. Para la creacin de los archivos fuente se va a utilizar el editor emacs debido a que tiene precargadas plantillas con la sintaxis de VHDL, lo que facilita de forma notable la creacin de dichos archivos. Aunque se podra utilizar cualquier otro editor de textos, incluso el que tiene la herramienta que se va utilizar para simular los archivos VHDL. Aunque dicha herramienta tambin dispone de plantillas de VHDL, no son tan sencillas de manejar como las de emacs. En esta seccin vamos a vez los elementos bsicos que nos permitirn crear cualquier tipo de archivo VHDL, aunque se va a utilizar una nfima parte de las posibilidades que este editor nos aporta. Para familiarizarnos con el entorno se va a crear un archivo sencillo, correspondiente a una entidad que realiza la cuenta de 0 a 99, de forma similar que el contador de dcadas utilizado en la entidad crono, y cuyo listado se muestra a continuacin. Dicho archivo se suministra dentro de la carpeta archivo y tiene de nombre contador.vhd. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity contador is port ( rst : in std_logic; clk : in std_logic; EN1HZ : in std_logic; unidades : out std_logic_vector(3 downto 0); decenas : out std_logic_vector(3 downto 0)); end contador; architecture rtl of contador is signal CntUnidades : unsigned(3 downto 0); signal CntDecenas : unsigned(3 downto 0); begin -- rtl process(clk, rst) begin if(rst ='0') then CntUnidades <=(others =>'0'); CntDecenas <=(others =>'0'); unidades <=(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; unidades <=std_logic_vector(CntUnidades); decenas <=std_logic_vector(CntDecenas); end rtl; Ntese que en la lnea - if(EN1HZ = 1') then- se ha cometido un error de forma deliberada para ver como se pueden depurar con las herramientas utilizadas. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -12- Para iniciar el editor emacs se hace doble clic en el icono de acceso directo de la figura 7, apareciendo la ventana de la figura 8.
Figura 7. Icono de la aplicacin. Este es un editor pensado para trabajar en UNIX, por lo que no acepta los comandos tpicos de windows, posteriormente volveremos sobre esto. Figura 8. Ventana de bienvenida de emacs. En la ventana de trabajo existen tres zonas: la superior en la que se encuentra la barra de herramientas, la central o zona de trabajo en la que se escribe el texto, y la inferior o ventana de comandos, desde la que se pueden ejecutar algunos comando de la herramienta. Con el comando File de la barra de herramientas podemos acceder a los comandos de manejo de archivos, de forma similar a otros programas de windows, con la salvedad de que no aparece el comando new (nuevo). Un archivo nuevo se crea con el comando File Open File, y una vez seleccionada la carpeta donde queremos crear el archivo se le da un nombre que no exista en dicha carpeta. Figura 9. Comando File. Diseo con VHDL . -13- Los archivos VHDL tienen siempre la extensin vhd. Cuando se esta editando un archivo VHDL aparece un nuevo elemento de nombre VHDL en la barra de herramientas, esto es un buen indicativo de que hemos utilizado la extensin correcta para nuestro archivo. Una vez seleccionado el archivo de entrada, ya se puede a introducir las lneas de texto como si de otro editor se tratase. Para la operacin de guardar archivo se utiliza el comando Edit Save buffer. En este entorno, lo referente a buffer equivale a file en un entorno de windows. Con lo cual, con lo visto ya seramos capaces de crear un archivo VHDL, si bien la utilizacin del editor emacs viene justificada por la sencillez en la utilizacin de las plantillas de construcciones tpica de VHDL. Para acceder a las plantillas de VHDL se selecciona VHDL Template, apareciendo las opciones de la figura 10. Dentro de las plantillas podemos introducir tanto datos de organizacin como son la cabecera o la fecha como comandos de VHDL. En ambos casos hay campos en los que el autor debe completarlos, para ello en la ventana de comandos se pregunta por el dato a introducir, el cual, una vez introducido, se valida con 5. Figura 10. Plantillas VHDL. Por ejemplo para introducir las dos primeras lneas de nuestro cdigo se seleccionara la construccin VHDL library y se introduce el nombre ieee (figura 11), el cual es validado con 5, a continuacin nos pedir el nombre del paquete de la librera anterior que queremos seleccionar (comando use). Si se desea introducir otro paquete de la misma u otra librera se utilizar la plantilla use. Figura 11. Plantilla Library. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -14- Una forma ms simple de seleccionar la librera y el paquete consiste en ejecutar el comando VHDL Template Template Package, accediendo a los paquetes ms comunes en VHDL (figura 12). De esta forma, se introduce a la vez la librera que contiene al paquete, y l mismo. Figura 12. Paquetes seleccionables. En nuestro ejemplo si se selecciona el comando VHDL Template Template Package std_logic_1164, aparecenlas siguientes lneas:
library ieee; use ieee.std_logic_1164.all; Existen plantillas en las que algunos campos, segn los casos, no se tiene o quiere introducir datos. En este caso cuando se pidan dichos datos se pulsa 5. Por ejemplos, sto sucede cuando estamos utilizando la plantilla entity y nos pide los nombres de los genricos o los comentarios a aadir a los puertos. A la hora de introducir algunos datos, sobre todo en el caso de palabras reservadas de VHDL, no es necesario introducir todos los caracteres de las mismas, basta teclear los primeros caracteres del comando y con la tecla Tab () se completa. Puede darse el caso, segn los caracteres introducidos, que existan varias opciones, para pasar de una a otra se pulsa nuevamente la tecla Tab. Obviamente, cuantos ms caracteres de la palabra reservada se introduzcan ms rpido se de acceder a l. Esta forma de completar las palabras reservadas de VHDL, tambin se puede realizar con los nombres de los objetos (puertos, seales, etc) declarados en un archivo Una vez completado el nombre de una palabra reservada de VHDL con la tecla Tab, a continuacin se pulsa la barra espaciadora para proceder a completar los campos del comando el valor de cada campo se valida con pulsa 5, pasando a introducir los datos para otro campo, si lo hay. Un caso que merece comentarse es la creacin de un proceso, en el que se nos pregunta si el proceso es secuencial o combinacional, En el primer caso nos pide el nombre de las seales de reloj y reset y a continuacin lo completa con el siguiente cdigo: process (clk, rst) begin -- process if rst ='0' then -- asynchronous reset (active low)
elsif clk'event and clk ='1' then -- rising clock edge
end if; end process; Diseo con VHDL . -15- faltara por introducir el cdigo que modele el funcionamiento asncrono y sncrono. En el caso de los procesos combinacionales se nos pide los objetos que conforman la lista de sensibilidad. Tal y como se dijo al principio, este editor est pensado para trabajar en un entorno UNIX, con lo que no acepta algunos de los comandos tpicos de windows, tal es el caso de Crt+c para copiar y Ctr+v para pegar. Para copiar, tan slo es necesario seleccionar con el cursor la porcin de cdigo que se quiere copiar, pasando de forma automtica al portapapeles. Para pegar se ejecuta el comando Edit Paste. Para poder seleccionar texto con las teclas May(8) y los cursores es necesario teclear: Alt+x, para entrar en la ventana de comandos, y desde aqu se introduce pc-selection-mode. A la hora de utilizar componentes un comando que ahorrar gran cantidad de tiempo es VHDL Port Copy, antes de ejecutarlo es necesario situar el cursor dentro de la declaracin de una entidad. A continuacin se puede realizar el pegado con diferentes opciones (figura 13). Figura 13. Opciones de pegado de Port. Como una entidad: entity contador is port ( rst : in std_logic; EN1HZ : in std_logic; unidades : out std_logic_vector(3 downto 0); decenas : out std_logic_vector(3 downto 0)); end contador; Como un componente: component contador port ( rst : in std_logic; EN1HZ : in std_logic; unidades : out std_logic_vector(3 downto 0); decenas : out std_logic_vector(3 downto 0)); end component; Como una instanciacin u1: contador port map ( rst =>rst_i, EN1HZ =>EN1HZ_i, unidades =>unidades_i, decenas =>decenas_i); Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -16- Como seales signal rst_i : std_logic; signal EN1HZ_i : std_logic; signal unidades_i : std_logic_vector(3 downto 0); signal decenas_i : std_logic_vector(3 downto 0); Como testbench. En este caso se crea un nuevo archivo de nombre el de la entidad seguido de _tb y con el siguiente contenido ------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; ------------------------------------------------------------------------------- entity contador_tb is end contador_tb; ------------------------------------------------------------------------------- architecture simof contador_tb is component contador port ( rst : in std_logic; EN1HZ : in std_logic; unidades : out std_logic_vector(3 downto 0); decenas : out std_logic_vector(3 downto 0)); end component; signal rst_i : std_logic; signal EN1HZ_i : std_logic; signal unidades_i : std_logic_vector(3 downto 0); signal decenas_i : std_logic_vector(3 downto 0); begin -- sim DUT: contador port map ( rst =>rst_i, EN1HZ =>EN1HZ_i, unidades =>unidades_i, decenas =>decenas_i);
end sim; ------------------------------------------------------------------------------- Es posible estar trabajando con ms de un archivo a la vez, para movernos por ello se utiliza el comando buffer. A medida que se va introduciendo cdigo no es necesario prestar atencin a la introduccin de tabulaciones para que el cdigo sea mas legible, existiendo un comando que lo realiza de forma automtica. Este comando es VHDL Beautify Beautify_Buffer. 4. ENTORNO DE SIMULACIN ModelSim. Para verificar la validez de lo diseos VHDL se va a utilizar el simulador ModelSim de Mentor Graphics. 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 ambas opciones, siendo ms potente la utilizacin de comandos, pudiendose englobar un conjunto de ellos en un archivo script que facilita notablemente las tareas de simulacin, el cual se ejecuta como una macro. Adems Diseo con VHDL . -17- cabe indicar que el interface de usuario puede variar de una versin a otra, no ocurriendo esto con los comandos. 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. Para realizar este tutorial se ha empleado la versin 6.0, por lo que algunas de las ventanas mostradas pueden variar ligeramente en otras versiones. Hay que indicar que esta herramienta es case sensitive, distinguiendo entre maysculas y minsculas. Los comando siempre se escriben en minsculas. 4.1 ARRANQUE. Para arrancar el simulador se puede hacer doble clic sobre el icono de acceso directo (figura 14) del escritorio del PC o seleccionando Inicio Programas ModelSim SE 6.0 ModelSim. Figura 14. Icono de la aplicacin. En ese momento se muestra la pantalla que aparece en la figura 15. BARAR DE HERRAMIENTAS VENTANA DE TRABAJ O VENTANA DE TEXTO VENTANA DE EDICIN BARAR DE HERRAMIENTAS VENTANA DE TRABAJ O VENTANA DE TEXTO VENTANA DE EDICIN Figura 15. Pantalla principal de ModelSim. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -18- En la ventana de trabajo pueden aparecer varias pestaas dependiendo de las operaciones realizadas con el diseo: En ella se muestran los archivos fuente que forman parte del diseo, pudiendo ser compilados. Para ello es necesario aadirlos. Visualiza las libreras que podemos utilizar en nuestro diseo. Haciendo clic en +podemos ver los paquetes que incluyen. Muestra la estructura jerrquica de la entidad que se est simulando. Muestra los archivos VHDL que forman parte del diseo que se est simulando. En la ventana de texto donde se introducen los comando y se visualiza los mensajes que se producen durante su ejecucin. Utilizando las teclas de cursor arriba (8) y abajo (9) se puede acceder a los comandos anteriores o posteriores introducidos, para poder ejecutarlos de nuevo. En la ventana de edicin se muestra el contenido de los archivos VHDL seleccionados, permitiendose su modificacin. La barra de herramientas engloba todas las herramientas que se pueden utilizar. Los pasos a dar para simular un diseo son los siguientes. Creacin del proyecto. Creacin de nuevas libreras y mapeado de las libreras a reutilizar. Compilacin del cdigo fuente. 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. Para salir de ModelSim se selecciona File Quit, o se ejecuta el comando quit 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 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 Diseo con VHDL . -19- hacer referencia desde diseo que se est compilando. Estas libreras se declaran mediante las sentencias library y use. 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. 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. 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> El mapeado de 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. 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. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -20- Estas libreras estn optimizadas para la simulacin por lo que no es recomendable que el usuario realice modificaciones sobre ellas. 4.2. CREACIN DE UN 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 del 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 (figura16 ), que permite seleccionar el nombre y ubicacin del proyecto. En el caso de que no exista el directorio seleccionado se crea. Adems crea automticamente la librera work definiendola como la librera de trabajo para este nuevo diseo. Si bien el empleo de proyectos no es obligatorio, su uso facilita la gestin de los diseos. Figura 16. Ventana de dilogo para la creacin de un proyecto En caso de no desear emplear esta facilidad habra que ejecutar los siguientes comandos: cd c:/users mkdir tutorial cd tutorial vlib work Diseo con VHDL . -21- 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. Al seleccionar OK en la figura 16 aparece la figura 17 que permite crear un nuevo archivo fuente (VHDL) o aadir uno ya existente estas opciones se ejecutan si se quiere compilar los archivos desde el interface grfico, posteriormente volveremos sobre esta opcin. Si se va a compilar con comandos desde la ventana de texto se selecciona Close. Figura 17. Ventana de dilogo para la aadir un archivo fuente al proyecto Si se desea editar un archivo VHDL ya creado, por ejemplo con emacs, se utiliza File Open y se selecciona el archivo a editar. Desde la ventana de texto se edita un archivo introduciendo el comando: edit <fichero>.vhd 4.3. COMPILACIN DEL CDIGO FUENTE. Una vez creado el proyecto y los ficheros VHDL que forman parte del diseo se proceder a compilarlos. Para ello se emplea el comando vcom. La sintaxis resumida de este comando es: vcom [-87][-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. 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. Para la compilacin del contador de dcadas se introduce: vcom -93 contador.vhd 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 18 aparece un ejemplo de esto. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -22- Figura 18. Visualizacin automtica de errores en el cdigo fuente Sobre la pantalla de la figura 18 y con el editor de ModelSim, se corrigen los errores, pudiendose realizar tambin con el emacs. Si en la pantalla de la figura 18 no permitiese modificar el archivo es debido a que est abierto en modo lectura, para cambiarlo se pulsa sobre el botn derecho del ratn y se desactiva la opcin Only Read. Para compilar nuevamente el archivo no es necesario teclear otra vez el comando vcom, con las teclas 8 y 9, estando en la ventana de texto, se puede acceder a l. 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. As, para compilar los ficheros fuente del diseo del cronometro se han de ejecutar los siguientes comandos desde la consola de ModelSim: vcom bcd2seg.vhd vcom prescaler.vhd vcom ant_reb.vhd vcom maq_fsm.vhd vcom cnt_cap.vhd vcom crono.vhd vcom crono_tb.vhd Una forma ms sencilla consiste en crear un fichero script en el que se introducen estos comandos. El archivo creado es compila.do, por tanto se debe ejecutar el comando: do compila.do ejecutandose los comandos en el orden introducido. Compilacin desde el entorno grfico Para utilizar el entorno grfico, en primer lugar es necesario aadir los archivos a la ventana de trabajo. Esto se puede hacer utilizando el men de la figura 17 cuando se crea el proyecto o situando el ratn sobre la ventana de trabajo y pulsando el ratn derecho, apareciendo el men de la figura 19, donde se selecciona Add to Project. Los elementos que se pueden aadir son: Diseo con VHDL . -23- ! Un fichero nuevo: el comando Create New File permite crear un nuevo fichero de diseo VHDL como se efectuar posteriormente. ! Un fichero existente: el comando Add Existing File permite incluir un fichero ya existente en el proyecto actual copindolo al directorio del proyecto o referencindolo desde su ubicacin actual. ! Un directorio virtual: cuando el diseo es complejo y consta de muchos ficheros, puede resultar interesante emplear el comando Create New Folder para organizarlos en directorios y subdirectorios. Estos directorios tienen, sobre la pestaa Project del rea de trabajo, un aspecto similar al de los directorios del sistema operativo pero no se crean realmente en el disco, sino que son internos al proyecto. ! Una configuracin para simulacin: El comando Create Simulation permite crear configuraciones para simulacin, es decir, crear una asociacin entre la unidad de diseo y las opciones con las que desea simularse. Figura 19. Men para aadir archivos al proyecto. Al seleccionar el archivo automticamente se aade a la ventana de trabajo (figura 20). El significado de la informacin que aparece en las columnas de la ventana de trabajo es: Status: Indica el estado del archivo: indica que el fichero an no ha sido compilado; que el fichero se ha compilado y contiene errores; que el fichero ha sido compilado con xito. Type: Indica el tipo de fichero (VHDL, Verilog, Folder, Simulation). Order: Indica el nmero de orden que ocupa el fichero en la secuencia de compilacin cuando hay varios ficheros fuente. Modified: Muestra la fecha y hora en que el fichero fue modificado por ltima vez. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -24- Figura 20. Archivo fuente aadido a la ventana de trabajo. Al aadir un archivo, se abre automticamente la ventana del editor de texto del entorno con dicho archivo. En el caso de aadir ms de un archivo si se desea editar uno en particular se hace doble clic sobre l. Para compilar el o los archivos se puede seleccionar el men Compile de la barra de herramientas o pulsando el botn derecho del ratn sobre la ventana de trabajo (figura 21), indicando cual o cuales de los archivos de la ventana de trabajo se van a compilar. Figura 21. Men para compilar los archivos. Con la opcin Compile Order se puede modificar el orden de compilacin. En el caso de que el proyecto se quiera compilar en otro ordenador o en otro proyecto, a parte de copiar en l los archivos fuentes habra que aadirlos a la ventana de trabajo y volver a compilarlos. Cosa que no sucede si se utiliza un script, en el que slo es necesario ejecutar este ltimo. 4.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>][-sdfmin | -sdftyp | -sdfmax <instancia>=<fichero_sdf>]<entidad>[<arquitectura>] |[ <configuracin>] Como se puede observar todos los parmetros son opcionales excepto el que indica la unidad de diseo superior. Este ltimo indica la entidad a simular, siendo posible especificar tambin Diseo con VHDL . -25- la arquitectura concreta a emplear. Esto resulta especialmente til cuando la entidad dispone de varias arquitecturas. Por ejemplo si se deseara simular el contador de dcadas el comando a emplear sera: vsim contador rtl o bien simplemente: vsim contador 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 (work). 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. 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, cosa que no se va a utilizar en este diseo, ya que tan slo nos limitaremos a realizar una simulacin funcional del mismo. 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 entidad crono_tb, que adems slo tiene una nica arquitectura. Por lo que el comando a emplear sera: vsim crono_tb 4.5. SELECCIN DE PUNTOS DE PRUEBA. La verificacin del diseo mediante simulacin se basa en observar los distintos elementos que aparecen en l. Por analoga con un simulador digital clsico a los puntos del circuito a observar (seales) los denominaremos puntos de prueba, si bien en diseos descritos en VHDL la variedad es ms amplia: puertos, variables, seales, procesos en ejecucin, etc. Tal y como muestra la figura 22 el simulador define un total de siete ventanas ms destinadas a representar los distintos tipos de elementos. Estas ventanas son: Unidades Valor Unidades Valor fs 10 -15 sg ms 10 -3 sg ps 10 -12 sg sec segundos ns 10 -9 sg min minutos us 10 -6 sg hr horas Tabla 1.1: Nomenclatura empleada para especificar unidades de tiempo. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -26- ! workspace o 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 el cdigo fuente del archivo seleccionado en el workspace cuando se activa la pestaa . Se suele emplear para ejecutar el cdigo paso a paso. ! wave. Permite representar los cronogramas de la evolucin de las seales y variables del diseo. ! objects o signal. Muestra las seales y puertos contenidos en el nivel seleccionado en el workspace . ! locals. Muestra las variables de una entidad. ! process. Proporciona informacin del estado de ejecucin de los procesos. ! dataflow. La ventana de flujo de datos permite realizar un seguimiento grfico de la conexin de procesos mediante las seales del diseo. ! list. La ventana de listado permite observar los resultados de la simulacin de forma tabular y reflejando los ciclos delta Figura 22. Ventanas del simulador. Para abrir una de estas ventanas se emplea el comando view cuyo formato es: view <nombre_ventana> Este comando admite el carcter comodn * . As el siguiente comando abre todas las ventanas citadas: view * 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. Diseo con VHDL . -27- Para abrir esta ventana seleccione la opcin View Debug windows 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 workspace de la barra de mens, o bien ejecute el comando: view structure tambin es vlido: view workspace. De forma similar, para abrir la ventana de seales seleccione la opcin View Debug windows Objects de la barra de mens, o bien ejecute el comando: view signal tambin es vlido: view objects. Tal y como muestra la figura 23 al seleccionar un nivel en la ventana de estructura, se muestran todas las seales contenidas en dicho nivel sobre la ventana de formas de onda. Figura 23. Seleccin de las seales en un determinado nivel jerrquico. Una vez mostradas las seales de inters en la ventana de seales se proceder a aadirlas a la ventana de formas de onda. Para ello se seleccionan las seales en cuestin en la ventana de seales y a continuacin se pulsa el botn derecho del ratn, seleccionando una de las posibles opciones (figura24). Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -28- Figura 24. Seleccionar seales a visualizar en la ventana wave. Una forma ms simple, consiste en seleccionar y arrastrar las seales o puertos hasta la ventana wave. Una vez finalizado este proceso la ventana de formas de onda presenta el aspecto mostrado en la figura 25. Figura 25. Objetos aadidos a la ventana wave. 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 (locals). 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 (figura 26)que aparece al seleccionar una seal determinada y pulsar a continuacin el botn derecho del ratn (o con Format de la barra de mens). Diseo con VHDL . -29- Figura 26. Parmetros de los objetos de la ventana wave 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. Para ello seleccione la opcin File Save Format de la barra de mens de la ventana wave, o pulsando sobre . 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 la jerarqua En el caso de las variables, se especificar el camino hasta la arquitectura donde reside el proceso que contiene la variable. Asi. por ejemplo, para aadir la seal state de la entidad maq_fsm se pondra: add wave dut/u4/u2/state 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 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 27 muestra un ejemplo de esto. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -30- Figura 27. Ejemplo de representacin analgica de seales. Una descripcin ms detallada de los formatos analgicos, como de los digitales, se encuentra en el manual del simulador, al que se puede acceder desde Help de la barra de mens. En el ejemplo del contador de dcadas, para analizar el funcionamiento del sistema se van a observar sus puertos, las seales de cuenta (Cntunidades y Cntdecenas). Segn esto los comandos a ejecutar seran: add wave rst add wave clk add wave en1hz add wave -radix unsigned Cntunidades add wave -radix unsigned Cntdecenas add wave -radix unsigned unidades add wave -radix unsigned decenas 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 los objetos 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. add wave -noupdate -format Logic /contador/rst add wave -noupdate -format Logic /contador/clk add wave -noupdate -format Logic /contador/en1hz add wave -noupdate -format Literal -radix unsigned /contador/cntunidades add wave -noupdate -format Literal -radix unsigned /contador/cntdecenas add wave -noupdate -format Literal -radix unsigned /contador/unidades add wave -noupdate -format Literal -radix unsigned /contador/decenas Los comandos utilizados para cargar el diseo a simular y configurar la ventana de formas de onda se recogen en el script contador.do proporcionado. Simulacin desde el entorno grfico. Para simular una entidad desde el interface grfico, se selecciona la pestaa Library del worspace, se abre la librera work y se hace doble clic sobre la entidad a simular. En el caso de que dicha entidad tuviera ms de una arquitectura, se hara doble clic sobre la arquitectura deseada (figura 28). Diseo con VHDL . -31- Figura 28. Seleccin de la entidad simular. 4.6. INTRODUCCIN DE ESTMULOS. Normalmente los estmulos del diseo se introducen mediante el cdigo del fichero de un banco de pruebas o testbench. Sin embargo en un diseo tpico el sistema est compuesto por varios mdulos ms sencillos que se instanciarn en el diseo final. Antes de obtener el diseo final ser preciso validar los mdulos que lo componen. La realizacin de un banco de pruebas para cada uno de estos mdulos tan sencillos puede resultar una tarea tediosa. Para solventar esta situacin se puede emplear el comando force, que permite introducir estmulos sobre las seales resueltas del diseo de una forma sencilla. La sintaxis general de este comando es: force <nombre_seal><valor 1 ><tiempo 1 >, <valor 2 ><tiempo 2 >... Con este formato se introducen los estmulos especificados en pares (valor, instante de tiempo) para la seal en cuestin. Cuando se trata de una seal interna en el nombre se debe especificar el camino completo en la jerarqua del diseo. Los valores a asignar a una seal deben ajustarse al tipo de datos de misma. Los instantes de tiempo pueden expresarse en formato relativo al instante actual de simulacin o en valor absoluto respecto al origen de tiempos (t=0). En este ltimo caso se ha de aadir el prefijo @. Por defecto las unidades en que se expresan los tiempos coincide con la resolucin del simulador (ns). Existe un conjunto de parmetros adicionales que permiten introducir estmulos peridicos. Estos son: -repeat <periodo> Repite el comando force con el periodo de tiempo especificado. -cancel <tiempo> Cancela el comando force una vez transcurrido el tiempo especificado. A continuacin se muestran varios ejemplos del uso de este comando. force clr 0 Fuerza clr a 0 en el instante actual de simulacin. force bus1 01XZ 100 ns Fuerza bus1 a 01XZ 100 ns despus del instante actual de simulacin. force bus2 16#4F @200 Fuerza bus2 a 4Fh 200 unidades de tiempo (especificadas por la resolucin de simulacin) desde el inicio de sta. force clk 0 0, 1 25 -repeat 50 Genera una seal de periodo 50 ns con un ciclo de trabajo del 50% force clk 0 0, 1 20 -repeat 50 -cancel 1000 Fuerza clk a 0 en el instante actual de simulacin, 20 unidades de tiempo despus pasa a 1. Esto se repite cada 50 unidades de tiempo hasta alcanzar 1000 unidades de tiempo. Por tanto el siguiente 1 ocurrir en la unidad de tiempo 70. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -32- Segn lo expuesto para validar de forma individual el mdulo contador se empleara la siguiente secuencia de comandos: vcom contador.vhd vsim contador add wave rst add wave clk add wave en1hz add wave -radix unsigned Cntunidades add wave -radix unsigned Cntdecenas add wave -radix unsigned unidades add wave -radix unsigned decenas force clk 0, 1 50 -r 100 force en1hz 1 force rst 0 run 200 force rst 1 run 5 us force en1hz 0 run 500 force en1hz 1 run 1 us En la figura 29 se muestra el resultado de la simulacin del contador de dcadas con los aplicando los comandos anteriores. Figura 29. Resultado de la simulacin del contador de dcadas. El comando force se emplea para aplicar estmulos a seales resueltas. En el caso de que se aplique un estmulo a una seal interna del diseo, el cdigo VHDL 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 del cronmetro, considerado la salida del sistema cambia cada segundo se precisara mucho tiempo para verificar el diseo. Para reducir el tiempo de simulacin se forzar la salida del preescaler (seal EN1Hz) a 1 mediante el comando: force -freeze crono_tb/dut/u3/en1hz 1 En el caso de utilizar la opcin freeze con un comando force, para desactivarla se debe ejecuta primeramente el comando noforce. Por ejemplo para el caso anterior se utilizara: Diseo con VHDL . -33- noforce crono_tb/dut/u3/en1hz Lo mismo sucede cuando a un puerto se le asigna una seal peridica com la opcin -r. As, por ejemplo, para la generacin de valores para la seal EN1HZ se podra aplicar el comando: force en1hz 1, 0 100 -r 5us para generar una seal de 200 Khz, que est a nivel alto 100 ns. Si a continuacin, para un nuevo paso simulacin, se quisiera fijar dicha seal a un nivel fijo, por ejemplo a nivel alto, se debern utilizar los comandos: noforce en1hz force 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 crono_tb.do proporcionado. vcom bcd2seg.vhd vcom prescaler.vhd vcom ant_reb.vhd vcom maq_fsm.vhd vcom cnt_cap.vhd vcom crono.vhd vcom crono_tb.vhd vsim crono_tb add wave rst_i add wave clk_i add wave dut/u3/en1hz add wave dut/u3/en200hz add wave captura_i add wave dut/u4/p_i add wave dut/u4/ce add wave -radix unsigned dut/cntunidades add wave -radix unsigned dut/cntdecenas add wave -radix unsigned dut/unidades add wave -radix unsigned dut/decenas add wave displayunidades_i add wave displaydecenas_i run 5.5 sec force -freeze crono_tb/dut/u3/en1hz 1 run 100 ms La figura 30 muestra el aspecto de la ventana wave obtenida al ejecutar el script anterior, donde se puede comprobar el funcionamiento correcto del diseo. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -34- Figura 30. Resultado de la simulacin del cronmetro. Para aplicar valores a los objetos desde el interface grfico, en la ventana wave se selecciona el objeto al que se le va a asignar un valor, se pulsa el botn derecho del ratn y se selecciona la opcin force, apareciendo el cuadro de dialogo de la figura 31, donde se selecciona el valor que se le va a asignar y el instante de tiempo. Figura 31. Asignacin de valores. 4.7. AVANCE Y DETENCIN DE LA SIMULACIN. Para provocar un avance de la simulacin se emplea el comando run, siendo su sintaxis: run[<magnitud>[<unidades_tiempo>]] | <modo> El tiempo a avanzar en la simulacin se puede especificar de varias formas, de acuerdo a una serie de modos predeterminados. Una primera especificacin del tiempo de simulacin es: run[<magnitud>[<unidades_tiempo>]] En este formato se avanza el tiempo especificado por el parmetro. Este tiempo se da como un valor numrico seguido de unas unidades de tiempo empleando para ello el formato descrito en la tabla 1.1. Si no se especifican las unidades se entiende que el tiempo viene expresado en la resolucin del simulador (por defecto es 1ns). Por ejemplo, el siguiente comando provocara un avance en la simulacin de 400 ns: run 400ns Otra forma de emplear el comando run responde al formato: run<modo> Diseo con VHDL . -35- donde el parmetro <modo> puede ser uno de los siguientes valores: ! -all: Ejecuta la simulacin indefinidamente hasta que sta se detenga debido a un punto de ruptura, a un error de simulacin, a una sentencia assert o que se pulse . ! -step: Avanza la simulacin hasta la siguiente sentencia VHDL. ! -stepover: Es exactamente igual que la anterior salvo que las llamadas a procedimientos o funciones se tratan como una nica sentencia, ejecutandose de una vez. ! -continue: Continua la simulacin desde el punto en que se detuvo debido a un punto de ruptura. ! -next: Ejecuta la simulacin hasta el siguiente evento. Segn esto el comando: run -all ejecutara la simulacin del ejemplo hasta que se detuviera debido a una de las causas antes comentadas. 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 32. En ella se puede seleccionar qu elementos mantendrn la configuracin fijada durante la sesin de simulacin actual. Figura 32. Ventana Restart. Si durante la sesin de simulacin se descubre un error de diseo que obliga a modificar el cdigo fuente ser preciso finalizar la simulacin mediante el comando quit -sim. A continuacin se modifica el cdigo fuente, se compila y se vuelve a cargndolo de nuevo tal y como se ha descrito. En la barra de herramientas se encuentran otros iconos que permiten controlar el avance del tiempo del simulador: Permite selecciona la cantidad de tiempo que avanza la simulacin cuando se ejecuta el comando run. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -36- run. run -continue run -all Parar la simulacin (break). run - step run - step over restart Merece la pena hacer hincapi 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. 5. ANLISIS DE RESULTADOS. En este apartado se comentar como navegar por la ventana de cronogramas as como la realizacin de mediciones de tiempos. Para ajustar el zoom de la visualizacin se emplean cuatro elementos que aparecen en la barra de herramientas: ! Zoom de acercamiento. ! Zoom de alejamiento. ! Muestra la totalidad de los cronogramas. ! Zoom de un rea. Para realizar medidas de tiempo se emplean los cursores, los cuales se aaden con el elemento . La primera vez que se pulsa este botn aparece el cursor principal, que tal y como muestra la figura 34 ste aparece como una lnea naranja 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 . Esto es especialmente til para 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 . Diseo con VHDL . -37- Figura 34. Medida de tiempos. Sobre la figura 34 se puede observar como algunos bits del puerto unidades pasan a valor desconocido X cuando el contador empieza a contar. Esto es debido que sobre una seal o puerto se est realizando una asignacin desde ms de una sentencia concurrente. Para averiguar donde se realiza esa doble asignacin se utiliza la ventana dataflow. Para ello, en la ventana wave, se selecciona unidades y se pulsa , abriendose la ventana dataflow. A continuacin, sobre esta ltima ventana se selecciona el comando Navigate View region, apareciendo un diagrama simblico con la estructura del diseo (figura 35). En dicha figura se puede observar como a unidades se realiza una doble asignacin concurrente en las lneas 42 y 20 del archivo fuente. Para subsanar el error es necesario eliminar la lnea: unidades <=(others =>'0'); Figura 35. Ventana dataflow. Una ver realizada la correccin se vuelve a simular el diseo, obteniendose los resultados de la figura 36. Como se puede comprobar, ahora el diseo funciona correctamente. Figura 36. Resultado de la simulacin del contador de dcadas. Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -38- Para llevar el cursor a instante en que un elemento de la ventana wave toma un determinado valor se utiliza, una vez seleccionado el objeto, el comando Edit Search, apareciendo el men de la figura 37, donde se selecciona las opciones de bsqueda. Para indicar un valor de un objeto vector, ste se pondr entre comillas dobles, en binario o en decimal (0011" 3"). En el caso de ser individual se pondr 0 1. Figura 37. Opciones de bsqueda. 5.1.PUNTOS DE RUPTURA. Una de las posibilidades ms empleadas en los simuladores son los puntos de ruptura (breakpoints). ModelSim permite trabajar con dos tipos de puntos de ruptura. El primero de ellos se fija sobre las lneas de cdigo de la ventana de cdigo fuente (source). Este tipo de puntos de ruptura se asemeja al empleado por los depuradores de software. Para activar un punto de ruptura de este tipo basta con pulsar con el ratn sobre la lnea en la que queremos poner el punto de ruptura, apareciendo un punto de color rojo(figura 38). Para desactivarlo basta con una nueva pulsacin. Cuando se ejecuta la lnea de cdigo marcada se detiene la simulacin. Figura 38. Colocacin de un punto de ruptura Los puntos de ruptura tambin se pueden introducir desde la ventana de texto mediante el comando bp. El formato empleado es: bp <nombre_fichero><nmero_de_lnea> Diseo con VHDL . -39- El segundo formato, denominado condicional, se asemeja al concepto empleado por un simulador digital, permitiendo asociarlo a seales, para ello se utiliza el comando when, cuya sintaxis es: when [-label <nombre>] {<expresin_condicin>} {<accin>} El parmetro -label asigna el identificador <nombre> al punto de ruptura definido. El parmetro <expresin_condicin> define la condicin a evaluar en el punto de ruptura. Cuando esta expresin es cierta se dispara el punto de ruptura. La sintaxis de esta expresin responde al siguiente formato: subexpresin 1 operador_lgico subexpresin 2 operador_lgico subexpresin 3 ... Las subexpresiones vienen dadas por operadores relacionales y atributos de deteccin de eventos. Los operadores que se pueden utilizar son: siguientes ejemplos muestran las situaciones admitidas. ! Igualdad. clk =1' clk==1' ! Desigualdad Cntdecenas /=0000" ! Deteccin de eventos: clkEVENT Los operadores de igualdad y desigualdad slo admiten como segundo parmetro un literal, es decir no se puede comparar el estado de dos seales. Los operadores lgicos que ligan las subexpresiones pueden ser el operador and o el operador or. En la expresin condicional se admite el empleo de parntesis para establecer la prioridad con que se evalan las distintas subexpresiones.
El parmetro <accin> define la secuencia de comandos a del simulador a ejecutar cuando se dispara el punto de ruptura. Este parmetro es opcional, si no se indica la accin a realizar consiste en detener la simulacin. Por ejemplo, para simular el contador de dcadas se podra aadirlos siguientes el siguientes comandos: when -label pto1 { unidades=001"} {echo "unidades toma el valor 3" stop} run -all As, la simulacin se realizar hasta que unidades tome el valor 3 (binario-0011), apareciendo en la ventana de texto: unidades toma el valor 3 Electrnica Industrial. Laboratorio de Tecnologa Electrnica I. -40- 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 6. FINALIZAR LA SESIN DE SIMULACIN. La simulacin de un diseo permite comprobar el correcto funcionamiento del mismo. Desde que se crean un diseo hasta que se van a realizar varias simulaciones hasta depurar y obtener el cdigo correcto, por lo que ser preciso finalizar la sesin de simulacin, modificar el cdigo fuente, compilar y volver a simular. Para finalizar la sesin de simulacin se emplea el comando: quit -sim Notese que el finalizar la sesin de simulacin no supone cerrar ModelSim. El uso de este comando tiene su inters cuando el cdigo VHDL hace uso de ficheros. Una prctica muy habitual es emplear fichero del cual se toma la secuencia de estmulos (vectores de test) a aplicar al diseo. Por ejemplo en el caso de sistemas de tratamiento digital de seal implementados en FPGAs, el bando de pruebas puede obtener los datos a procesar desde un fichero previamente creado mediante Matlab. De forma similar los resultados del procesamiento se pueden almacenar en un fichero de salida para su posterior anlisis. En este caso, el simulador abre el ficheros de salida al cargar la unidad de diseo a simular, manteniendo el control sobre ste por lo que no se puede acceder a su contenido hasta que no finalice la sesin de simulacin. En ese momento el fichero de salida puede abrirse con otra herramienta. 7. METODOLOGA DE TRABAJO. En la descripcin realizada a cerca del manejo del simulador se ha hecho especial hincapi en su uso mediante comandos, prestandose menos inters al uso del interface grfico. Aparentemente el uso de comandos puede parecer ms complejo debido al esfuerzo inicial que supone la creacin de estos ficheros. Pero hay que tener en cuenta que en raras ocasiones se obtiene a la primera un diseo totalmente correcto. En tal caso la verificacin del diseo mediante simulacin se convierte en un proceso iterativo consistente en modificar el cdigo fuente, compilarlo, simular y observar los resultados. A esto hay que aadir que este esfuerzo inicial que supone la creacin de los ficheros de script se ve recompensado por la facilidad de poder reutilizarlos. As los scripts creados para la simulacin funcional se pueden reutilizar con leves modificaciones en la simulacin temporal. Adems en su formato bsico no varan demasiado de un diseo a otro, por lo que tambin se suelen reutilizar en este caso.