设计ROM以保存verilog中的滤波器系数

时间:2017-03-27 20:35:13

标签: verilog rom

我想使用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块在上面的代码中做了什么? 我可以将滤波器系数存储在案例块中的数据变量中吗? 我可以访问那些滤波器系数吗?

1 个答案:

答案 0 :(得分:0)

正如您所述,系数将存储在RAM LUT或ROM块中。 代码(在某种程度上)是自我描述性的,addressdata敏感,然后每次地址更改其值时,存储的值都将分配给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