Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3er Curso
Sistemas Electrónicos Digitales
PRACTICA nº 7
Objetivos:
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
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;
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
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”.
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.
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
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.
w_d
w_a Ia w_d-1 Ia 0 data_in_a
rw_address_a Aa w_a-1Aa 0 w_d
Oa w_d-1 Oa0 data_out_a
w_a
rw_address_b Ab w_a-1 Ab0
w_d
rw_clock_a clk_a Ib w_d-1 Ib 0 data_in_b
rw_clock_b clk_b w_d
Ob w_d-1 Ob0 data_out_b
we_a w_a
we_b w_b
Figura 3
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;
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
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
Para la edición del fichero VHDL, compilación y síntesis utilizar la versión Quartus II 9.1 del
Laboratorio.
…, 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):
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).
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.
6 de 6