tutorial vhdl

42
DISEÑO CON VHDL LABORATORIO DE TECNOLOGÍA ELECTRONICA I. ITT DPTO. ELECTRÓNICA- UNIVERSIDAD DE ALCALÁ.

Upload: jadacuor

Post on 30-Jun-2015

1.573 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: tutorial vhdl

DISEÑO CON VHDL

LABORATORIO DE TECNOLOGÍA ELECTRONICA I. ITT

DPTO. ELECTRÓNICA- UNIVERSIDAD DE ALCALÁ.

Page 2: tutorial vhdl

Diseño con VHDL .

-i-

ÍNDICE0. INTRODUCCIÓN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1. DESCRIPCIÓN DEL DISEÑO A REALIZAR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2. ARCHIVOS FUENTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1. MÓDULO BCD2SEG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2. MODULO PRESCALER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3. MÓDULO CONTROL VISUALIZACIÓN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Módulo antirrebotes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Módulo Máquina de estados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.4. MÓDULO CRONO.VHD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Contador de décadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Registros de visualización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.5. BANCO DE PRUEBAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3. CREACIÓN DE LOS ARCHIVOS FUENTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4. ENTORNO DE SIMULACIÓN ModelSim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.1 ARRANQUE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Librerías. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2. CREACIÓN DE UN PROYECTO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.3. COMPILACIÓN DEL CÓDIGO FUENTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Compilación desde el entorno gráfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.4. CARGA DE LA UNIDAD DE DISEÑO A SIMULAR. . . . . . . . . . . . . . . . . . . . . 244.5. SELECCIÓN DE PUNTOS DE PRUEBA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Simulación desde el entorno gráfico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.6. INTRODUCCIÓN DE ESTÍMULOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.7. AVANCE Y DETENCIÓN DE LA SIMULACIÓN. . . . . . . . . . . . . . . . . . . . . . . . 34

5. ANÁLISIS DE RESULTADOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.1.PUNTOS DE RUPTURA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

6. FINALIZAR LA SESIÓN DE SIMULACIÓN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

7. METODOLOGÍA DE TRABAJO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Page 3: tutorial vhdl

Diseño con VHDL .

-1-

0. INTRODUCCIÓN.

El objetivo perseguido con la elaboración de este tutorial es familiarizar al alumno con el diseñode sistemas digitales en VHDL. El proceso de diseño se divide en tres fases: creación,compilación y simulación.

Para la creación de los archivos fuente se puede utilizar cualquier editor de textos, aunque serecomienda emacs debido a que tiene precargadas plantillas con la sintaxis de VHDL, lo quefacilita de forma notable la creación de dichos archivos.

Para la compilación y simulación se va a utilizar Modelsim de Mentor Graphics. Estaherramienta es suficientemente potente como para pretender conocerla en su totalidad con estetutorial. Si bien, se proporcionarán los conocimientos básicos para poder manejarla. El usuariopara profundizar en su manejo puede acceder en todo momento a los manuales completosde la herramienta proporcionados por el fabricante, tanto en formato HTML como en PDF.

1. DESCRIPCIÓN DEL DISEÑO A REALIZAR.

Para ilustrar el proceso de diseño de un sistema digital en VHDL se empleará como ejemplode diseño la realización de un cronometro digital con precisión de segundos y valor máximo decuenta de un minuto. Con este diseño se pretende ilustrar las situaciones más frecuentes queaparecen en los diseños con VHDL. La figura 1 muestra el diseño a realizar. En el archivoenunciado.pdf se indican las condiciones de funcionamiento impuestas.

MARCHA

DisplayUnidades

DisplayDecenas

Vcc

R R

MARCHAUPDOWNRSTCAPTURA

Vcc

OSCILADOR

CLK

Figura 1. Diseño a realizar.

La señal de reloj del sistema proviene de un oscilador externo, que proporciona una señal(CLK) de frecuencia 10 MHz y ciclo de trabajo del 50%. El número de segundos (unidades ydecenas de 00 59) transcurridos se visualizará sobre sendos displays de 7 segmentos decátodo común. El sistema dispone de un pulsador RST para inicializar (puesta a cero) la cuentadel tiempo. Además, se dispone de otro pulsador (CAPTURA) para implementar la función decongelación de la visualización. Al pulsar este pulsador se congela el tiempo actual de formaque sobre los displays se muestra dicho instante de tiempo mientras que el cronómetro siguecontando internamente. Al volver a pulsar este pulsador se refresca la visualización, mostrandoel tiempo transcurrido actualmente. Hay que hacer notar que los pulsadores son elementosmecánicos con lo que cada vez que se actúa sobre ellos se producen rebotes (figura 2) siendosus amplitudes y duraciones aleatorias, si bien se sabe que su duración nunca excede de los5 ms .

Page 4: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-2-

< 5 ms < 5 ms

Figura 2. Rebotes producidos en los pulsadores.

Para implementar el sistema se ha realizado un diseño jerárquico como el mostrado en la figura3. Realizandose una realización estructural del diseño. El componente BCD2SEG realiza lafunción de un decodificador BCD a 7 segmentos para displays de cátodo común, cuyofuncionamiento viene especificado en el fichero bcd2seg.vhd. Este decodificador se instanciarácomo sendos componentes en la entidad de mayor jerarquía declarada en el fichero crono.vhd.En esta entidad se instancia también el componente PRESCALER que proporciona una señalde 1 Hz empleada para contar los segundos, obtenida a partir de la señal de 10 MHz. La señalde 1 Hz se obtiene de dividir la frecuencia de la señal de reloj CLK por un factor de 107. Estecomponente se modela en el archivo prescaler.vhd. Así mismo, también se proporciona unaseñal de 5 ms a utilizar por el componente ANTIRREBOTES. El proceso CONTADOR es elencargado de medir el tiempo transcurrido. Para lo que se modela un contador BCD de dosdécadas o dígitos (unidades y decenas).

BCD2SEG

BCD2SEGCONTADOR0-59PRESCALER

prescaler.vhd

crono.vhd

CAPTURA

bcd2seg.vhd

REGISTROS

EN

ENEN1HZDIVISOR

10 y 5.107 4

CLK

RST

SETP P

CE

ANTIRREBOTES MÁQUINA DE ESTADOS

ant_reb.vhd maq_fsm.vhdCONTROL DE LA VISUALIZACIÓN

cnt_cap.vhdEN200Hz

Figura 3. Diagrama de bloque del sistema a diseñar.

En la jerarquía de mayor nivel, también, se instanciará el componente CONTROL DE LAVISUALIZACIÓN, el cual, a su vez, corresponde con un diseño jerárquico formado por loscomponentes ANTIRREBOTES y MAQUINA DE ESTADOS, encargado de controlar lahabilitación de los registros que permiten la congelación de la visualización y se ubican entreel contador 0-59 y los decodificadores BCD a 7 segmentos. Cuando la señal de habilitación deestos registros está activa sus salidas reflejan el valor actual de cuenta. Si por el contrario laseñal de habilitación está desactivada no se actualiza la salida del contador sobre los displays,implementando de esta forma la función de congelación.

La señal de habilitación de estos registros se controla mediante una máquina de estados querecibe como entrada la señal procedente del pulsador de CAPTURA, una vez eliminados losposibles rebotes, y cuyo grafo se muestra en la figura 4. La variable P indica el estado delpulsador: 1 sin pulsar, 0 pulsado.

Page 5: tutorial vhdl

Diseño con VHDL .

-3-

P=1

P=0

P=1

P=1

P=1

P=0

P=0P=0

S30

S20

S41

S11

Figura 4. Grafo de la máquina de estados.

Inicialmente la máquina 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, inhabilitandoseel refresco de los registros (CE= 0). Se permanece en este estado mientras el pulsador seencuentre activado. Al liberarse (P=1) se pasa al estado S3 (CE= 0), donde se espera hastaque 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 elpulsador permanece activado, pasando a S1 al liberarse.

Para saber si la señal procedente del pulsador está libre de rebotes es suficiente conexaminarla en varios instantes de tiempo, de forma que si en todos ellos el valor es ‘0' o ‘1' sepuede considerar que la señal no tiene rebotes. El intervalo de tiempo muestreado deberá sersuperior a 5 ms. Para realizar este filtrado de los rebotes se puede utilizar el circuito de la figura5. En este caso, como se utiliza una señal(EN200Hz) de periodo 5 ms para habilitar losbiestables tipo D, el intervalo muestreado es de 20 ms.

CA PTURA D

C

CE

Q

SE

T

D

C

CE

Q

SET

D

C

CE

Q

SET

P

EN200HZ

CL K

SET

D

C

CE

Q

SET

S

R

CE

C

Q

SET

Figura 5. Diagrama de bloques del circuito antirebotes.

Así, la descripción VHDL de este diseño está compuesta por los siguientes ficheros, listadosde menor a mayor jerarquía (orden que se deberá mantener en la compilación). Indicar que elúltimo de ellos (crono_tb.vhd) es un testbench utilizado para simular el diseño.

! bcd2seg.vhd.! prescaler.vhd.! ant_reb.vhd.! maq_fsm.vhd.! cnt_cap.vhd.! crono.vhd! crono_tb.vhd

Page 6: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-4-

Una vez descrito el comportamiento del diseño se pasará describir los archivos VHDL creadospara modelarlo. En el archivo codigo.zip se encuentran todos los ficheros VHDL necesariospara realizar la aplicación antes descrita. Estos archivos se almacenarán en el directorio raízdel diseño.

En el archivo script.zip se encuentran archivos scripts a utilizar con la herramienta decompilación y simulación que permitirán simplificar la fase de diseño. A lo largo de este manualse irán explicando la funcionalidad de cada uno de ellos.

2. ARCHIVOS FUENTE.

A continuación se muestra el código VHDL de cada uno de los archivos que forman el diseño.

2.1. MÓDULO BCD2SEG.

El modelo del decodificador BCD a 7 segmentos se almacena en el fichero bcd2seg.vhd. Ladecodificación se realiza mediante una asignación concurrente de señal seleccionada tal ycomo se muestra en el siguiente listado. La salida de este módulo es un bus de 7 líneas dondela 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)); --gfedcbaend 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;

Page 7: tutorial vhdl

Diseño con VHDL .

-5-

2.2. MODULO PRESCALER.

Para realizar la división de la frecuencia de la señal de entrada se emplean contadores. En estecaso para optimizar los recursos en el caso de que el diseño se implementara en una FPGA,los factores de división son 107 y 5.104, se han implementado tres contadores: el primero dividepor 10000, el segundo por 5 y el tercero por 1000. Los contadores segundo y tercero al haceruso de la señal FC como habilitación proporcionan un factor de división de 5.104 y 107

respectivamente. Como las señales de fin de cuenta se van a utilizar para habilitar otrossistemas secuenciales, que utilizan la señal de 10 MHz como señal de reloj, deben estar a nivelalto 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;

Page 8: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-6-

2.3. MÓDULO CONTROL VISUALIZACIÓN.

Este modulo es el encargado de activar la señal de habilitación de los registros que congelanla visualización del tiempo. Para su creación se ha realizado un diseño jerárquico que utilizalos bloques ANTIRREBOTES y MAQUINA DE ESTADOS, los cuales se modelan en lasentidades ant_reb y maq_fsm, repectivamente.

Módulo antirrebotes.

Es el encargado de eliminar los rebotes que se producen al pulsar y liberar el pulsador. Lafunción 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;

Módulo Máquina de estados.

Atendiendo al grafo de la figura 4, la maquina a modelar es del tipo Moore, cuyo diagrama debloques se muestra en la figura 6. En este caso se ha optado por modelar la máquina utilizandodos procesos: uno, secuencial, para controlar las transiciones entre estados y otro,combinacional, para generar la salida de la máquina.

Lógicacombinacional

Proceso secuencial Proceso combinacional

Lógicasecuencial

Lógicacombinacional

Cálculo del próximo estado

Cálculo de las salidas.

Elementosde memoria

Rst

Clk

Próximoestado Estado

actualP

CE

Figura 6. Diagrama de bloques de la máquina de estados.

Page 9: tutorial vhdl

Diseño con VHDL .

-7-

Para representar el estado de la máquina se ha definido el tipo enumerado stateFSM quepuede tomar los valores correspondientes a dichos estados. El valor del estado actual de laFSM se almacena en la señal state. La salida de la FSM es la señal ce que toma el valor cerocuando la cuenta está congelada. El código completo que modela la maquina de estados esel mostrado a continuación.

library ieee;use ieee.std_logic_1164.all;

entity maq_fsm is port ( p : in std_logic; rst : in std_logic; clk : in std_logic; ce : out std_logic);end maq_fsm;

architecture rtl of maq_fsm is -- 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 visualización está compuesto por la instanciación de losdos últimos componentes: ant_reb y maq_fsm, siendo su código el mostrado a continuación

Page 10: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica 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. MÓDULO CRONO.VHD.

Este es el fichero principal o raíz del diseño sobre el que se instancian los componentesbcd2seg, prescaler y cnt_cap. El resto de los módulos que aparecen en el diagrama debloques de la figura 1.4 (contador y registros) aparecerán como procesos dentro de laarquitectura del cronometro, a continuación se detalla el funcionamiento de estos doselementos.

Contador de décadas.

Este contador se implementa mediante el proceso cuyo listados se muestra a continuación.Dicho proceso es sensible a las señales de reset asíncrona (rst) y reloj (clk). El carácterasíncrono de la señal de reset se fija mediante la posición de la sentencia if dentro de laestructura de if anidados que evalúa su estado. El valor de cuenta se almacena sobre lasseñales CntUnidades y CntDecenas. Estas señales están declaradas de tipo unsigned. Estees un tipo derivado de std_logic_vector que permite realizar operaciones aritméticas. El valorde cuenta sólo se modifica si la señal EN1HZ está a 1. Esta señal se obtiene del móduloprescaler.

Page 11: tutorial vhdl

Diseño 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 visualización.

Los registros empleados para implementar la función de congelación de la visualización sedescriben 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 señal CE correspondiente a la salida de la FSM está a uno (visualización no congelada)las señales Unidades y Decenas reflejan el valor de cuenta en cada flanco activo de la señalde reloj. Las cuales se conectan a las entradas de los decodificadores BCD a 7 segmentos.Hay que destacar que estas señales son de tipo std_logic_vector mientras que las señales decuenta CntUnidades y CntDecenas son de tipo unsigned. Por este motivo es preciso emplearuna conversión “cast” en la asignación.

2.5. BANCO DE PRUEBAS.

A continuación se proporciona el listado del fichero VHDL correspondiente al banco de pruebasempleado para validar el diseño. Se trata de una entidad sin puertos. En la parte declarativade la arquitectura se declara el componente a verificar (crono) y un conjunto de señalescorrespondientes a cada uno de los puertos de dicho componente. Éstas son fácilmentereconocibles porque tienen el sufijo _i.

Page 12: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-10-

library IEEE;use ieee.std_logic_1164.all;

entity crono_tb isend crono_tb;

architecture simula of crono_tb is

constant REBTIME : time := 50 us; -- Tiempo de duración de un rebote. constant PUSHTIME : time := 100 ms; -- Tiempo de duración de una tecla. constant RSTTIME : time := 10 ms; -- Tiempo de activación del reset. constant Tclk : time := 100 ns; -- Periodo de la señal de reloj.

-- Declaración 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;

-- Señales auxiliares para de excitación 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-- Instantación del componente crono. dut : crono port map ( captura => captura_i, rst => rst_i, clk => clk_i, DisplayUnidades => DisplayUnidades_i, DisplayDecenas => DisplayDecenas_i);

-- Generación de la señal de reset. rst_i <= '1' after RSTTIME;

-- Generación de la señal de reloj.

clk_i <= not clk_i after Tclk/2;

-- Proceso principal control de la excitacion. process -------------------------------------------------------- -- PULSAR: Simula la pulsación del pulsador captura -- Parámetros 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 operación. wait for 2 sec; pulsar;

wait for 2 sec; pulsar; wait; end process;

end simula;

El control de la introducción de estímulos propiamente dicha se realiza mediante un proceso.En él se declara un procedimiento para las acciones a llevar a cabo en la verificación deldiseño. En este ejemplo el procedimiento pulsar reproduce la pulsación de la tecla CAPTURA.

Page 13: tutorial vhdl

Diseño con VHDL .

-11-

En el cuerpo del proceso se controla el instante en que se realiza cada acción (ejecución delproceso asociado) mediante sentencias wait for. Notese que este proceso no tiene lista desensibilidades por lo que se estaría ejecutando siempre. Para evitarlo se finaliza dicho procesocon una sentencia wait .

3. CREACIÓN DE LOS ARCHIVOS FUENTE.

Para la creación de los archivos fuente se va a utilizar el editor emacs debido a que tieneprecargadas plantillas con la sintaxis de VHDL, lo que facilita de forma notable la creación dedichos archivos. Aunque se podría utilizar cualquier otro editor de textos, incluso el que tienela herramienta que se va utilizar para simular los archivos VHDL. Aunque dicha herramientatambién dispone de plantillas de VHDL, no son tan sencillas de manejar como las de emacs.En esta sección vamos a vez los elementos básicos que nos permitirán crear cualquier tipo dearchivo VHDL, aunque se va a utilizar una ínfima parte de las posibilidades que este editor nosaporta.

Para familiarizarnos con el entorno se va a crear un archivo sencillo, correspondiente a unaentidad que realiza la cuenta de 0 a 99, de forma similar que el contador de décadas utilizadoen la entidad crono, y cuyo listado se muestra a continuación. Dicho archivo se suministradentro 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;

Nótese que en la línea - if(EN1HZ = 1') then- se ha cometido un error de forma deliberada paraver como se pueden depurar con las herramientas utilizadas.

Page 14: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica 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 aplicación.

Este es un editor pensado para trabajar en UNIX, por lo que no acepta los comandos típicosde 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 deherramientas, la central o zona de trabajo en la que se escribe el texto, y la inferior o ventanade 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 manejode archivos, de forma similar a otros programas de windows, con la salvedad de que noaparece 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 queno exista en dicha carpeta.

Figura 9. Comando File.

Page 15: tutorial vhdl

Diseño con VHDL .

-13-

Los archivos VHDL tienen siempre la extensión vhd. Cuando se esta editando un archivo VHDLaparece un nuevo elemento de nombre VHDL en la barra de herramientas, esto es un buenindicativo de que hemos utilizado la extensión correcta para nuestro archivo.

Una vez seleccionado el archivo de entrada, ya se puede a introducir las líneas de texto comosi de otro editor se tratase. Para la operación 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 seríamos capaces de crear un archivo VHDL, si bien la utilizacióndel editor emacs viene justificada por la sencillez en la utilización de las plantillas deconstrucciones típica de VHDL.

Para acceder a las plantillas de VHDL se selecciona VHDL º Template, apareciendo lasopciones de la figura 10. Dentro de las plantillas podemos introducir tanto datos deorganización como son la cabecera o la fecha como comandos de VHDL. En ambos casos haycampos en los que el autor debe completarlos, para ello en la ventana de comandos sepregunta 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 líneas de nuestro código se seleccionaría laconstrucción VHDL library y se introduce el nombre ieee (figura 11), el cual es validado con5, a continuación nos pedirá el nombre del paquete de la librería anterior que queremosseleccionar (comando use). Si se desea introducir otro paquete de la misma u otra librería seutilizará la plantilla use.

Figura 11. Plantilla Library.

Page 16: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-14-

Una forma más simple de seleccionar la librería y el paquete consiste en ejecutar el comandoVHDLº Templateº Templateº Package, accediendo a los paquetes más comunes enVHDL (figura 12). De esta forma, se introduce a la vez la librería 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 líneas:

library ieee;use ieee.std_logic_1164.all;

Existen plantillas en las que algunos campos, según los casos, no se tiene o quiere introducirdatos. En este caso cuando se pidan dichos datos se pulsa 5. Por ejemplos, ésto sucedecuando estamos utilizando la plantilla entity y nos pide los nombres de los genéricos o loscomentarios a añadir 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 primeroscaracteres del comando y con la tecla Tab (º›) se completa. Puede darse el caso, según loscaracteres introducidos, que existan varias opciones, para pasar de una a otra se pulsanuevamente la tecla Tab. Obviamente, cuantos más caracteres de la palabra reservada seintroduzcan más rápido se de accederá a él. Esta forma de completar las palabras reservadasde VHDL, también se puede realizar con los nombres de los objetos (puertos, señales, etc)declarados en un archivo

Una vez completado el nombre de una palabra reservada de VHDL con la tecla Tab, acontinuación se pulsa la barra espaciadora para proceder a completar los campos del comandoel 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 creación de un proceso, en el que se nos pregunta siel proceso es secuencial o combinacional, En el primer caso nos pide el nombre de las señalesde reloj y reset y a continuación lo completa con el siguiente código:

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;

Page 17: tutorial vhdl

Diseño con VHDL .

-15-

faltaría por introducir el código que modele el funcionamiento asíncrono y síncrono.

En el caso de los procesos combinacionales se nos pide los objetos que conforman la lista desensibilidad.

Tal y como se dijo al principio, este editor está pensado para trabajar en un entorno UNIX, conlo que no acepta algunos de los comandos típicos de windows, tal es el caso de Crt+c paracopiar y Ctr+v para pegar. Para copiar, tan sólo es necesario seleccionar con el cursor laporción de código que se quiere copiar, pasando de forma automática al portapapeles. Parapegar 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 declaración de unaentidad. A continuación 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 instanciación

u1: contador port map ( rst => rst_i, EN1HZ => EN1HZ_i, unidades => unidades_i, decenas => decenas_i);

Page 18: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-16-

Como señalessignal 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 seguidode _tb y con el siguiente contenido

-------------------------------------------------------------------------------

library ieee;use ieee.std_logic_1164.all;

-------------------------------------------------------------------------------

entity contador_tb is

end contador_tb;

-------------------------------------------------------------------------------

architecture sim of 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 más de un archivo a la vez, para movernos por ello se utilizael comando buffer.

A medida que se va introduciendo código no es necesario prestar atención a la introducción detabulaciones para que el código sea mas legible, existiendo un comando que lo realiza deforma automática. Este comando es VHDLº Beautify º Beautify_Buffer.

4. ENTORNO DE SIMULACIÓN ModelSim.

Para verificar la validez de lo diseños VHDL se va a utilizar el simulador ModelSim de MentorGraphics. Este simulador se puede controlar mediante una interface gráfica de usuario basadaen menús y cajas de diálogo desplegables o bien mediante una línea de comandos. En estetutorial se explicará el uso del simulador mediante ambas opciones, siendo más potente lautilización de comandos, pudiendose englobar un conjunto de ellos en un archivo script quefacilita notablemente las tareas de simulación, el cual se ejecuta como una macro. Además

Page 19: tutorial vhdl

Diseño con VHDL .

-17-

cabe indicar que el interface de usuario puede variar de una versión a otra, no ocurriendo estocon los comandos.

La secuencia de comandos a emplear para realizar una simulación se pueden almacenar enun fichero de script. Conceptualmente los ficheros de scripts son similares a los ficheros deproceso por lotes de un sistema operativo (por ejemplo .bat para DOS). Se les suele asignarla extensión .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 permitereutilizarlos en los distintos tipos de simulación a realizar (funcional, post-implementación ytemporal) durante el flujo de diseño VHDL para FPGAs.

Para realizar este tutorial se ha empleado la versión 6.0, por lo que algunas de las ventanasmostradas pueden variar ligeramente en otras versiones. Hay que indicar que esta herramientaes case sensitive, distinguiendo entre mayúsculas y minúsculas. Los comando siempre seescriben en minúsculas.

4.1 ARRANQUE.

Para arrancar el simulador se puede hacer doble clic sobre el icono de acceso directo (figura14) del escritorio del PC o seleccionando Inicio º Programas º ModelSim SE 6.0 ºModelSim.

Figura 14. Icono de la aplicación.

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

BARAR DE HERRAMIENTAS

VENTANA DE TRABAJO

VENTANA DE TEXTO

VENTANA DE EDICIÓN

BARAR DE HERRAMIENTAS

VENTANA DE TRABAJO

VENTANA DE TEXTO

VENTANA DE EDICIÓN

Figura 15. Pantalla principal de ModelSim.

Page 20: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-18-

En la ventana de trabajo pueden aparecer varias pestañas dependiendo de las operacionesrealizadas con el diseño:

En ella se muestran los archivos fuente que forman parte del diseño, pudiendoser compilados. Para ello es necesario añadirlos.

Visualiza las librerías que podemos utilizar en nuestro diseño. Haciendo clic en+ podemos ver los paquetes que incluyen.

Muestra la estructura jerárquica de la entidad que se está simulando.

Muestra los archivos VHDL que forman parte del diseño que se está simulando.

En la ventana de texto donde se introducen los comando y se visualiza los mensajes que seproducen durante su ejecución. Utilizando las teclas de cursor arriba (8) y abajo (9) se puedeacceder a los comandos anteriores o posteriores introducidos, para poder ejecutarlos de nuevo.

En la ventana de edición se muestra el contenido de los archivos VHDL seleccionados,permitiendose su modificación.

La barra de herramientas engloba todas las herramientas que se pueden utilizar.

Los pasos a dar para simular un diseño son los siguientes.

Ø Creación del proyecto.Ù Creación de nuevas librerías y mapeado de las librerías a reutilizar.Ú Compilación del código fuente.Û Carga de la unidad de diseño a simular.Ü Definición de puntos de prueba.Ý Avance y detención de la simulación.Þ Introducción de estímulos.ß Análisis de resultados.ô Finalización de la sesión de simulación.

Para salir de ModelSim se selecciona File º Quit, o se ejecuta el comando quit

Librerías.

Las librerías son directorios que contienen unidades de diseño compiladas. Estas unidades dediseño pueden ser primarias o secundarias. Las unidades de diseño primarias (entidades,declaraciones de paquetes y configuraciones) almacenadas en una librería deben tener unnombre único. Por otro lado las unidades de diseño secundarias (arquitecturas y cuerpos depaquetes) pueden tener nombres comunes. Por ejemplo, las arquitecturas de dos entidadesdistintas pueden tener el mismo nombre.

Este simulador clasifica las librerías en dos tipos: librerías de trabajo y librerías de recursos.Todo diseño dispone de una única librería de trabajo que por defecto se denomina work, dondese almacenan, una vez que se han compilado, las unidades de diseño descritas en los ficherosfuente del diseño. La librería de trabajo debe crearse antes de compilar los ficheros fuente deldiseño. Por otro lado las librerías de recursos contienen unidades de diseño a las que se puede

Page 21: tutorial vhdl

Diseño con VHDL .

-19-

hacer referencia desde diseño que se está compilando. Estas librerías se declaran mediantelas sentencias library y use.

Para crear una librería se utiliza el comando vlib. La sintaxis de este comando es:

vlib <library_name>

donde <library_name> es el nombre de la librería. Este comando crea el directorio asociadoa dicha librería en el directorio de trabajo actual.

Puede ocurrir que el directorio donde se almacena una librería no este contenido en eldirectorio de trabajo actual. Esta es una situación típica que se da cuando se pretenden utilizarunidades de diseño compiladas con anterioridad para otro diseño en el diseño actual.

Para gestionar estas situaciones ModelSim asigna a cada librería un nombre físico y un nombrelógico. El nombre físico corresponde al path del directorio donde se almacenan las unidadesde diseño compiladas. El nombre lógico es la denominación que recibe la librería cuando sehace referencia a ella desde el simulador o desde el código fuente VHDL, por ejemplo mediantela sentencia use. Cuando una librería se encuentra almacenada en el directorio de trabajoactual el nombre físico coincide con el nombre lógico. En caso contrario es preciso asignar ala librería un nombre lógico mediante el comando vmap. A este proceso se le denominamapeado. La sintaxis de este comando es:

vmap <nombre_logico> <path_del_directory>

El mapeado de estas librerías sólo se realiza una vez, es decir, no es preciso compilar estaslibrerías para cada nuevo diseño a realizar. Ademas el archivo de inicialización de ModelSimes modificado de forma que dichas librerías serán siempre visibles para posteriores diseños.

Otros comandos empleados para la gestión de librerías son vdir y vdel que se empleanrespectivamente para mostrar el contenido de una librería y para borrar elementos de ésta. Lasintaxis de vdir es:

vdir [-lib <nombre_librería>]

Si se emplea el comando sin parámetros se muestra el contenido de la librería work. Por otrolado la sintaxis del comando vdel es:

vdel [-lib <nombre_librería>] [-all |<unidad_de_diseño>]

donde <nombre_librería> es la librería de donde se desea borrar la unidad de diseño encuestión. Si no se especifica la librería se toma por defecto la librería work. En cuanto a lasunidades de diseño a borrar éstas se pueden especificar individualmente o bien borrar todasellas utilizando el parámetro -all. En este último caso se borra incluso el directoriocorrespondiente a la librería por lo que si se desean compilar con posterioridad nuevos ficherosfuente 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 librería de soportedel sistema las funciones definidas por ANSI C, los simuladores VHDL suelen disponer de unaserie de librerías predefinidas que no es necesario compilar cada vez que se realiza un nuevodiseño. En el caso concreto de ModelSim se encuentran predefinidas las siguientes librerías:

! La librería std que contiene los paquetes standard y textio. ! La librería IEEE que contiene paquetes aritméticos precompilados de Synopsys e IEEE.! La librería vital empleada para realizar simulaciones temporales.

Page 22: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-20-

Estas librerías están optimizadas para la simulación por lo que no es recomendable que elusuario realice modificaciones sobre ellas.

4.2. CREACIÓN DE UN PROYECTO.

Al igual que ocurre con otros entornos de desarrollo ModelSim gestiona la información de cadadiseño mediante un proyecto, facilitando de esta forma su gestión. Un proyecto se componede:

! Un directorio de trabajo en el que se almacenan los distintos ficheros generadosdurante la compilación y simulación de un diseño.

! Los ficheros fuente VHDL del diseño.! Las librerías creadas.! La configuración empleada en el simulador.

Esta información se almacena en un fichero con el mismo nombre que el del proyecto y laextensión .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 delmenú File.

Para crear el proyecto empleado para realizar la simulación funcional del diseño del ejemploseleccione la opción File º New º Project de la barra de menús. En ese momento semostrará en la pantalla la ventana Create Project (figura16 ), que permite seleccionar el nombrey ubicación del proyecto. En el caso de que no exista el directorio seleccionado se crea.Además crea automáticamente la librería work definiendola como la librería de trabajo paraeste nuevo diseño.

Si bien el empleo de proyectos no es obligatorio, su uso facilita la gestión de los diseños.

Figura 16. Ventana de diálogo para la creación de un proyecto

En caso de no desear emplear esta facilidad habría que ejecutar los siguientes comandos:

cd c:/usersmkdir tutorialcd tutorialvlib work

Page 23: tutorial vhdl

Diseño con VHDL .

-21-

Notese que la sintaxis empleada por ModelSim para especificar la jerarquía de un directorio esla misma que la de Unix, ya que las primeras versiones de este simulador se desarrollaron paradicho sistema operativo.

Al seleccionar OK en la figura 16 aparece la figura 17 que permite crear un nuevo archivofuente (VHDL) o añadir uno ya existente estas opciones se ejecutan si se quiere compilar losarchivos desde el interface gráfico, posteriormente volveremos sobre esta opción. Si se va acompilar con comandos desde la ventana de texto se selecciona Close.

Figura 17. Ventana de diálogo para la añadir un archivo fuente al proyecto

Si se desea editar un archivo VHDL ya creado, por ejemplo con emacs, se utiliza File º Openy se selecciona el archivo a editar. Desde la ventana de texto se edita un archivo introduciendoel comando:

edit <fichero>.vhd

4.3. COMPILACIÓN DEL CÓDIGO FUENTE.

Una vez creado el proyecto y los ficheros VHDL que forman parte del diseño se procederá acompilarlos. Para ello se emplea el comando vcom. La sintaxis resumida de este comando es:

vcom [-87][-93] [-work <nombre_librería>] <fichero1>.vhd <fichero2>.vhd ...

El parámetro -93 indica que se emplee el la versión 93 de VHDL frente a la 87. Mediante elparámetro -work se especifica la librería destino en la que se almacenará el código compilado.Si no se especifica este parámetro por defecto se almacena en la librería work. Recuerdeseque la librería destino debe haber sido creada con anterioridad y en caso de que no seencuentre en el directorio actual haber sido hecha visible mediante el comando vmap.

Para la compilación del contador de décadas se introduce:

vcom -93 contador.vhd

Durante la compilación el simulador muestra en la consola información referente a la evoluciónde ésta. Si aparecen errores, la descripción de estos se muestra en color rojo. Haciendo dobleclick sobre la línea de error se muestra automáticamente la línea del fichero fuente que produjoeste error en la ventana de código fuente. En la figura 18 aparece un ejemplo de esto.

Page 24: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-22-

Figura 18. Visualización automática de errores en el código fuente

Sobre la pantalla de la figura 18 y con el editor de ModelSim, se corrigen los errores,pudiendose realizar también con el emacs. Si en la pantalla de la figura 18 no permitiesemodificar el archivo es debido a que está abierto en modo lectura, para cambiarlo se pulsasobre el botón derecho del ratón y se desactiva la opción Only Read.

Para compilar nuevamente el archivo no es necesario teclear otra vez el comando vcom, conlas teclas 8 y 9, estando en la ventana de texto, se puede acceder a él.

Por defecto las unidades de diseño se almacenarán en la librería work. Si un fichero VHDLproporciona una unidad de diseño que será utilizada en otro fichero, el primero de ellos debecompilarse en primer lugar. Así, para compilar los ficheros fuente del diseño del cronometro sehan de ejecutar los siguientes comandos desde la consola de ModelSim:

vcom bcd2seg.vhdvcom prescaler.vhdvcom ant_reb.vhdvcom maq_fsm.vhdvcom cnt_cap.vhdvcom crono.vhdvcom crono_tb.vhd

Una forma más sencilla consiste en crear un fichero script en el que se introducen estoscomandos. El archivo creado es compila.do, por tanto se debe ejecutar el comando:

do compila.do

ejecutandose los comandos en el orden introducido.

Compilación desde el entorno gráfico

Para utilizar el entorno gráfico, en primer lugar es necesario añadir los archivos a la ventanade trabajo. Esto se puede hacer utilizando el menú de la figura 17 cuando se crea el proyectoo situando el ratón sobre la ventana de trabajo y pulsando el ratón derecho, apareciendo elmenú de la figura 19, donde se selecciona Add to Project. Los elementos que se puedenañadir son:

Page 25: tutorial vhdl

Diseño con VHDL .

-23-

! Un fichero nuevo: el comando Create New File permite crear un nuevo fichero dediseño VHDL como se efectuará posteriormente.

! Un fichero existente: el comando Add Existing File permite incluir un fichero yaexistente en el proyecto actual copiándolo al directorio del proyecto o referenciándolodesde su ubicación actual.

! Un directorio virtual: cuando el diseño es complejo y consta de muchos ficheros, puederesultar interesante emplear el comando Create New Folder para organizarlos endirectorios y subdirectorios. Estos directorios tienen, sobre la pestaña Project del Áreade trabajo, un aspecto similar al de los directorios del sistema operativo pero no secrean realmente en el disco, sino que son internos al proyecto.

! Una configuración para simulación: El comando Create Simulation permite crearconfiguraciones para simulación, es decir, crear una asociación entre la unidad dediseño y las opciones con las que desea simularse.

Figura 19. Menú para añadir archivos al proyecto.

Al seleccionar el archivo automáticamente se añade a la ventana de trabajo (figura 20). Elsignificado de la información que aparece en las columnas de la ventana de trabajo es:

Status: Indica el estado del archivo: indica que el fichero aún no ha sido compilado; queel 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 número de orden que ocupa el fichero en la secuencia de compilación cuandohay varios ficheros fuente.

Modified: Muestra la fecha y hora en que el fichero fue modificado por última vez.

Page 26: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-24-

Figura 20. Archivo fuente añadido a la ventana de trabajo.

Al añadir un archivo, se abre automáticamente la ventana del editor de texto del entorno condicho archivo. En el caso de añadir más de un archivo si se desea editar uno en particular sehace doble clic sobre él.

Para compilar el o los archivos se puede seleccionar el menú Compile de la barra deherramientas o pulsando el botón derecho del ratón 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 opción Compile Order se puede modificar el orden de compilación.

En el caso de que el proyecto se quiera compilar en otro ordenador o en otro proyecto, a partede copiar en él los archivos fuentes habría que añadirlos a la ventana de trabajo y volver acompilarlos. Cosa que no sucede si se utiliza un script, en el que sólo es necesario ejecutareste último.

4.4. CARGA DE LA UNIDAD DE DISEÑO A SIMULAR.

Para poder simular el diseño realizado es preciso cargarlo en el simulador. Para ello se empleael comando vsim. El formato resumido de este comando es:

vsim [-lib <nombre_librería>] [-t [múltiplo]<unidades_tiempo>][-sdfmin | -sdftyp | -sdfmax<instancia>=<fichero_sdf>]<entidad> [<arquitectura>] |[ <configuración>]

Como se puede observar todos los parámetros son opcionales excepto el que indica la unidadde diseño superior. Este último indica la entidad a simular, siendo posible especificar también

Page 27: tutorial vhdl

Diseño con VHDL .

-25-

la arquitectura concreta a emplear. Esto resulta especialmente útil cuando la entidad disponede varias arquitecturas. Por ejemplo si se deseara simular el contador de décadas el comandoa emplear sería:

vsim contador rtl

o bien simplemente:

vsim contador

La librería que contiene la unidad de diseño a simular también se puede especificar medianteel parámetro opcional -lib. Si no se especifica, por defecto se supone que dicha unidad seencuentra almacenada en la librería de trabajo (work). El parámetro -t indica la resolución dela simulación. Dicha resolución se especifica en unidades de tiempo según el formato indicadoen la tabla 1.1. Adicionalmente puede emplearse un factor multiplicador siendo los valoresadmisibles 1, 10 o 100. Si no indica la resolución del simulador, por defecto este trabaja conuna resolución de 1 ns.

Para el caso de una simulación temporal de un diseño para FPGAs teniendo en cuenta que losretardos internos se expresan con una resolución de 0.1 ns la opción a emplear para fijar laresolución sería -t 100ps. Notese que no hay espacios en blanco entre el multiplicador y lasunidades. Por último el parámetro -sdfxxx sólo se usa en simulaciones temporales,empleandose para especificar el fichero sdf que contiene la retroanotación de retardos, cosaque no se va a utilizar en este diseño, ya que tan sólo nos limitaremos a realizar una simulaciónfuncional del mismo.

Según lo expuesto, una vez compilados los ficheros fuente del diseño de nuestro ejemplo sepuede proceder a cargar la unidad de diseño a simular. Para nuestro ejemplo ésta es la entidadcrono_tb, que además sólo tiene una única arquitectura. Por lo que el comando a emplearsería:

vsim crono_tb

4.5. SELECCIÓN DE PUNTOS DE PRUEBA.

La verificación del diseño mediante simulación se basa en observar los distintos elementos queaparecen en él. Por analogía con un simulador digital clásico a los puntos del circuito aobservar (señales) los denominaremos puntos de prueba, si bien en diseños descritos en VHDLla variedad es más amplia: puertos, variables, señales, procesos en ejecución, etc. Tal y comomuestra la figura 22 el simulador define un total de siete ventanas más destinadas arepresentar 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.

Page 28: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-26-

! workspace o structure. Muestra la estructura jerárquica del diseño en forma de árbol.En nivel seleccionado en esta ventana afectará al contenido de las ventanas de formasde onda, variables, etc.

! source. Muestra el código fuente del archivo seleccionado en el workspace cuando seactiva la pestaña . Se suele emplear para ejecutar el código paso a paso.

! wave. Permite representar los cronogramas de la evolución de las señales y variablesdel diseño.

! objects o signal. Muestra las señales y puertos contenidos en el nivel seleccionado enel workspace .

! locals. Muestra las variables de una entidad.

! process. Proporciona información del estado de ejecución de los procesos.

! dataflow. La ventana de flujo de datos permite realizar un seguimiento gráfico de laconexión de procesos mediante las señales del diseño.

! list. La ventana de listado permite observar los resultados de la simulación de formatabular 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 carácter comodín * . Así el siguiente comando abre todas las ventanascitadas:

view *

La descripción detallada del uso de todas las ventanas queda fuera de los objetivos de estetexto. Por este motivo sólo se expondrá el uso de la ventana de formas de onda, al ser éste elmétodo más empleado para depurar sistemas digitales mediante simulación.

Page 29: tutorial vhdl

Diseño con VHDL .

-27-

Para abrir esta ventana seleccione la opción View º Debug windows º Wave de la barra demenús, o bien ejecute el comando:

view wave

A continuación es preciso seleccionar las señales a visualizar. Si el número de señales avisualizar es elevado esta operación puede ser un tanto tediosa. En ese caso se puede optarpor realizar esta operación mediante el interface gráfico. Para ello es preciso abrir las ventanasde estructura y de señales. La primera de ellas nos servirá para navegar por la estructurajerárquica del diseño, mientras que la segunda nos permitirá seleccionar las señales a añadira la ventana de formas de onda. Para abrir la ventana de estructura seleccione la opción Viewº workspace de la barra de menús, o bien ejecute el comando:

view structure

también es válido:

view workspace.

De forma similar, para abrir la ventana de señales seleccione la opción View º Debugwindows º Objects de la barra de menús, o bien ejecute el comando:

view signal

también es válido:

view objects.

Tal y como muestra la figura 23 al seleccionar un nivel en la ventana de estructura, se muestrantodas las señales contenidas en dicho nivel sobre la ventana de formas de onda.

Figura 23. Selección de las señales en un determinado nivel jerárquico.

Una vez mostradas las señales de interés en la ventana de señales se procederá a añadirlasa la ventana de formas de onda. Para ello se seleccionan las señales en cuestión en la ventanade señales y a continuación se pulsa el botón derecho del ratón, seleccionando una de lasposibles opciones (figura24).

Page 30: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-28-

Figura 24. Seleccionar señales a visualizaren la ventana wave.

Una forma más simple, consiste en seleccionar y arrastrar las señales o puertos hasta laventana wave. Una vez finalizado este proceso la ventana de formas de onda presenta elaspecto mostrado en la figura 25.

Figura 25. Objetos añadidos a la ventana wave.

También es posible representar en la ventana de formas de onda la evolución de las variablesde los procesos. Para ello es preciso que el proceso al que pertenece la variable a visualizaresté etiquetado. Esta etiqueta sirve como elemento identificador dentro de la ventana deestructura. El proceso a seguir es el mismo que el utilizado para seleccionar las señales, peroutilizando la ventana de variables (locals).

El color de las señales, el formato numérico utilizado en el caso de los vectores, etc. se puedefijar mediante las distintas opciones del menu sensible al contexto (figura 26)que aparece alseleccionar una señal determinada y pulsar a continuación el botón derecho del ratón (o conFormat de la barra de menús).

Page 31: tutorial vhdl

Diseño con VHDL .

-29-

Figura 26. Parámetros de los objetos dela ventana wave

La configuración utilizada en la ventana de formas de onda puede almacenarse en un ficherode scripts denominado wave.do para volverla a utilizar en posteriores sesiones de simulación.Para ello seleccione la opción Fileº Save Format de la barra de menús de la ventana wave,o pulsando sobre . Básicamente, este fichero contiene comandos del tipo add wave, loscuales se utilizan para añadir señales o variables a la ventana de formas de onda. Su sintaxisresumida es:

add wave [-<format>] [-<radix>] <nombre_elemento>

El parámetro <nombre_elemento> especifica el nombre de la variable o señal a visualizar. Sidicho elemento no se encuentra en la entidad superior de la jerarquía se debe indicar el caminocompleto dentro de la jerarquía En el caso de las variables, se especificará el camino hasta laarquitectura donde reside el proceso que contiene la variable. Asi. por ejemplo, para añadir laseñal state de la entidad maq_fsm se pondría:

add wave dut/u4/u2/state

El parámetro opcional radix especifica la base numérica con que se representan los vectores.Los valores que puede tomar este parámetro son binary, octal, decimal (o signed), unsigned,hexadecimal, ascii, symbolic o default. Puesto que estos nombres son suficientementeilustrativos hay poco que añadir a este respecto. Tan sólo indicar, que la opción -symbolic seemplea con tipos enumerados. Si no se indica nada se representa según la base numéricafijada por defecto (-default) en las opciones del simulador.

El parámetro opcional format indica el formato de representación (numérico o gráfico) aemplear de los vectores. Los valores que puede tomar son: literal, logic, analog-step, analog-interpolated y analog-backstep. Normalmente esta opción no se suele emplear, dejando queestos los vectores se representen en formato numérico. Las tres últimas opciones permitenrepresentar la secuencia de valores que toma el vector como las muestras de una señalanalógica digitalizada. Esto es especialmente útil en la implementación de sistemas detratamiento digital de señal. La figura 27 muestra un ejemplo de esto.

Page 32: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-30-

Figura 27. Ejemplo de representación analógica de señales.

Una descripción más detallada de los formatos analógicos, como de los digitales, se encuentraen el manual del simulador, al que se puede acceder desde Help de la barra de menús.

En el ejemplo del contador de décadas, para analizar el funcionamiento del sistema se van aobservar sus puertos, las señales de cuenta (Cntunidades y Cntdecenas). Según esto loscomandos a ejecutar serían:

add wave rstadd wave clkadd wave en1hzadd wave -radix unsigned Cntunidadesadd wave -radix unsigned Cntdecenasadd wave -radix unsigned unidadesadd wave -radix unsigned decenas

Tal y como se ha indicado una forma sencilla de obtener estos comandos es realizar unaselección manual y a continuación generar el fichero de configuración wave.do, de este últimose extraen los objetos que queremos visualiza, y se añaden al archivo scrip para la simulación.Téngase presente que el formato de los comandos add wave tienen diferente contenido almostrado anteriormente, por lo que, si el usuario lo considera pertinente puede retocarlos, paratener una sintaxis más corta, si bien la semántica sigue siendo la misma. A continuación semuestran estos comandos tal y como se encuentran en el archivo wave.do.

add wave -noupdate -format Logic /contador/rstadd wave -noupdate -format Logic /contador/clkadd wave -noupdate -format Logic /contador/en1hzadd wave -noupdate -format Literal -radix unsigned /contador/cntunidadesadd wave -noupdate -format Literal -radix unsigned /contador/cntdecenasadd wave -noupdate -format Literal -radix unsigned /contador/unidadesadd wave -noupdate -format Literal -radix unsigned /contador/decenas

Los comandos utilizados para cargar el diseño a simular y configurar la ventana de formas deonda se recogen en el script contador.do proporcionado.

Simulación desde el entorno gráfico.

Para simular una entidad desde el interface gráfico, se selecciona la pestaña Library delworspace, se abre la librería work y se hace doble clic sobre la entidad a simular. En el casode que dicha entidad tuviera más de una arquitectura, se haría doble clic sobre la arquitecturadeseada (figura 28).

Page 33: tutorial vhdl

Diseño con VHDL .

-31-

Figura 28. Selección de la entidadsimular.

4.6. INTRODUCCIÓN DE ESTÍMULOS.

Normalmente los estímulos del diseño se introducen mediante el código del fichero de un bancode pruebas o testbench. Sin embargo en un diseño típico el sistema está compuesto por variosmódulos más sencillos que se instanciarán en el diseño final. Antes de obtener el diseño finalserá preciso validar los módulos que lo componen. La realización de un banco de pruebas paracada uno de estos módulos tan sencillos puede resultar una tarea tediosa. Para solventar estasituación se puede emplear el comando force, que permite introducir estímulos sobre lasseñales resueltas del diseño de una forma sencilla. La sintaxis general de este comando es:

force <nombre_señal> <valor1> <tiempo1>, <valor2> <tiempo2> ...

Con este formato se introducen los estímulos especificados en pares (valor, instante de tiempo)para la señal en cuestión. Cuando se trata de una señal interna en el nombre se debeespecificar el camino completo en la jerarquía del diseño. Los valores a asignar a una señaldeben ajustarse al tipo de datos de misma. Los instantes de tiempo pueden expresarse enformato relativo al instante actual de simulación o en valor absoluto respecto al origen detiempos (t=0). En este último caso se ha de añadir el prefijo @. Por defecto las unidades en quese expresan los tiempos coincide con la resolución del simulador (ns).

Existe un conjunto de parámetros adicionales que permiten introducir estímulos periódicos.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 continuación se muestran varios ejemplos del uso de este comando.

force clr 0 Fuerza clr a 0 en el instante actual de simulación.

force bus1 01XZ 100 ns Fuerza bus1 a 01XZ 100 ns después del instante actual de simulación.

force bus2 16#4F @200 Fuerza bus2 a 4Fh 200 unidades de tiempo (especificadas por laresolución de simulación) desde el inicio de ésta.

force clk 0 0, 1 25 -repeat 50 Genera una señal 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 simulación, 20 unidades detiempo después pasa a 1. Esto se repite cada 50 unidades de tiempohasta alcanzar 1000 unidades de tiempo. Por tanto el siguiente 1ocurrirá en la unidad de tiempo 70.

Page 34: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-32-

Según lo expuesto para validar de forma individual el módulo contador se emplearía lasiguiente secuencia de comandos:

vcom contador.vhdvsim contadoradd wave rstadd wave clkadd wave en1hzadd wave -radix unsigned Cntunidadesadd wave -radix unsigned Cntdecenasadd wave -radix unsigned unidadesadd wave -radix unsigned decenasforce clk 0, 1 50 -r 100force en1hz 1force rst 0run 200force rst 1run 5 usforce en1hz 0run 500force en1hz 1run 1 us

En la figura 29 se muestra el resultado de la simulación del contador de décadas con losaplicando los comandos anteriores.

Figura 29. Resultado de la simulación del contador de décadas.

El comando force se emplea para aplicar estímulos a señales resueltas. En el caso de que seaplique un estímulo a una señal interna del diseño, el código VHDL determinará el estado quetoma esta señal. Existe un modo de operación de este comando denominado “modocongelado” que permite imponer un valor a una señal interna. Esto es especialmente útil parareducir el tiempo de simulación de un diseño. Así, en el diseño del cronómetro, considerado lasalida del sistema cambia cada segundo se precisaría mucho tiempo para verificar el diseño.Para reducir el tiempo de simulación se forzará la salida del preescaler (señal EN1Hz) a 1mediante el comando:

force -freeze crono_tb/dut/u3/en1hz 1

En el caso de utilizar la opción freeze con un comando force, para desactivarla se debe ejecutaprimeramente el comando noforce. Por ejemplo para el caso anterior se utilizaría:

Page 35: tutorial vhdl

Diseño con VHDL .

-33-

noforce crono_tb/dut/u3/en1hz

Lo mismo sucede cuando a un puerto se le asigna una señal periódica com la opción -r. Así,por ejemplo, para la generación de valores para la señal EN1HZ se podría aplicar el comando:

force en1hz 1, 0 100 -r 5us

para generar una señal de 200 Khz, que está a nivel alto 100 ns. Si a continuación, para unnuevo paso simulación, se quisiera fijar dicha señal a un nivel fijo, por ejemplo a nivel alto, sedeberán utilizar los comandos:

noforce en1hzforce en1hz 1

Resumiendo, para realizar la simulación del diseño se introducirá la secuencia de comandosque se indica a continuación. Esta secuencia se encuentra almacenada en el fichero de scriptcrono_tb.do proporcionado.

vcom bcd2seg.vhdvcom prescaler.vhdvcom ant_reb.vhdvcom maq_fsm.vhdvcom cnt_cap.vhdvcom crono.vhdvcom crono_tb.vhdvsim crono_tbadd wave rst_iadd wave clk_iadd wave dut/u3/en1hzadd wave dut/u3/en200hzadd wave captura_iadd wave dut/u4/p_iadd wave dut/u4/ceadd wave -radix unsigned dut/cntunidadesadd wave -radix unsigned dut/cntdecenasadd wave -radix unsigned dut/unidadesadd wave -radix unsigned dut/decenasadd wave displayunidades_iadd wave displaydecenas_irun 5.5 secforce -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 diseño.

Page 36: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-34-

Figura 30. Resultado de la simulación del cronómetro.

Para aplicar valores a los objetos desde el interface gráfico, en la ventana wave se seleccionael objeto al que se le va a asignar un valor, se pulsa el botón derecho del ratón y se seleccionala opción force, apareciendo el cuadro de dialogo de la figura 31, donde se selecciona el valorque se le va a asignar y el instante de tiempo.

Figura 31. Asignación de valores.

4.7. AVANCE Y DETENCIÓN DE LA SIMULACIÓN.

Para provocar un avance de la simulación se emplea el comando run, siendo su sintaxis:

run[<magnitud>[<unidades_tiempo>]] | <modo>

El tiempo a avanzar en la simulación se puede especificar de varias formas, de acuerdo a unaserie de modos predeterminados. Una primera especificación del tiempo de simulación es:

run[<magnitud>[<unidades_tiempo>]]

En este formato se avanza el tiempo especificado por el parámetro. Este tiempo se da comoun valor numérico seguido de unas unidades de tiempo empleando para ello el formato descritoen la tabla 1.1. Si no se especifican las unidades se entiende que el tiempo viene expresadoen la resolución del simulador (por defecto es 1ns). Por ejemplo, el siguiente comandoprovocaría un avance en la simulación de 400 ns:

run 400ns

Otra forma de emplear el comando run responde al formato:

run<modo>

Page 37: tutorial vhdl

Diseño con VHDL .

-35-

donde el parámetro <modo> puede ser uno de los siguientes valores:

! -all: Ejecuta la simulación indefinidamente hasta que ésta se detenga debido a un puntode ruptura, a un error de simulación, a una sentencia assert o que se pulse .

! -step: Avanza la simulación hasta la siguiente sentencia VHDL.

! -stepover: Es exactamente igual que la anterior salvo que las llamadas aprocedimientos o funciones se tratan como una única sentencia, ejecutandose de unavez.

! -continue: Continua la simulación desde el punto en que se detuvo debido a un puntode ruptura.

! -next: Ejecuta la simulación hasta el siguiente evento.

Según esto el comando:

run -all

ejecutaría la simulación del ejemplo hasta que se detuviera debido a una de las causas antescomentadas.

Para reiniciar la simulación, volviendo el tiempo a 0 ns, e iniciar una nueva simulación seemplea el comando restart. Al ejecutar este comando aparece la ventana mostrada en la figura32. En ella se puede seleccionar qué elementos mantendrán la configuración fijada durante lasesión de simulación actual.

Figura 32. Ventana Restart.

Si durante la sesión de simulación se descubre un error de diseño que obliga a modificar elcódigo fuente será preciso finalizar la simulación mediante el comando quit -sim. Acontinuación se modifica el código fuente, se compila y se vuelve a cargándolo de nuevo tal ycomo se ha descrito.

En la barra de herramientas se encuentran otros iconos que permiten controlar el avance deltiempo del simulador:

Permite selecciona la cantidad de tiempo que avanza la simulación cuandose ejecuta el comando run.

Page 38: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-36-

run.

run -continue

run -all

Parar la simulación (break).

run - step

run - step over

restart

Merece la pena hacer hincapié en la utilización del menú help para acceder a una colecciónde archivos en formato pdf que van desde un manual de ModelSim hasta la explicación de lasemántica y sintaxis de todos los comandos.

5. ANÁLISIS DE RESULTADOS.

En este apartado se comentará como navegar por la ventana de cronogramas así como larealización de mediciones de tiempos.

Para ajustar el zoom de la visualización se emplean cuatro elementos que aparecen en la barrade 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 añaden con elelemento . La primera vez que se pulsa este botón aparece el cursor principal, que tal ycomo muestra la figura 34 éste aparece como una línea naranja de trazo grueso. Los cursoresse pueden situar de forma manual pulsando directamente sobre un punto de los cronogramas.En este caso el cursor se sitúa sobre la transición más próxima al punto seleccionado. Si sedesean desplazar los cursores hasta la siguiente transición de la señal seleccionada seemplean los botones . Esto es especialmente útil para las medidas de tiempos.

Las mediciones de tiempo se realizan utilizando un segundo cursor, para ello se sitúan elcursor principal y el secundario sobre las dos transiciones, de la misma u otra señales. Estastransiciones delimitan el tiempo a medir. El segundo cursor se añade de igual forma que elprimero, mostrándose en trazo discontinuo. El tiempo medido se muestra en la parte inferiorde la pantalla. Finalmente para eliminar estos cursores se emplea el botón .

Page 39: tutorial vhdl

Diseño con VHDL .

-37-

Figura 34. Medida de tiempos.

Sobre la figura 34 se puede observar como algunos bits del puerto unidades pasan a valordesconocido ‘X’ cuando el contador empieza a contar. Esto es debido que sobre una señal opuerto se está realizando una asignación desde más de una sentencia concurrente. Paraaveriguar donde se realiza esa doble asignación se utiliza la ventana dataflow. Para ello, en laventana wave, se selecciona unidades y se pulsa , abriendose la ventana dataflow. Acontinuación, sobre esta última ventana se selecciona el comando Navigate º View region,apareciendo un diagrama simbólico con la estructura del diseño (figura 35). En dicha figura sepuede observar como a unidades se realiza una doble asignación concurrente en las líneas42 y 20 del archivo fuente. Para subsanar el error es necesario eliminar la línea:

unidades <= (others => '0');

Figura 35. Ventana dataflow.

Una ver realizada la corrección se vuelve a simular el diseño, obteniendose los resultados dela figura 36. Como se puede comprobar, ahora el diseño funciona correctamente.

Figura 36. Resultado de la simulación del contador de décadas.

Page 40: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica I.

-38-

Para llevar el cursor a instante en que un elemento de la ventana wave toma undeterminado valor se utiliza, una vez seleccionado el objeto, el comando Edit ºSearch, apareciendo el menú de la figura 37, donde se selecciona las opciones debúsqueda. Para indicar un valor de un objeto vector, éste se pondrá entre comillasdobles, en binario o en decimal (“0011"ó “3"). En el caso de ser individual se pondrá 0ó 1.

Figura 37. Opciones de búsqueda.

5.1.PUNTOS DE RUPTURA.

Una de las posibilidades más empleadas en los simuladores son los puntos de ruptura(breakpoints). ModelSim permite trabajar con dos tipos de puntos de ruptura. El primerode ellos se fija sobre las líneas de código de la ventana de código fuente (source). Estetipo 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 ratón sobre lalínea en la que queremos poner el punto de ruptura, apareciendo un punto de colorrojo(figura 38). Para desactivarlo basta con una nueva pulsación. Cuando se ejecutala línea de código marcada se detiene la simulación.

Figura 38. Colocación de un punto de ruptura

Los puntos de ruptura también se pueden introducir desde la ventana de texto mediante elcomando bp. El formato empleado es:

bp <nombre_fichero> <número_de_línea>

Page 41: tutorial vhdl

Diseño con VHDL .

-39-

El segundo formato, denominado condicional, se asemeja al concepto empleado por unsimulador digital, permitiendo asociarlo a señales, para ello se utiliza el comando when, cuyasintaxis es:

when [-label <nombre>] {<expresión_condición>} {<acción>}

El parámetro -label asigna el identificador <nombre> al punto de ruptura definido. El parámetro<expresión_condición> define la condición a evaluar en el punto de ruptura. Cuando estaexpresión es cierta se dispara el punto de ruptura. La sintaxis de esta expresión responde alsiguiente formato:

subexpresión1 operador_lógico subexpresión2 operador_lógico subexpresión3...

Las subexpresiones vienen dadas por operadores relacionales y atributos de detección deeventos. Los operadores que se pueden utilizar son:

siguientes ejemplos muestran las situaciones admitidas.

! Igualdad. clk = ’1' ó clk==’1'! Desigualdad Cntdecenas /= “0000"! Detección de eventos: clk’EVENT

Los operadores de igualdad y desigualdad sólo admiten como segundo parámetro un literal, esdecir no se puede comparar el estado de dos señales. Los operadores lógicos que ligan lassubexpresiones pueden ser el operador and o el operador or. En la expresión condicional seadmite el empleo de paréntesis para establecer la prioridad con que se evalúan las distintassubexpresiones. El parámetro <acción> define la secuencia de comandos a del simulador a ejecutar cuando sedispara el punto de ruptura. Este parámetro es opcional, si no se indica la acción a realizarconsiste en detener la simulación.

Por ejemplo, para simular el contador de décadas se podría añadirlos siguientes el siguientescomandos:

when -label pto1 { unidades=”001"} {echo "unidades toma el valor 3" stop}run -all

Así, la simulación se realizará hasta que unidades tome el valor 3 (binario-0011), apareciendoen la ventana de texto: unidades toma el valor 3

Page 42: tutorial vhdl

Electrónica Industrial. Laboratorio de Tecnología Electrónica 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 SESIÓN DE SIMULACIÓN.

La simulación de un diseño permite comprobar el correcto funcionamiento del mismo. Desdeque se crean un diseño hasta que se van a realizar varias simulaciones hasta depurar y obtenerel código correcto, por lo que será preciso finalizar la sesión de simulación, modificar el códigofuente, compilar y volver a simular.

Para finalizar la sesión de simulación se emplea el comando:

quit -sim

Notese que el finalizar la sesión de simulación no supone cerrar ModelSim.

El uso de este comando tiene su interés cuando el código VHDL hace uso de ficheros. Unapráctica muy habitual es emplear fichero del cual se toma la secuencia de estímulos (vectoresde test) a aplicar al diseño. Por ejemplo en el caso de sistemas de tratamiento digital de señalimplementados en FPGAs, el bando de pruebas puede obtener los datos a procesar desde unfichero previamente creado mediante Matlab. De forma similar los resultados del procesamientose pueden almacenar en un fichero de salida para su posterior análisis. En este caso, elsimulador abre el ficheros de salida al cargar la unidad de diseño a simular, manteniendo elcontrol sobre éste por lo que no se puede acceder a su contenido hasta que no finalice lasesión de simulación. En ese momento el fichero de salida puede abrirse con otra herramienta.

7. METODOLOGÍA DE TRABAJO.

En la descripción realizada a cerca del manejo del simulador se ha hecho especial hincapié ensu uso mediante comandos, prestandose menos interés al uso del interface gráfico.Aparentemente el uso de comandos puede parecer más complejo debido al esfuerzo inicial quesupone la creación de estos ficheros. Pero hay que tener en cuenta que en raras ocasiones seobtiene a la primera un diseño totalmente correcto. En tal caso la verificación del diseñomediante simulación se convierte en un proceso iterativo consistente en modificar el códigofuente, compilarlo, simular y observar los resultados.

A esto hay que añadir que este esfuerzo inicial que supone la creación de los ficheros de scriptse ve recompensado por la facilidad de poder reutilizarlos. Así los scripts creados para lasimulación funcional se pueden reutilizar con leves modificaciones en la simulación temporal.Además en su formato básico no varían demasiado de un diseño a otro, por lo que también sesuelen reutilizar en este caso.