FPGA RAM / SRAM en VHDL

3

Hoy me quedé sin puertas en mi Xylinx Spartan 3 (Basys2 por Digilent) FPGA.

Esto no fue una sorpresa para mí, ya que había implementado una matriz de 8 bits x 2048 para usar como un búfer FIFO.

Código: type MEMORY is array(0 to (MEM_L - 1)) of std_logic_vector(7 downto 0);

donde MEM_L es un número entero, valor 2048.

Leí el resumen del producto y, como lo entiendo, hay 72 kB de RAM bidireccional en los FPGA de la serie Spartan 3E.

Sin embargo, no sé cómo usarlo (programarlo) usando VHDL. ¿Qué debo hacer para declarar que quiero que algunos datos se almacenen en la memoria RAM?

Inicialmente asumí que el uso de RAM dependía del compilador (sintetizador y herramientas de implementación) y que no podía controlar cómo se usaba directamente, sin embargo, sospecho que me equivoqué en este supuesto, porque el proceso de implementación Fallo debido a que mi FIFO es demasiado grande para la cantidad de puertas admitidas. (Aprox. 100 k puertas.)

Debo agregar que no pude encontrar una respuesta a través de google, ¿quizás no sabía qué buscar?

EDIT: Eso debería haber dicho 78 kb de ram, 78000 bits.

    
pregunta user3728501

2 respuestas

4

Lo más sencillo que se puede hacer (IMO) es instanciar directamente la primitiva del dispositivo en su VHDL. De esta manera, no está confiando en las herramientas para inferir el bloque RAM. En ISE, vaya a Editar - > Plantillas de idioma, y podrás abrir la plantilla. (Querrá elegir Spartan-3E, por supuesto, aunque creo que la primitiva es la misma en este caso).

La desventaja de usar la primitiva, por supuesto, es que su código no es portátil fuera de la familia de dispositivos. (Para las RAM de bloque, esto no es tan importante ya que son muy similares en todos los proveedores y familias).

Otra opción es usar Core Generator, que es quizás más fácil de configurar, pero lento durante la síntesis inicial. También puede generar un FIFO completo de esta manera.

Tal vez alguien pueda hablar sobre métodos para inferir bloque RAM.

    
respondido por el mng
2

XST puede inferir automáticamente bloques de RAM.

Lea la "Guía del usuario de XST" de Xilinx ref. UG627

"RAM de doble puerto con lectura síncrona (lectura completa)"

architecture syn of rams_11 is
    type ram_type is array (63 downto 0) of std_logic_vector (15 downto 0);
    signal RAM : ram_type;
    signal read_a : std_logic_vector(5 downto 0);
    signal read_dpra : std_logic_vector(5 downto 0);
begin
    process (clk)
    begin
        if (clk’event and clk = ’1’) then
            if (we = ’1’) then
                RAM(conv_integer(a)) <= di;
            end if;
            read_a <= a;
            read_dpra <= dpra;
        end if;
    end process;
    spo <= RAM(conv_integer(read_a));
    dpo <= RAM(conv_integer(read_dpra));
end syn;

También hay una solución cuando los puertos de lectura y escritura tienen diferentes relojes. BlockRAM son memorias registradas, por lo que no puede leer el contenido de forma asíncrona. También puede haber algunas opciones para verificar el cuadro de diálogo de síntesis de ISE ...

    
respondido por el TEMLIB

Lea otras preguntas en las etiquetas