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.
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.
alex.forencich
sandeep yo
alex.forencich
sandeep yo