¿Cómo acceder al mismo módulo de RAM desde diferentes módulos?

0

Tengo un kit de inicio ciclón v gx. Viene con 4884 bits de memoria de chip. Quiero escribir un módulo para acceder a la memoria onchip. Por lo tanto, he generado el diseño de referencia ip del ram del catálogo de ip como este:

module onchipmem (
    aclr,
    address,
    clken,
    clock,
    data,
    rden,
    wren,
    q);

    input     aclr;
    input   [7:0]  address;
    input     clken;
    input     clock;
    input   [15:0]  data;
    input     rden;
    input     wren;
    output  [15:0]  q;
'ifndef ALTERA_RESERVED_QIS
// synopsys translate_off
'endif
    tri0      aclr;
    tri1      clken;
    tri1      clock;
    tri1      rden;
'ifndef ALTERA_RESERVED_QIS
// synopsys translate_on
'endif
wire [15:0] sub_wire0;
wire [15:0] q = sub_wire0[15:0];

altsyncram  altsyncram_component (
          ...
          );

Puedo escribir / leer datos creando una instancia de este módulo:

onchipmem write_mem (
    .aclr(reset),
    .address(address),
    .clken(ce),
    .clock(clk),
    .data(data),
    .rden(1'b0),
    .wren(1'b1),
    .q()
    );

Quiero guardar los datos por onchipmem en un módulo y leer los datos de la misma instancia de onchipmem de otro módulo. Sin embargo, la creación de varias instancias de onchipmem asignará un bloque duplicado de RAM por instancia.

En otras palabras, un módulo de RAM único no puede ser llamado por varios módulos. Entonces, ¿cómo implementar un módulo RAM de uso compartido para que múltiples módulos puedan acceder?

Encontré esta respuesta y sugerí usar arbiter . Proporcionó algunos códigos de muestra de un árbitro, pero no está completado.

Soy nuevo en fpga y no puedo ver cómo funciona.

Por lo tanto, estoy buscando un ejemplo real y completo para poder aprenderlo y probarlo en modelsim.

Por favor avise.

    
pregunta Ken Tsang

1 respuesta

1

Un árbitro es la forma general de hacerlo.

Un árbitro es esencialmente un bloque que está conectado a su RAM y lee / escribe datos desde / a la RAM.

El árbitro exporta interfaces (puede ser un conteo arbitrario) a otros módulos. A través de estas interfaces los módulos pueden acceder a la memoria RAM a través del árbitro. El árbitro maneja internamente la solicitud desde su entrada. Hay varias formas de manejar las solicitudes:

  • Los diferentes módulos tienen diferentes prioridades.
  • Las solicitudes se procesan en un ciclo de robin redondo
  • etc.

La implementación específica depende en gran medida de la interfaz utilizada. El inferface del árbitro a la RAM viene dado por el módulo de RAM que utiliza. Sin embargo, estos estándares de interfaz en su mayoría no son utilizables para los puertos de entrada de un árbitro, ya que no son capaces de manejar tiempos variables. Si un módulo desea escribir en la RAM, se le da acceso a otro en el momento en que el árbitro tiene que detener la interfaz hasta que pueda procesar la solicitud.

En los sistemas Altera, el bus AvalonMM es una forma común y compatible con muchos núcleos IP de Altera. Pero también puedes ir con Wishbone o un autobús personalizado.

No tengo un ejemplo completo porque depende en gran medida de sus requisitos. Sin embargo, un simple árbitro es un buen proyecto para aprender.

Otra forma rápida de conectar dos módulos a una RAM es generar una RAM de doble puerto con el Asistente de Altera. Esta memoria RAM tiene 2 puertos RAM de uso independiente.

    
respondido por el GNA

Lea otras preguntas en las etiquetas