Accediendo a todos los datos y almacenándolos por cable usando BLOCK RAM GENERATOR en Vivado usando verilog

1

He creado un generador de ram de bloque (ROM de un solo puerto) en vivado usando un archivo coe en verilog. Soy capaz de leer los valores uno por vez utilizando una instrucción continua (capaz de crear una instancia del 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 está bien. Puedo leer valor a través de una instancia de un 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. (Solo suponga que hemos creado un bloque 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.

    
pregunta Sandeep I

1 respuesta

1

En primer lugar, revise su uso de los términos, es muy importante cuando usa un HDL que esté al tanto de 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, debes comenzar a pensar en cómo tu código podría convertirse a hardware. Sin comprender el hardware subyacente que intenta describir, es muy difícil utilizar un HDL.

Su principal problema aquí es que el contenido completo de una RAM de bloque 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 su caso, para leer todo el contenido, debe 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 crear una instancia de una memoria de 3232x1 mediante registros discretos (por ejemplo, reg [3231:0] mem; ).

Si desea utilizar una memoria RAM de bloque 2-D, debe describir un circuito que lea de la memoria RAM del bloque una por vez. Cada ciclo de reloj lees una dirección y luego tienes que hacer algo con los datos, como almacenarlo en otro registro, realizar algún cálculo con él, etc.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas