做一个方便仿真的ROM

为了方便仿真这样写个ROM

FPGA中有专门的ROM IP Core,如果按照规范用Verilog编写的ROM文件可以被工具综合成RAM资源,而ASIC在需要后端去做专门Memory,前端仿真可以自己编写RAM/ROM/FIFO/RegFile IP。为了方便仿真这样写个ROM,方便初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module single_port_rom(/*autoarg*/
// Outputs
q,
// Inputs
addr, clk
);

parameter DATA_WIDTH = 8;
parameter ADDR_WIDTH = 8;

input [ADDR_WIDTH-1:0] addr;
input clk;
output reg [DATA_WIDTH-1:0] q;

reg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];

initial begins
$readmemh("/home/IC/Digital_Front_End_Verilog/ip_lib/rtl/DDS/triangular.txt", rom);
//$readmemb("sin.txt", rom);
end

always @ (posedge clk)begin
q <= rom[addr];
end

endmodule

系统函数$readmemh和$readmemb分别用来读取十六进制文件和二进制文件。貌似没有读十进制的。txt中的数据每行一个不需要逗号和最后一个数据后面的分号,数据格式对应。更多使用可以查询IEEE的Verilog语法手册。

例化方式和rom IP一样可参数化配置任意大小

1
2
3
4
5
6
7
8
9
10
11
single_port_rom 
#(
.DATA_WIDTH(DATA_WIDTH),
.ADDR_WIDTH(ADDR_WIDTH)
)
u_sin(/*autoinst*/
// Outputs
.q (dout[DATA_WIDTH-1:0]),
// Inputs
.addr (addra[ADDR_WIDTH-1:0]),
.clk (clk));

整了三个波形,仿真能跑起来。

sim

方波

三角波

将设计电路参数化可重复使用,构建自己的代码库,搭建起你的数字积木,本设计博主放在了GitHub上,可以在订阅号后台回复 “ip_lib”得到GitHub路径进行交流。

NingHeChuan wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!