Tutorial de ModelSim PE Student Edition Instalación Ir a http://portal.model.com/modelsim/downloads/license_agreement_form_gen.asp Rellenar los datos y selecionar Request Download Seleccionar el enlace ftp generado (e.g. ftp://xxxxx:yyyyy@ftp.model.com//) Ir a la carpeta EDU Descargar el instalador: modelsim-pe_student_edition.exe Instalar ModelSim ejecutando el fichero descargado (usar WinE si el sistema operativo es Linux - notas) Debería aparecer la siguiente pantalla Seleccionar Next repetidamente hasta que el instalador empiece a copiar los ficheros El instalador abrirá una página Web - rellenar los datos y pedir la licencia La licencia será enviada por e-mail, (fichero student_license.dat) Copiar el anexo en la carpeta de instalación de ModelSim Si estás usando Windows <install_dir> = C:\ModelTech_pe_edu_X.Xx Si estás usando Linux+WinE <install_dir> = /home/myuser/.wine/drive_c/ ModelTech_pe_edu_X.Xx La licencia será valida por 180 días, pero se puede volver a pedir en http:// www.model.com/download/edu
Ejecutar ModelSim desde el enlace en el escritorio
Primera simulación Antes de simular un diseño, hay que crear una librería y compilar el código fuente en la librería. Crear una nueva carpeta (por ejemplo <work_dir> = C:\Users\myuser\DCSE or /home/ myuser/dcse) y copiar en ella los ficheros siguientes: <install_dir>/examples/tutorials/vhdl/basicsimulation/counter.vhd <install_dir>/examples/tutorials/vhdl/basicsimulation/tcounter.vhd Ejecutar ModelSim Si es la primera vez que se ejecuta ModelSim, aparecerá la pantalla de bienvenida. Seleccionar Close. Seleccionar File > Change Directory y cambiar a la carpeta <work_dir> (nota: en Linux la carpeta se encuentra el en drive Z) Crear la librería de trabajo: a. Seleccionar File > New > Library b. Dejar todos los campos sin cambiar y seleccionar Ok Compilar los ficheros VHDL. Ejecutar en la línea de comando (transcript): vcom -work work counter.vhd tcounter.vhd En la ventana Library, clicar el símbolo + a lado de la librería work para ver las unidades de diseño compiladas Cargar el diseño. Ejecutar en la línea de comando: vsim -novopt test_counter
Cuando se haya cargado el diseño, se abrirá la ventana Structure (etiquetada sim). Esta ventana muestra la estructura jerárquica del diseño. Es posible navegar en la jerarquía seleccionando los símbolos + (expandir) o - (contraer). Además, se abrirá una ventana Objects y una Processes. La ventana Objects muestra los nombres y los valores corriente de los objetos en la región seleccionada en la ventana Structure. Los objetos incluyen señales, redes, registros, constantes y variables que no estén declarados en un process, generics, o parameters (tres constructos del VHDL). Simular. Ya es posible simular. Pero antes de hacerlo, hay que abrir la ventana Wave y añadir señales a ella. Abrir la ventana Wave. Ejecutar: view wave Añadir las señales a la ventana Wave. Ejecutar: add wave dut/* Iniciar la simulación. Ejecutar: run 500 ns Aparecerán las formas de onda siguientes. Intenta navegar y desplazar el campo de vista. Cuando hayas acabado, cierra la simulación ejecutando: quit -sim
El código fuente La simulación precedente usa dos ficheros fuente, cada uno de los cuales representa una entity diferente y específica una architecture conrespondiente: Fichero Descripción Entitad (entity) Arquitectura (architecture) counter.vhd Device under test counter only tcounter.vhd Test bench tcounter only
counter.vhd 1 entity counter is 2 port (count : buffer bit_vector(8 downto 1); 3 clk : in bit; 4 reset : in bit); 5 end; 6 7 architecture only of counter is 8 constant tpd_reset_to_count : time := 3 ns; 9 constant tpd_clk_to_count : time := 2 ns; 10 11 function increment(val : bit_vector) return bit_vector 12 is 13 -- normalize the indexing 14 alias input : bit_vector(val'length downto 1) is val; 15 variable result : bit_vector(input'range) := input; 16 variable carry : bit := '1'; 17 begin 18 for i in input'low to input'high loop 19 result(i) := input(i) xor carry; 20 carry := input(i) and carry; 21 exit when carry = '0'; 22 end loop; 23 return result; 24 end increment; 25 begin 26 27 ctr: 28 process(clk, reset) 29 begin 30 if (reset = '1') then 31 if reset'event then 32 count <= (others => '0') after tpd_reset_to_count; 33 end if; 34 elsif clk'event and (clk = '1') then 35 count <= increment(count) after tpd_clk_to_count; 36 end if; 37 end process; 38 39 end only;
tcounter.vhd 1 entity test_counter is 2 PORT ( count : BUFFER bit_vector(8 downto 1)); 3 end; 4 5 architecture only of test_counter is 6 7 COMPONENT counter 8 PORT ( count : BUFFER bit_vector(8 downto 1); 9 clk : IN bit; 10 reset : IN bit); 11 END COMPONENT ; 12 13 SIGNAL clk : bit := '0'; 14 SIGNAL reset : bit := '0'; 15 16 begin 17 18 dut : counter 19 PORT MAP ( 20 count => count, 21 clk => clk, 22 reset => reset ); 23 24 clock : PROCESS 25 begin 26 wait for 10 ns; clk <= not clk; 27 end PROCESS clock; 28 29 stimulus : PROCESS 30 begin 31 wait for 5 ns; reset <= '1'; 32 wait for 4 ns; reset <= '0'; 33 wait; 34 end PROCESS stimulus; 35 36 end only;
Ejercicio 1 Cuando el compilador encuentra sólo una Arquitectura para una Entidad, la asocia automaticamente a ella. Sin embargo es posible anular este comportamiento, añadiendo una sentencia use. 1. Añadir la línea siguiente por debajo de la declaración del componente counter en el fichero tcounter.vhd: 11b for dut : counter use entity work.counter(only); 2. Proponer y justificar un nombre más apropiado que only para la Arquitectura asociada a la Entitad counter. Modificar el fichero fuente en acuerdo con el nuevo nombre y volver a simular el ejemplo. Ejercicio 2 El VHDL permite describir un sistema digital a nivel comportamental o estructural (jerárquica). El nivel comportamental además se puede dividir entre dos estilos: a flujo de datos o algoritmico. La representación a flujo de datos describe como los datos se mueven a través del sistema. Esto se hace tipicamente en términos de flujo de datos entre registros (register transfer level, rtl). El modelo a flujo de datos usa sentencias concurrentes que se ejecutan en paralelo a la vez que lleguan los datos en entrada. Por contra, las sentencias sequenciales se ejecutan una tras la otra en el mismo orden en el que estén escritas. El VHDL permite usar ambos tipos de sentencias. En el nivel estructural, el circuito está compuesto de sub-partes. La descripción especifica que típos tienen las partes usadas y como estas están conectadas la una a la otra. Este tipo de descripción es esencialmente un plano esquemático que representa un diagrama de bloques o circuital. 1. Determinar los niveles de descripción del código en counter.vhd y en tcounter.vhd. Justificar las respuestas. 2. Renombrar las arquitecturas añadiendo un sufijo que indique el tipo de descripción, de acuerdo con las respuestas del punto 1. Ejercicio 3 La palabra clave buffer en la declaración del contador en counter.vhd significa que el puerto count es un puerto de salida, al cual se puede escribir pero también leer desde dentro la arquitectura. Sin embargo, los tipos buffer no se usan comunemente en VHDL porqué pueden causar problemas a la hora de sintetizar el automaticamente el hardware. En cambio es preferible usar señales intermedios y declarar el puerto con el tipo out.
1. Cambiar el tipo del puerto count a out en la declaración de la entitad counter. 2. Aplicar las modificaciones oportunas para no incurrir en errores de lectura a un puerto de salida ( read from output ).