Grado en Ingeniería de Tecnologías de Telecomunicación 3er Curso Sistemas Electrónicos Digitales PRACTICA nº 7 Diseño de Memorias RAM y ROM. Síntesis e implementación sobre dispositivos FPGA. Síntesis empleando FFs y síntesis utilizando bits de RAM dedicados Objetivos: Descripción y síntesis de memorias mediante VHDL. Inferencia de memorias. Código VHDL genérico y estilos de diseño recomendados. Realización sobre un dispositivo FPGA utilizando FFs y empleando celdas específicas de memoria RAM existentes en el dispositivo. Inicialización de memorias. Herramientas CAD:Quartus II©. Instrumentación: --. Material fungible o de laboratorio: --. Parte 1:Diseño y síntesis de una memoria RAM utilizando una descripción VHDL y síntesis sobre un dispositivo FPGA utilizando su lógica interna estándar. Figura 1 Se pretende implementar sobre un dispositivo FPGA la memoria RAM estática representada en la figura 1. Se trata de una memoria con A líneas de direcciones y D líneas para entrada y salida de datos. La escritura de un dato en una posición de memoria es síncrona, controlada por el flanco positivo del reloj de escritura WCLK; la lectura de datos es asíncrona. Dispone de una entrada de habilitación /CE de modo que cuando se encuentra inactiva las salidas de datos permanecen en alta impedancia (HZ). La señal R/W habilita la lectura cuando se encuentra a nivel H o la escritura en la memoria cuando toma nivel L. Una posible descripción del bloque de memoria se muestra en la figura 2. library ieee; use ieee.std_logic_1164.all; 1 de 6 Grado en Ingeniería de Tecnologías de Telecomunicación 3er Curso Sistemas Electrónicos Digitales use ieee.numeric_std.all; entity SRAM is generic ( A : integer := 8; D : integer := 8 ); port ( Address : in std_logic_vector (A-1 downto 0); Data : inout std_logic_vector (D-1 downto 0); CLK : in std_logic; CE : in std_logic; RW : in std_logic ); end SRAM; architecture beh of SRAM is type tipo_RAM is array(2**A-1 downto 0) of std_logic_vector (D-1 downto 0); signal ram_stat : tipo_RAM; attribute ram_init_file : string; attribute ram_init_file of ram_stat : signal is “SRAM.mif”; begin process (CE, RW) begin if (CE = ‘0’ and RW = ‘1’) then Data <= ram_stat (to_integer(unsigned(Address))); else Data <= (others => ‘Z’); end if; end process; process (CLK) begin if (CLK’event and CLK = ‘1’) then if (CE = ‘0’ and RW = ‘0’) then ram_stat (to_integer(unsigned(Address))) <= Data; end if; end if; end process; end beh; Figura 2 a) Utilizando Quartus II©, sintetizar el bloque de memoria a partir de la descripción VHDL de la figura 2. Editar el fichero RAM.mif para inicialización. El contenido del fichero debe ser el siguiente: En las ocho primeras direcciones el valor del dato debe coincidir con la dirección. En las restantes direcciones el contenido inicial debe ser “0”. Para crear el fichero SRAM.mif: File -> New…: New √ Other Files -> Memory Initialization File. √ OK: Number of Words & Word Size: Number of Words: 256, Word Size: 8. √ OK. Mif1.mif: En la fila 0, columnas +0, +1, …, +7, rellenar cada casilla con el valor especificado para el dato; mantener los datos en las demás casillas como están (a “0”). Guardar el fichero con el nombre SRAM.mif. Para la compilación y síntesis, seleccionar el chip FPGA Cyclone II EP2C35F672C6: Assignments -> Settings: Settings SRAM: Category -> Device: Family √ Cyclone II: Target Device √ Specific Device selected in ‘Available devices’ list. Show in ‘Available devices’ list √ Fastest. Available devices: √ EP2C35F672C6. Para la compilación y síntesis, aunque en este caso no es necesario, seleccionar: Assignments -> Settings: Settings - SRAM: Category -> Analysis & Synthesis Settings: Analysis & Synthesis Settings √ Auto RAM Replacement, √ More Settings…: More Analysis & Synthesis Settings: Existing option settings: 2 de 6 Grado en Ingeniería de Tecnologías de Telecomunicación 3er Curso Sistemas Electrónicos Digitales Seleccionar Allow Any RAM Size For Recognition: Option: Setting: On. √ OK. √ OK. Compilar el diseño. Comprobar que la memoria en este caso se ha implementado utilizando FFs. Comprobar que el número de FFs utilizados se corresponde con el número de bits de memoria requeridos. Comprobar que Quartus II© ha utilizado un bloque parametrizable de biblioteca para su implementación. Para comprobar cómo se ha implementado la memoria y los recursos del FPGA Cyclone II EP2C35F672C6 utilizados: Compilation Report - Flow Summary: Total logic elements, Total registers, Total memory bits. Para comprobar si se ha utilizado un bloque de biblioteca: Tools -> Netlist_Viewers -> RTL Viewer: RTL Viewer. b)Simular el bloque de memoria sintetizado. Construir un fichero de formas de onda SRAM.vwf. Las señales de control deben fijar inicialmente a la RAM en modo lectura de las primeras direcciones de la memoria; a continuación, pasando la memoria al modo de escritura, se deberá cargar en las ocho direcciones de memoria más bajas los valores 256, 255, …, 249; finalmente, deberá pasar a modo lectura y leer de nuevo en las direcciones más bajas de la memoria. Al introducir en el fichero de formas de onda la señal Data (bidireccional) aparecerá representada por un terminal de entrada/salida (IO). Una vez realizada la simulación, aparecerán un conjunto de salidas adicionales (Data[0]~result, Data[1]~result, …, Data[7]~result), independientemente de que se haya seleccionado o no la opción: Assignments -> Settings: Settings - SRAM: Category -> Simulator Settings: Simulator Settings: √ Automatically add pins to simulation output waveforms. √ OK. Modificar el fichero de formas de onda SRAM.vwf incluyendo estas señales agrupadas. Para incluir las señales en el fichero de formas de onda de entrada: Seleccionar las señales en el fichero de salida de simulación. Copiarlas en el fichero de formas de onda de entrada. Reordenarlas y agruparlas como Data[7..0]~result. Fijar los valores de la señal a “X”. Simular de nuevo el bloque de memoria comprobando que su comportamiento corresponde a lo esperado y comentar las respuestas obtenidas. c) Generar automáticamente un testbench, SRAM.vht, para la RAM sintetizada a partir de las señales de prueba aplicadas mediante el fichero de formas de onda. Analizar el fichero SRAM.vht. Para generar el testbench: Con la ventana de formas de onda activa: File -> Export: Seleccionar un nombre para el fichero. √ Export. Parte 2:Diseño y síntesis de una memoria RAM utilizando una descripción VHDL y síntesis sobre un dispositivo FPGA utilizando bloques específicos de celdas de memoria RAM internos. 3 de 6 Grado en Ingeniería de Tecnologías de Telecomunicación 3er Curso Sistemas Electrónicos Digitales Se pretende implementar sobre un dispositivo FPGA la memoria RAM estática representada en la figura 3. Se trata de una memoria del tipo: True dual-port double-clock/single-clock synchronous RAM Dispone de dos puertos de direcciones de w_a líneas, dos puertos de entrada de datos y dos puertos de salida de datos de w_d líneas. Dispone de dos entradas de reloj para lectura y escritura síncronas y dos entradas para habilitación de escritura. Cada señal de reloj tiene asociados, un puerto de direcciones, un puerto de datos de entrada y uno de salida, así como una señal de habilitación de escritura. Puede operar con un solo reloj para control de la lectura/escritura en/desde ambos puertos. rw_address_a rw_address_b w_a w_a w_d Ia w_d-1 Ia 0 Aa w_a-1Aa 0 Oa w_d-1 Oa0 Ab w_a-1 Ab0 rw_clock_a clk_a Ib w_d-1 Ib 0 rw_clock_b we_a we_b clk_b w_a w_b Ob w_d-1 Ob0 data_in_a w_d data_out_a w_d data_in_b w_d data_out_b Figura 3 Una posible descripción del bloque de memoria se muestra en la figura 4. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity true_dual_port_ram_double_clock is generic ( w_a : integer := 6; w_d : integer := 8 ); port ( clk_a : in std_logic; clk_b : in std_logic; data_ia : in std_logic_vector (w_d-1 downto 0); data_ib : in std_logic_vector (w_d-1 downto 0); address_a : in std_logic_vector (w_a-1 downto 0); address_b : in std_logic_vector (w_a-1 downto 0); we_a : in std_logic; we_b : in std_logic; data_oa: out std_logic_vector (w_d-1 downto 0); data_ob: out std_logic_vector (w_d-1 downto 0) ); end true_dual_port_ram_double_clock; architecture rtl of true_dual_port_ram_double_clock is type mem is array(2**w_a-1 downto 0) of std_logic_vector (w_d-1 downto 0); signal mem_block : mem; attribute ram_init_file : string; attribute ram_init_file of mem_block : signal is “true_dual_port_ram_dual_clock.mif”; begin process (clock_a) variable dir_a : integer range 0 to 2**w_a-1; begin dir_a := to_integer(unsigned(address_a)); if (clock_a'event and clock_a = '1') then 4 de 6 Grado en Ingeniería de Tecnologías de Telecomunicación 3er Curso Sistemas Electrónicos Digitales if (we_a = '1') then mem_block(dir_a) <= data_ia; — Lectura-durante-escritura en el mismo puerto retorna nuevo dato data_oa <= data_ia; else — Lectura-durante-escritura en el otro puerto retorna antiguo dato data_oa <= mem_block(dir_a); end if; end if; end process; process (clock_b) variable dir_b : integer range 0 to 2**w_a-1; begin dir_b := to_integer(unsigned(address_b)); if (clock_b'event and clock_b = '1') then if (we_b = '1') then mem_block(dir_b) <= data_ib; data_ob <= data_ib; else data_ob <= mem_block(dir_b); end if; end if; end process; end rtl; Figura 4 a) Utilizando Quartus II©, sintetizar el bloque de memoria a partir de la descripción VHDL de la figura 1. Para la edición del fichero VHDL, compilación y síntesis utilizar la versión Quartus II 9.1 del Laboratorio. Para la compilación y síntesis, seleccionar el chip FPGA Stratix II EP2S15F672C3: Assignments -> Settings: Settings SRAM: Category -> Device: Family √ Stratix II: Target Device √ Specific Device selected in ‘Available devices’ list. Show in ‘Available devices’ list √ Fastest. Available devices: √ EP2S15F672C3. Para la compilación y síntesis seleccionar: Assignments -> Settings: Settings - SRAM: Category -> Analysis & Synthesis Settings: Analysis & Synthesis Settings √ Auto RAM Replacement, √ More Settings…: More Analysis & Synthesis Settings: Existing option settings: Seleccionar Allow Any RAM Size For Recognition: Option: Setting: On. √ OK. √ OK. Editar el fichero true_dual_port_ram_double_clock.mif para inicialización. El contenido del fichero debe ser el siguiente: en las ocho primeras direcciones los valores de los datos serán 100, 99, 98, …, 93; en las restantes direcciones el contenido inicial debe ser “0”. Compilar el diseño. Comprobar que la memoria en este caso se ha implementado utilizando las celdas de RAM internas de la FPGA. Comprobar que el número de bits de memoria utilizados se corresponde con el número de bits de memoria requeridos. Comprobar que Quartus II© ha utilizado un bloque parametrizable de biblioteca para su implementación. b)Simular el bloque de memoria sintetizado. Construir un fichero de formas de onda SRAM.vwf. Las señales de control deben fijar inicialmente a la RAM en modo lectura de las primeras direcciones de la memoria; a continuación, pasando la memoria al modo de escritura, se deberá cargar en las ocho direcciones de memoria más bajas los valores 256, 255, 5 de 6 Grado en Ingeniería de Tecnologías de Telecomunicación 3er Curso Sistemas Electrónicos Digitales …, 249; finalmente, deberá pasar a modo lectura y leer de nuevo en las direcciones más bajas de la memoria. Comprobar que, en este caso, la memoria no se inicializa correctamente mediante el fichero de inicialización (.mif): En esta memoria, si se escribe en la misma dirección en ambos puertos al mismo tiempo, el resultado es indeterminado (depende de la arquitectura del chip FPGA y de la herramienta de compilación y síntesis). El diseñador debe asegurarse de que esta situación no ocurre en el circuito diseñado o de que esta circunstancia no afecta a su operación. El diseñador debe asegurarse de que el diseño no implica prioridad de escrituras en la memoria (la operación de ambos puertos no puede estar definida en el mismo process) si se desea que dicha memoria de implemente en los bloques de memoria dedicada. Realizar una simulación del bloque de memoria sintetizado que recoja (al menos) las señales aplicadas que se muestran en la figura 5. Analizar los resultados, caracterizando el comportamiento de la memoria, particularmente cuando se lee/escribe a través de un puerto mientras se escribe a través del otro puerto en las mismas direcciones. Figura 5 c) Repetir los apartados anteriores utilizando una function para la inicialización de la memoria. Comprobar que este caso la inicialización es correcta. Parte 3:Diseño y síntesis de una memoria ROM utilizando una descripción VHDL y síntesis sobre un dispositivo FPGA utilizando bloques específicos de celdas de memoria RAM internos. a) Escribir un fichero VHDL para una ROM de 64 palabras de 8 bits, a nivel behavioral. El contenido de la memoria deberá ser el siguiente: primeras 63 direcciones: cuenta natural creciente en código de Gray. Última dirección: Suma de comprobación (paridad impar). Para la compilación y síntesis, seleccionar el chip FPGA Cyclone II EP2C35F672C6. Fijar adecuadamente los settings para la compilación y síntesis (configuración) del chip. Dejar sin fijar la asignación de pines. Preparar un fichero de formas de onda para simular el circuito utilizando Quartus II. La simulación deberá reflejar el correcto funcionamiento de la memoria. b) Determinar el tiempo de acceso desde dirección, tADD, de la memoria. 6 de 6