Está en la página 1de 42

DISEO CON VHDL

LABORATORIO DE TECNOLOGA ELECTRONICA I. ITT


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.

También podría gustarte