Filter Verilog代码:FIR滤波器=用于从文件读取系数值的RAM建模。。不显示模拟结果
在verilog中,仅此代码行显示其模拟输出Filter Verilog代码:FIR滤波器=用于从文件读取系数值的RAM建模。。不显示模拟结果,filter,verilog,ram,coefficients,Filter,Verilog,Ram,Coefficients,在verilog中,仅此代码行显示其模拟输出 #( parameter width=8, length=16 ) (* ram_style = "block" *) reg [(2*width)-1:0] mem[(1<<length)-1:0]; (一) #(参数宽度=1,长度=16) (*ram_style=“block”*) reg[(宽度)-1:0]mem[(1一个RAM模型可能看起来像下面的代码,写入它只是对wr_addr、wr_data和wr
#( parameter width=8, length=16 )
(* ram_style = "block" *)
reg [(2*width)-1:0] mem[(1<<length)-1:0];
(一)
#(参数宽度=1,长度=16)
(*ram_style=“block”*)
reg[(宽度)-1:0]mem[(1一个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
clog2:用于获取给定深度所需的地址宽度
如果你想要深度为4,你需要2位来寻址。深度为16,4位来寻址,即
log2( 4) => 2
log2(16) => 4
如果使用非二次幂,则要将其取整或上限
log2(5) => 2.32192809489
clog2(5) => 3
因此,clog2从RAM的深度获得所需的寻址宽度是非常有用的。对于内存的宽度和深度,更常见的做法是:reg[(宽度-1):0]mem[0:(深度-1)];
ya但我想要65535的深度和8位宽。那么如何编码?reg[(8-1):0]mem[0:(65535-1)];
用您指定的值替换宽度和深度。verilog也支持$clog2
吗?不,但您可以将其作为函数添加,应该在internet上的某个地方…为什么使用$clog2?@sugureshkumararari如果您想要深度为4,则需要2位来寻址。深度为16,寻址为4位。log2(4)=>2
,log2(16)=>4
如果使用非二次幂,则要将log2(5)=>2.32192809489
与clog2(5)=>3
进行比较。
log2( 4) => 2
log2(16) => 4
log2(5) => 2.32192809489
clog2(5) => 3