FPGA 片内 ROM 测试实验
实验说明
FPGA里的程序断电就会消失,可以使用RAM实现一个假的ROM,每次上电都会把初始化的值先写入 RAM。
实验过程主要是创建一个rom,但需要勾选使用初始化的文件的选项。
实验准备
coe文件用于设置ROM的初始值。
MEMORY_INITIALIZATION_RADIX=16; // 进制
MEMORY_INITIALIZATION_VECTOR=
00,
01,
02,
03,
04,
05,
06,
07,
08,
09,
0a,
0b,
0c,
0d,
0e,
0f,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
1a,
1b,
1c,
1d,
1e,
1f;
实验过程
在IP Catalog搜索ROM,选择Block Memory Generator,设置为Single Prot ROM,对其进行配置8位宽32深度,勾选一直使能,设置初始化的文件。
ILA调试也是类似的操作,抓取5位的地址线和8位的数据线。
rom_test.v
`timescale 1ns/1ps
module rom_test(
input sys_clk_p,
input sys_clk_n,
input rst_n
);
wire [7:0] rom_data;
reg [4:0] rom_addr;
wire sys_clk;
IBUFDS IBUFDS_inst(
.O(sys_clk),
.I(sys_clk_p),
.IB(sys_clk_n)
);
always @ (posedge sys_clk or negedge rst_n)
begin
if(!rst_n)
rom_addr <= 10'd0;
else
rom_addr <= rom_addr + 1'b1;
end
rom_ip rom_ip_inst(
.clka(sys_clk),
.addra(rom_addr),
.douta( rom_data)
);
ila_0 ila_m0(
.clk(sys_clk),
.probe0(rom_addr),
.probe1(rom_data)
);
endmodule
在线仿真
激励文件编写,板子的时钟是200MHz,周期为5ns,每隔2.5ns翻转一次。
`timescale 1ns/1ps
module rom_unit_test;
reg sys_clk_p;
reg rst_n;
wire sys_clk_n;
rom_test uut(
.sys_clk_p(sys_clk_p),
.sys_clk_n(sys_clk_n),
.rst_n(rst_n)
);
initial
begin
sys_clk_p = 0;
rst_n = 0;
#1000
rst_n = 1;
end
always #2.5 sys_clk_p = ~ sys_clk_p;
assign sys_clk_n = ~sys_clk_p;
endmodule
实际测试
总结
本实验生成一个RAM,使用文件对其进行初始化,实现类似ROM的效果。