Verilog Code:FIR Filter= RAM 建模用于从文件中读取系数值.. 不显示仿真结果
Verilog Code:FIR Filter= RAM modeling for reading coefficients values from file .. not showing simulation results
在 verilog 中,只有这行代码显示了模拟输出
1)
#( parameter width=1, length=16 )
(* ram_style = "block" *)
reg [(width)-1:0] mem[(1<<length)-1:0];
2) 但对于下面的行,它没有显示模拟输出
#( parameter width=8, length=16 )
(* ram_style = "block" *)
reg [(2*width)-1:0] mem[(1<<length)-1:0];
解释为什么第二组代码没有显示模拟结果?
实际上我想存储 8 位 min 65535 滤波器系数..我想读写..
请在这方面指导我...
RAM 的模型可能看起来像下面的代码,写入它只是对 wr_addr、wr_data 和 wr_en 进行排序的问题。
module ram #(
parameter DATA_W = 8,
parameter DATA_D = 256
) (
input clk,
input rst_an,
input [0:$clog2(DATA_D)] rd_addr,
input [0:$clog2(DATA_D)] wr_addr,
input [0:DATA_W-1] wr_data,
input wr_en,
output [0:DATA_W-1] rd_data
);
reg [0:DATA_W-1] ram_data [0:DATA_D-1];
//READ
always @* begin
rd_data = ram_data[rd_addr];
end
//WRITE
always @(posedge clk, negedge rst_an) begin
if (~rst_an) begin
for(int i = 0; i<DATA_D ; i++) begin
ram_data[i] <= 'b0 ;
end
end
else begin
if (wr_en) begin
ram_data[wr_addr] <= wr_data ;
end
end
end
for(int i = 0; i<DATA_D ; i++)
是系统verilog语法。
for plain verilog declare integer i
then replace the for loop with :
for(i = 0; i<DATA_D ; i=1+1)
clog2 : 用于获取给定深度所需的地址宽度。
如果你想要4的深度,你需要2位来解决它。深度为16,4位为地址,即
log2( 4) => 2
log2(16) => 4
如果你使用 non-powers 两个你想四舍五入或 ceiling
log2(5) => 2.32192809489
clog2(5) => 3
因此,clog2 对于从 RAM 的深度获取所需的寻址宽度非常有用。
在 verilog 中,只有这行代码显示了模拟输出
1)
#( parameter width=1, length=16 )
(* ram_style = "block" *)
reg [(width)-1:0] mem[(1<<length)-1:0];
2) 但对于下面的行,它没有显示模拟输出
#( parameter width=8, length=16 )
(* ram_style = "block" *)
reg [(2*width)-1:0] mem[(1<<length)-1:0];
解释为什么第二组代码没有显示模拟结果? 实际上我想存储 8 位 min 65535 滤波器系数..我想读写.. 请在这方面指导我...
RAM 的模型可能看起来像下面的代码,写入它只是对 wr_addr、wr_data 和 wr_en 进行排序的问题。
module ram #(
parameter DATA_W = 8,
parameter DATA_D = 256
) (
input clk,
input rst_an,
input [0:$clog2(DATA_D)] rd_addr,
input [0:$clog2(DATA_D)] wr_addr,
input [0:DATA_W-1] wr_data,
input wr_en,
output [0:DATA_W-1] rd_data
);
reg [0:DATA_W-1] ram_data [0:DATA_D-1];
//READ
always @* begin
rd_data = ram_data[rd_addr];
end
//WRITE
always @(posedge clk, negedge rst_an) begin
if (~rst_an) begin
for(int i = 0; i<DATA_D ; i++) begin
ram_data[i] <= 'b0 ;
end
end
else begin
if (wr_en) begin
ram_data[wr_addr] <= wr_data ;
end
end
end
for(int i = 0; i<DATA_D ; i++)
是系统verilog语法。
for plain verilog declare integer i
then replace the for loop with :
for(i = 0; i<DATA_D ; i=1+1)
clog2 : 用于获取给定深度所需的地址宽度。
如果你想要4的深度,你需要2位来解决它。深度为16,4位为地址,即
log2( 4) => 2
log2(16) => 4
如果你使用 non-powers 两个你想四舍五入或 ceiling
log2(5) => 2.32192809489
clog2(5) => 3
因此,clog2 对于从 RAM 的深度获取所需的寻址宽度非常有用。