我想使用verilog将过滤系数(固定值)存储在ROM中.Below是使用case的ROM代码。
module rom_using_case (
address , // Address input
data , // Data output
read_en , // Read Enable
ce // Chip Enable
);
input [3:0] address;
output [7:0] data;
input read_en;
input ce;
reg [7:0] data ;
always @ (ce or read_en or address)
begin
case (address)
0 : data = 10;
1 : data = 55;
2 : data = 244;
3 : data = 0;
4 : data = 1;
5 : data = 8'hff;
6 : data = 8'h11;
7 : data = 8'h1;
8 : data = 8'h10;
9 : data = 8'h0;
10 : data = 8'h10;
11 : data = 8'h15;
12 : data = 8'h60;
13 : data = 8'h90;
14 : data = 8'h70;
15 : data = 8'h90;
endcase
end
endmodule
case块在上面的代码中做了什么? 我可以将滤波器系数存储在案例块中的数据变量中吗? 我可以访问那些滤波器系数吗?
答案 0 :(得分:0)
正如您所述,系数将存储在RAM LUT或ROM块中。
代码(在某种程度上)是自我描述性的,address
对data
敏感,然后每次地址更改其值时,存储的值都将分配给case
,{{1} }是选择器,内存块的位置将被分配给数据。
对于小型过滤器,您的实现已足够,但如果您需要大量系数,则难以维护。
为此,您可以使用$readmemh
或$readmemb
。那些是verilog内在的tasks。
来自:https://www.csee.umbc.edu/~tinoosh/cmpe415/slides/Rom-LUT-verilog.pdf
$readmemh
系统任务需要指定文件的内容
一系列十六进制数字,由空格或换行符分隔。
同样,$readmemb
期望文件包含二进制序列。
以下是一个显示如何使用它的代码段:
reg [19:0] data_ROM [0:511];
...
initial $readmemh("rom.data", data_ROM);
always @(address)
if (ce & read_en)
d_out = data_ROM[address];
"rom.data"
包含文本中的系数。例如,在您的情况下:
8'hA
8'h37
8'hF4
8'h0
8'h1
8'hff
8'h11
8'h1
8'h10
8'h0
8'h10
8'h15
8'h60
8'h90
8'h70
8'h90