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:[email protected]//) 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 entity counter is port (count : buffer bit_vector(8 downto 1); clk : in bit; reset : in bit); end; architecture only of counter is constant tpd_reset_to_count : time := 3 ns; constant tpd_clk_to_count : time := 2 ns; function increment(val : bit_vector) return bit_vector is -- normalize the indexing alias input : bit_vector(val'length downto 1) is val; variable result : bit_vector(input'range) := input; variable carry : bit := '1'; begin for i in input'low to input'high loop result(i) := input(i) xor carry; carry := input(i) and carry; exit when carry = '0'; end loop; return result; end increment; begin ctr: process(clk, reset) begin if (reset = '1') then if reset'event then count <= (others => '0') after tpd_reset_to_count; end if; elsif clk'event and (clk = '1') then count <= increment(count) after tpd_clk_to_count; end if; end process; end only; tcounter.vhd 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 entity test_counter is PORT ( count : BUFFER bit_vector(8 downto 1)); end; architecture only of test_counter is COMPONENT counter PORT ( count : BUFFER bit_vector(8 downto 1); clk : IN bit; reset : IN bit); END COMPONENT ; SIGNAL clk : bit := '0'; SIGNAL reset : bit := '0'; begin dut : counter PORT MAP ( count => count, clk => clk, reset => reset ); clock : PROCESS begin wait for 10 ns; clk end PROCESS clock; stimulus : PROCESS begin wait for 5 ns; reset wait for 4 ns; reset wait; end PROCESS stimulus; end only; <= not clk; <= '1'; <= '0'; 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”).