Acceder a todos los datos y almacenarlos en el cable usando BLOCK RAM GENERATOR en Vivado usando verilog

Creé un generador de ram de bloque (ROM de puerto único) en vivado usando un archivo coe en verilog. Puedo leer los valores uno a la vez usando una declaración continua (capaz de instanciar el bloque rom una vez por pulso de reloj). Aquí está mi fragmento:

module coedata(clk,rst,a);
input clk,rst;
output  [31:0]a;
wire[12:0]addra,out;
wire [31:0]douta ;
count c1(clk,rst,out); // just gives count in 'out' to access address(addra)
assign addra=out;
blk_mem_gen_0 your_instance_name (
  .clka(clk),    // input wire clka
  .addra(addra),  // input wire [12 : 0] addra
  .douta(douta)  // output wire [31 : 0] douta
);
assign a=douta;
endmodule

Esto esta bien. Puedo leer el valor a través de la creación de instancias una vez por reloj. Pero quiero almacenar todos estos valores en un cable 2D como [31: 0] a [0: 100]. Quiero que todos los valores estén disponibles en un pulso de reloj. (Supongamos que hemos creado un bloque de ROM suficiente)

module coedata(clk,rst);
input clk,rst;
reg  [31:0]a[0:99];
wire[12:0]addra,out;
wire [31:0]douta ;
count c1(clk,rst,out,i); // just gives count in 'out-binary' to access,'i-integer' address(addra)
assign addra=out;
blk_mem_gen_0 your_instance_name (
  .clka(clk),    // input wire clka
  .addra(addra),  // input wire [12 : 0] addra
  .douta(douta)  // output wire [31 : 0] douta
);
assign a[i]=douta;
endmodule

Está diciendo que 'i' no es una constante.

Gracias de antemano.

Esto suena como un problema XY. ¿Qué estás tratando de hacer en última instancia?
Estoy tratando de crear un bloque de datos donde podamos usar todos los datos a la vez para realizar cálculos como en cualquier otra plataforma.
Entonces, ¿por qué estás usando una memoria RAM en lugar de solo un montón de registros?
Usé BLOCK RAM GENERATOR para obtener valores del archivo COE en Vivado.

Respuestas (1)

En primer lugar, revise el uso que hace de los términos; es muy importante que cuando utilice un HDL sepa lo que está describiendo. No puede almacenar datos en un cable : un cable es literalmente solo una conexión entre dos puntos.

En segundo lugar, debe comenzar a pensar en cómo podría convertir su código en hardware. Sin comprender el hardware subyacente que está tratando de describir, es muy difícil usar un HDL.

Su principal problema aquí es que todo el contenido de un bloque de RAM no se puede leer en un solo ciclo, a menos que tenga un ancho de dirección de cero (es decir, esté configurado como Nx1). Esto se debe a que la línea de dirección selecciona qué elemento de la RAM se está leyendo y esta dirección solo puede tomar un valor en cualquier ciclo de reloj. Esta es la misma razón por la que al programar software, no puede acceder a todos los elementos de una matriz simultáneamente .

En tu caso, para poder leer todo el contenido, necesitarías tener una memoria RAM de 3232x1. Sin embargo, no hay FPGA que yo sepa que tengan memorias RAM de bloque con un ancho de puerto de datos de 3232 bits. Podría instanciar una memoria 3232x1 usando registros discretos (por ejemplo reg [3231:0] mem;, ).

Si desea utilizar un bloque de RAM 2-D, debe describir un circuito que lea desde el bloque de RAM una dirección a la vez. En cada ciclo de reloj, lee una dirección y luego tiene que hacer algo con los datos, como almacenarlos en otro registro, realizar algún cálculo con ellos, etc.

Gracias Señor. sí, olvidé declarar la variable de almacenamiento como registro. Ahora puedo recuperar los datos de la ROM en la RAM 2D (recuperé un elemento una vez por pulso de reloj).