这三个文件分别是atan_lut.v deinter_lut.v rot_lut.v 这三个文件位于openofdm/verilog/coregen目录下。
这三个ROM文件使用二进制的.mif文件来初始化的,我们用存储器的描述方法从新写,之后用readmemeb函数读.mif文件进行初始化。
module deinter_lut(
clka,
addra,
douta);
input clka;
input [10 : 0] addra;
output reg [21 : 0] douta;
reg [21:0] mem [2048-1:0] ;
initial begin
$readmemb("deinter_lut.mif",mem);
end
always @ (posedge clka) douta <= mem[addra] ;
endmodule
module rot_lut(
clka,
addra,
douta,
clkb,
addrb,
doutb);
input clka;
input [8 : 0] addra;
output reg [31 : 0] douta;
input clkb;
input [8 : 0] addrb;
output reg [31 : 0] doutb;
// synthesis translate_off
reg [31:0] mem [512-1:0] ;initial begin $readmemb("rot_lut.mif",mem);end
reg [8 : 0] addra_r,addrb_r ;
always @ (posedge clka) addra_r <= addra ;
always @ (posedge clkb) addrb_r <= addrb ;
always @ (posedge clka) douta <= mem[addra];
always @ (posedge clkb) doutb <= mem[addrb];
endmodule
`timescale 1ns/1ps
module atan_lut(
clka,
addra,
douta);
input clka;
input [7 : 0] addra;
output reg [8 : 0] douta;
reg [8:0] mem [255:0] ;
initial begin
$readmemb("atan_lut.mif",mem);
end
reg [7:0] addra_r ; always @ (posedge clka) addra_r <= addra ;
always @ (posedge clka) douta <= mem[addra] ;
endmodule
最初我不确定这个ROM有多少级的延迟,无非就是1,2,3级。我先从2级延迟实验,仿真发现最终结果不对,之后改成1级,结果正确。这里说的1级延迟就是说地址加到addra上之后,douta在下一个周期就出数据。
readmemb和readmemh这俩函数数年前仅仅用于仿真,现在已经被综合器支持了。这里注意初始化的.mif文件要保存在当前合适的目录。
咱们做这个的意义就是,让代码具有更强的可移植性。