前言:在前文简单介绍了MIG ip核的调用(包括某些参数的设置)以及该ip核的架构。那么接下来可以开始使用ip核了吗?NO!!!
注意:在调完ip之后,并不可以立即使用该 IP 核完成 DDR3 SDRAM 的读和写的,而是要在该IP核初始化成功之后,才可以进行读和写的。可以通过 Modelsim 仿真软件观察到该 IP 核的初始化成功
注意:未完成校准之前,用户不要使用任何读写命令,防止自动校准过程出错。
这里先对我们前面MIG IP核生成的veo文件进行查看(看看这个ip核都包含哪些信号)
Modelsim仿真需要两个文件:顶层文件(top)和测试文件(testbench),下面开始生成这两个文件
1.顶层文件(top_ddr3_hdmi)
这里手动 + add source 了一个top_ddr3_hdmi的顶层文件。
需要例化的模块有两个:
1.MIG IP核(mig_7series_0)
2.clocking wrizard(ddr3_clk_gen)**
顶层的输入输出信号如下图所示:
部分解释:
- 时钟倍频模块(ddr3_clk_gen):fpga提供的clk为50Mhz,前面MIG ip核调用的时候我们的sys clk设置为了200Mhz,因此需要调用clocking wrizard倍频产生200Mhz,提供给MIG IP模块。
- 目前我们是在进行初始化过程,不能进行读写操作,所以此时MIG IP模块用户接口信号全给0
- 我们需要通过 Modelsim 仿真软件观察到该 IP 核的初始化成功,关键信号就是init_calib_complete.
- MIG IP核的ddr_parity信号不需要被例化进去(原因目前还不知道)
2.测试文件(tb_top_ddr3_hdmi)
1.在sim中+add source一个tb_top_ddr3_hdmi文件。
例化我们的顶层文件和ddr3控制器
顶层文件直接例化即可,这里着重介绍一下ddr3 控制器的例化方式:
ddr3 控制器例化方式:
1.将ddr3_model.sv文件添加到sumulation source中
具体位置:
将.sv 和 .vh文件复制到自己vivado工程中的sim文件夹当中:
2.例化到testbench文件当中,有以下两种方式:
1.打开ddr3_model.sv文件,右键快速生成例化模板,例化到testbech文件中,然后进行修改
2.找到官方提供的例化模板,进行修改
具体位置:
根据自己的实际情况进行修改即可:
testbench:文章来源:https://www.toymoban.com/news/detail-764169.html
`timescale 1ns/1ps
module tb_top_ddr3_hdmi (); /* this is automatically generated */
reg srst_n;
reg clk;
// clock
initial begin
clk = 0;
forever #(10) clk = ~clk;
end
// reset
initial begin
srst_n <= 0;
#200
repeat (5) @(posedge clk);
srst_n <= 1;
end
// (*NOTE*) replace reset, clock, others
wire [15:0] ddr3_dq;
wire [1:0] ddr3_dqs_n;
wire [1:0] ddr3_dqs_p;
wire [13:0] ddr3_addr;
wire [2:0] ddr3_ba;
wire ddr3_ras_n;
wire ddr3_cas_n;
wire ddr3_we_n;
wire ddr3_reset_n;
wire [0:0] ddr3_ck_p;
wire [0:0] ddr3_ck_n;
wire [0:0] ddr3_cke;
wire [0:0] ddr3_cs_n;
wire [1:0] ddr3_dm;
wire [0:0] ddr3_odt;
top_ddr3_hdmi inst_top_ddr3_hdmi
(
.ddr3_dq (ddr3_dq),
.ddr3_dqs_n (ddr3_dqs_n),
.ddr3_dqs_p (ddr3_dqs_p),
.ddr3_addr (ddr3_addr),
.ddr3_ba (ddr3_ba),
.ddr3_ras_n (ddr3_ras_n),
.ddr3_cas_n (ddr3_cas_n),
.ddr3_we_n (ddr3_we_n),
.ddr3_reset_n (ddr3_reset_n),
.ddr3_ck_p (ddr3_ck_p),
.ddr3_ck_n (ddr3_ck_n),
.ddr3_cke (ddr3_cke),
.ddr3_cs_n (ddr3_cs_n),
.ddr3_dm (ddr3_dm),
.ddr3_odt (ddr3_odt),
.sclk_in (clk),
.srst_n (srst_n)
);
ddr3_model u_comp_ddr3
(
.rst_n (ddr3_reset_n),
.ck (ddr3_ck_p),
.ck_n (ddr3_ck_n),
.cke (ddr3_cke),
.cs_n (ddr3_cs_n),
.ras_n (ddr3_ras_n),
.cas_n (ddr3_cas_n),
.we_n (ddr3_we_n),
.dm_tdqs ({ddr3_dm[1],ddr3_dm[0]}),
.ba (ddr3_ba),
.addr (ddr3_addr),
.dq (ddr3_dq[15:0]),
.dqs ({ddr3_dqs_p[1],ddr3_dqs_p[0]}),
.dqs_n ({ddr3_dqs_n[1],ddr3_dqs_n[0]}),
.tdqs_n (),
.odt (ddr3_odt)
);
endmodule
3.开始Modelsim仿真(提前完成vivado 和modelsim的联合)
可以看到在100多us的时候init_calib_complete 信号拉高了,表示已经完成了DDR3 SDRAM IP的初始化。文章来源地址https://www.toymoban.com/news/detail-764169.html
到了这里,关于基于 A7 的 DDR3 SDRAM IP 核使用(二)初始化篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!