Download PRACTICA nº 7

Document related concepts
no text concepts found
Transcript
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