openofdm初探之五:重写三个ROM文件

66 篇文章 23 订阅
58 篇文章 27 订阅
这篇博客讨论了在Verilog中如何使用readmemb函数从.mif文件初始化ROM,并通过atan_lut.v、deinter_lut.v和rot_lut.v模块展示了不同延迟级别的实现。重点在于理解ROM的延迟对系统性能的影响以及代码的可移植性。
摘要由CSDN通过智能技术生成

这三个文件分别是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文件要保存在当前合适的目录。

咱们做这个的意义就是,让代码具有更强的可移植性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值