FPGA Modelo de RAM simple: ¿por qué se retrasa la dirección?

1

En el código de ejemplo a continuación de Doulos que modela RAM usando una matriz, ¿por qué es la dirección retrasado?

Específicamente, ¿por qué se molestaron en crear una segunda señal read_address en lugar de usar la entrada address para acceder a la matriz?

Sospecho que tiene algo que ver con concurrente versus secuencial, pero no puedo entenderlo ...

-- Simple generic RAM Model
--
-- +-----------------------------+
-- |    Copyright 2008 DOULOS    |
-- |   designer :  JK            |
-- +-----------------------------+

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.Numeric_Std.all;

entity sync_ram is
  port (
    clock   : in  std_logic;
    we      : in  std_logic;
    address : in  std_logic_vector;
    datain  : in  std_logic_vector;
    dataout : out std_logic_vector
  );
end entity sync_ram;

architecture RTL of sync_ram is

   type ram_type is array (0 to (2**address'length)-1) of std_logic_vector(datain'range);
   signal ram : ram_type;
   signal read_address : std_logic_vector(address'range);

begin

  RamProc: process(clock) is

  begin
    if rising_edge(clock) then
      if we = '1' then
        ram(to_integer(unsigned(address))) <= datain;
      end if;
      read_address <= address;
    end if;
  end process RamProc;

  dataout <= ram(to_integer(unsigned(read_address)));

end architecture RTL;
    
pregunta Jet Blue

2 respuestas

4

Es una RAM de escritura primero (escribir antes de leer), por lo que la dirección se retrasa para ver el nuevo valor en dataout puerto. Si dataout se retrasara, veríamos el valor anterior en dataout puerto y se convertiría en una lectura en primer lugar RAM

.     
respondido por el ahmedus
2

En general, el bloque de RAM en los FPGA es sincrónico, por lo tanto, se debe registrar algo (ya sea la dirección de entrada o la de salida de datos) para que la RAM se infiera correctamente. A veces, incluso tiene que registrar ambos si desea obtener un rendimiento muy alto, de lo contrario, el bloqueo de salida del reloj de RAM puede causar problemas. La RAM distribuida, por otro lado, suele ser asíncrona y, por lo tanto, no necesita implementarse de esta manera.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas