FPGA片内ROM测试实验(一)https://developer.aliyun.com/article/1472299
三、程序编写
1、新建测试程序
新建 rom_test.v 源文件并将下面的程序块拷贝过去
rom_test.v
`timescale 1ns / 1ps module rom_test( input sys_clk, //50MHz时钟 input rst_n //复位,低电平有效 ); wire [7:0] rom_data; //ROM读出数据 reg [4:0] rom_addr; //ROM输入地址 //产生ROM地址读取数据 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 rom_ip rom_ip_inst ( .clka (sys_clk), //inoput clka .addra (rom_addr), //input [4:0] addra .douta (rom_data) //output [7:0] douta ); //实例化逻辑分析仪 ila_0 ila_m0 ( .clk (sys_clk), .probe0 (rom_addr), .probe1 (rom_data) ); endmodule
2、新建仿真文件
新建 vtf_rom_tb.v 仿真文件并将下面的程序块拷贝过去
vtf_rom_tb.v
`timescale 1ns / 1ps module vtf_rom_tb; // Inputs reg sys_clk; reg rst_n; // Instantiate the Unit Under Test (UUT) rom_test uut ( .sys_clk (sys_clk), .rst_n (rst_n) ); initial begin // Initialize Inputs sys_clk = 0; rst_n = 0; // Wait 100 ns for global reset to finish #100; rst_n = 1; end always #10 sys_clk = ~ sys_clk; //20ns一个周期,产生50MHz时钟源 endmodule
四、进行仿真
1、点击 Run Simulation -> Run Behavioral Simulation,进行仿真
2、将 ROM 里面地址和数据信号拖拽进观察窗口
3、点击 Run for 200us,可以看到如下图仿真波形
可以看到地址 0 对应数据 0x11,地址 1 对应于数据 0x22 …,与我们之前的 “rom_init.coe” 的 ROM 初始化文件一致
五、下载到 FPGA
1、引脚约束及时序约束
rst_n -> T11
clk -> U18
新建引脚约束文件 rom.xdc,将下面语句拷贝过去并保存
set_property PACKAGE_PIN T11 [get_ports rst_n] set_property IOSTANDARD LVCMOS33 [get_ports rst_n] set_property PACKAGE_PIN U18 [get_ports sys_clk] set_property IOSTANDARD LVCMOS33 [get_ports sys_clk] create_clock -period 20.000 -name sys_clk -waveform {0.000 10.000} [get_ports sys_clk]
2、生成比特文件
点击 “Generate Bitstream”,直接生成 bit 文件
3、下载程序
连接上 JTAG 以及电源线,将板子上电,下载程序
4、逻辑分析仪分析波形
以 10 进制方式查看读取的内存及数据,设置触发条件为 “rom 地址为 0”,可以看到地址 0 的数据为 0x11,rom 地址 31 时的数据为 0xb8,可见满足了预期结果。