INFORMÁTICA INDUSTRIAL. 3º INGENIERÍA TÉCNICA ELECTRÓNICA TRABAJO TUTORADO DE VHDL. Primer Cuatrimestre Curso 2005/2006. OBJETIVOS: Con este proyecto se pretende que el alumno practique y afiance los conocimientos adquiridos en clase de teoría sobre descripción de hardware para aplicaciones industriales. El alumno deberá conocer la estructura, formato y estilo del leguaje de descripción de hardware VHDL. ESTRUCTURA: El trabajo será realizado en equipo (máximo tres alumnos). Tanto el enunciado del trabajo, como la división del mismo serán decisiones a tomar por el equipo. El seguimiento del trabajo se realizará en tres sesiones, cuyos horarios están publicados en http://www.atc.us.es y a los que los alumnos deben apuntarse a través de dicha página web. Sesión 1: Propuesta del trabajo por grupo. Herramientas de edición de proyectos VHDL (Xilinx ISE Foundation) y de Simulación VHDL (ModelSim). (8/Nov/2006 ó 15/Nov/2006) Los alumnos deben asistir al laboratorio con el equipo consolidado (máximo 3 alumnos), y con una propuesta de enunciado del trabajo siguiendo las indicaciones del apartado de ‘preparación’ de este enunciado. Defenderán dicha propuesta ante el profesor. Exposición y práctica sencilla sobre el manejo de las herramientas de edición y simulación. Usar los códigos VHDL del anexo 1. Sesión 2: Revisión: diagrama de bloques, VHDL sistema y simulación. Herramienta de Síntesis VHDL. (22/Nov/2006 ó 29/Nov/2006) Los alumnos deben asistir al laboratorio con una descripción VHDL de su sistema y un diagrama de bloques de la solución propuesta. Cada grupo defenderá ante el profesor la solución aportada y comentará y solventará los problemas que se han presentado con las simulaciones. Exposición y práctica sencilla sobre el manejo de la herramienta de síntesis VHDL. Cada grupo deberá realizar los mismos pasos con su proyecto. Realizar la simulación y la síntesis del sistema propuesto en el Anexo 2. Sesión 3: Revisión estado del trabajo. (22/Nov/2005) En esta sesión el profesor revisará el estado del trabajo de cada equipo. Será requisito disponer de una versión del VHDL totalmente operativa tanto del sistema como de la simulación del mismo. Cada grupo mostrará los resultados de la simulación de su proyecto al profesor. Los alumnos aprovecharán para preguntar y resolver los problemas que han ido encontrando durante la síntesis. PREPARACIÓN: Cada grupo debe pensar en un proyecto para este trabajo tutorado, siendo objeto de evaluación su originalidad. Se recomienda seguir las siguientes indicaciones: - La descripción VHDL debe ser de un hardware sencillo y aplicable a la industria. Su estructura de control contendrá al menos una máquina de estados. Su estructura de datos contendrá una parte combinacional (operaciones lógicas) y otra secuencial (registros y biestables). - Sólo se usará una señal de reloj (CLK) y un reset asíncrono a nivel alto (RST). Si se necesitan otras frecuencias de reloj se solventará a través de los enables de los biestables. Ejemplo: un hardware que conectado a un Microcontrolador, extienda su operabilidad. MEMORIA: Se entregará una memoria por equipo, con los siguientes apartados: enunciado del problema, reparto del trabajo, diagrama de bloques comentado de la solución propuesta, descripción VHDL comentada de la solución, descripción VHDL comentada de la simulación, resultados de la simulación (cronogramas comentados), comentarios de la síntesis y datos más relevantes (área ocupada, velocidad máxima), memoria de la evolución del proyecto. FECHA ENTREGA: La fecha tope de entrega de las memorias es el día del examen del primer cuatrimestre. Los grupos deberán entregar firmada la hoja de reparto de nota adjunta, junto con la memoria. 1 ANEXO 1 Código VHDL de un generador de números aleatorios. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity prandom32 is port (EN: in std_logic; PCLK: in std_logic; RSTz: in std_logic; O: out std_logic_vector (31 downto 0)); end prandom32; architecture A1 of prandom32 is signal ran: std_logic_vector (31 downto 0); begin BRAN: process (RSTz,PCLK) begin if RSTz='0' then ran <= "00000000000000000000000000000001"; --seed elsif PCLK'event and PCLK='1' then if EN='1' then for i in 31 downto 1 loop ran(i) <= ran(i-1); ran(0) <= ran(30) xor ran(2); end loop; end if; end if; end process; BOUT: process (ran,RSTz) begin O <= ran; end process; end A1; architecture A2 of prandom32 is signal ran: std_logic_vector (31 downto 0); begin process (RSTz,PCLK) begin if RSTz='0' then ran <= "00000000000000000000000000000001"; --seed elsif PCLK'event and PCLK='1' then if EN='1' then for i in 31 downto 1 loop ran(i) <= ran(i-1); ran(0) <= ran(31) xor ran(6) xor ran(4) xor ran(2) xor ran(1) xor ran(0); end loop; end if; end if; end process; BOUT: process (ran,RSTz) begin O <= ran; end process; end A2; Código VHDL de la simulación del generador de números aleatorios. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY testbench IS END testbench; ARCHITECTURE behavior OF testbench IS COMPONENT prandom32 PORT( EN : IN std_logic; PCLK : IN std_logic; RSTz : IN std_logic; O : OUT std_logic_vector(31 downto 0) ); END COMPONENT; SIGNAL SIGNAL SIGNAL SIGNAL EN : std_logic; PCLK : std_logic; RSTz : std_logic; O : std_logic_vector(31 downto 0); BEGIN uut: prandom32 PORT MAP( ); EN => EN, PCLK => PCLK, RSTz => RSTz, O => O tb : PROCESS BEGIN pclk wait pclk wait END PROCESS; <= '0'; for 5 ns; <= '1'; for 5 ns; brst: process begin rstz <= '0'; wait for 1 us; rstz <= '1'; wait; end process; en <= '1'; END; 2 ANEXO 2 Código VHDL de un sistema simple: Receptor de protocolo RS-232 serie. CLKS es el reloj de 9600 baudios y CLK el reloj del sistema de 25 MHz. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; -- Lee la linea de recepcion del puerto serie (TX del PC y RX en nuestro receptor) y saca los 8 bits en paralelo dando -- un pulso en LD para su captura por otro circuito. -- La senal de salida WS se usa para la sincronizacion del divisor del reloj entity rx_serie is Port (CLKS: in std_logic; -- 9600 baudios CLK: in std_logic; -- 25 MHz RX: in std_logic; RSTz: in std_logic; WS: out std_logic; -- indica si estamos en el estado de espera por bit de start. LD: out std_logic; DOUT: out std_logic_vector(7 downto 0)); end rx_serie; architecture Behavioral of rx_serie is type t_state is (wait_start,read_data,stop_bit); signal estado,proximo_estado: t_state; signal data: std_logic_vector (7 downto 0); signal cont: integer range 0 to 8; signal iLD: std_logic; begin B_SYNC: process (CLKS,RSTz) begin if RSTz='0' then estado <= wait_start; cont <= 0; data <= (others=>'0'); elsif CLKS'event and CLKS='1' then estado <= proximo_estado; case estado is when read_data => if cont < 8 then data(cont)<=RX; cont<=cont+1; end if; when others => cont <= 0; end case; end if; end process; B_ASYN: process (estado,cont,RX,data) begin case estado is when wait_start => if RX='0' then proximo_estado <= read_data; else proximo_estado <= wait_start; end if; iLD <= '0'; WS <= '1'; when read_data => if cont <7 then proximo_estado <= read_data; else proximo_estado <= stop_bit; end if; iLD <= '0'; WS <= '0'; when stop_bit => if RX='1' then proximo_estado <= wait_start; else proximo_estado <= read_data; end if; iLD <= '1'; WS <= '0'; end case; end process; DOUT <= data; B_LD: process (CLK,RSTz) variable one: boolean; -- Para dar un pulso de CLK por un pulso de CLKS begin if RSTz='0' then LD <= '0'; one := true; elsif CLK'event and CLK='1' then if iLD='1' and one then LD <= '1'; one := false; elsif iLD='1' and not one then LD <='0'; elsif iLD='0' then one := true; LD <= '0'; end if; end if; end process; end Behavioral; 3 Código de simulación del sistema anterior. LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY sim_rxserie_vhd IS END sim_rxserie_vhd; ARCHITECTURE behavior OF sim_rxserie_vhd IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT rx_serie PORT( CLKS : IN std_logic; CLK : IN std_logic; RX : IN std_logic; RSTz : IN std_logic; WS : OUT std_logic; LD : OUT std_logic; DOUT : OUT std_logic_vector(7 downto 0) ); END COMPONENT; --Inputs SIGNAL CLKS : std_logic := '0'; SIGNAL CLK : std_logic := '0'; SIGNAL RX : std_logic := '0'; SIGNAL RSTz : std_logic := '0'; --Outputs SIGNAL WS : std_logic; SIGNAL LD : std_logic; SIGNAL DOUT : std_logic_vector(7 downto 0); constant data: std_logic_vector(0 to 7) := "01010101"; -- Dato = 0xAA BEGIN -- Instantiate the Unit Under Test (UUT) uut: rx_serie PORT MAP( CLKS => CLKS, CLK => CLK, RX => RX, RSTz => RSTz, WS => WS, ); LD => LD, DOUT => DOUT BRST: process begin rstz <= '0'; wait for 1 us; rstz <= '1'; wait; end process; BCLK: PROCESS BEGIN clk <= '0'; wait for 20 ns; clk <= '1'; wait for 20 ns; END PROCESS; BCLKS: PROCESS BEGIN clks <= '0'; wait for 51 us; clks <= '1'; wait for 51 us; END PROCESS; BDATA: process begin rx <= '1'; wait until rstz='1'; wait until clks'event and clks='1'; rx <= '0'; -- bit de start for i in 0 to 7 loop wait until clks'event and clks='1'; rx <= data(i); end loop; wait until clks'event and clks='1'; rx <= '1'; -- bit de stop wait; end process; END; 4 INGENIERÍA TÉCNICA INDUSTRIAL ELECTRÓNICA INFORMÁTICA INDUSTRIAL CURSO 2006-2007 TRABAJO TUTORADO DE VHDL. REPARTO DE CALIFICACIONES ENTRE LOS COMPONENTES DEL GRUPO. 3º INGENIERÍA TÉCNICA INDUSTRIAL, ESPECIALIDAD ELECTRÓNICA. Los componentes del equipo que ha desarrollado el trabajo titulado ..................................................... ...………...................................................................................................................., que ha obtenido una calificación de ....... puntos, consideran que el reparto de dicha calificación , de acuerdo al reparto del trabajo que se ha realizado, debe ser la indicada a continuación, estando conformes todos los componentes del equipo. Nombre y Apellidos 1..................................................................................................... 2..................................................................................................... 3..................................................................................................... Fdo................................. Fdo..................................... Calificación .................... .................... .................... Fdo..................................... Sevilla, ...... de .................. de 200… 5