野火电子论坛
标题:
基于MIG _IP核的DDR3读写模型自行搭建仿真平台
[打印本页]
作者:
liguanghui
时间:
2025-3-18 12:31
标题:
基于MIG _IP核的DDR3读写模型自行搭建仿真平台
本帖最后由 liguanghui 于 2025-3-22 18:32 编辑
基于MIG _IP核的DDR3读写模型功能仿真
首先在ViVado中调用MIG_IP核可以参考
:
DDR3 控制器 MIG IP 详解完整版 (native&Vivado&Verilog)_mig ip核-CSDN博客
在调用完成后,需要点击open IP example design...
3、在该文件夹下将ddr3_model.v和ddr3_model_parameter.vh,拷贝到DDR3的sim仿真文件夹下,并添加到ViVado中
4、编写调试代码,注意,由于本工程使用了位宽深度为32的DDR,而Xilinx官方自带的模型只有16位,因此在仿真文件中需要例化2个DDR3_model ,仿真代码可参考第三步骤下同文件夹内的sim_tb_top.v文件中 “// Memory Mode
[
参考链接:vivado/MIGip核仿真过程中init_calib_complete信号无法拉高问题_migip核的init-CSDN博客
注意:在调试的时候,面临了DDR3模型的ddr3_reset_n一直未低,经分析对比发现,是MMCM时钟分频模块产生的时钟必须在MIG ip核的clk_ref_i和sys_ref_i的范围内,本例选择了200MHZ.
作者:
liguanghui
时间:
2025-3-18 12:32
仿真代码:
`timescale 1ps/100fs
//`define clock_period 20
module tp_top_ddr3_rw;
parameter DQ_WIDTH = 32;
parameter MEMORY_WIDTH = 16;
localparam NUM_COMP = DQ_WIDTH/MEMORY_WIDTH;
parameter clk_period = 10000;
reg sys_clk ; //系统时钟,50MHz
reg sys_rst_n ; //复位,低有效
// DDR3 IO接口 ;
wire ddr3_reset_n ;
wire [0:0] ddr3_ck_p_sdram ;
wire [0:0] ddr3_ck_n_sdram ;
wire [0:0] ddr3_cke_sdram ;
wire [0:0] ddr3_cs_n_sdram ;
wire ddr3_ras_n_sdram ;
wire ddr3_cas_n_sdram ;
wire ddr3_we_n_sdram ;
wire [3:0] ddr3_dm_sdram ;
wire [2:0] ddr3_ba_sdram ;
wire [13:0]ddr3_addr_sdram ;
wire [31:0]ddr3_dq_sdram ;
wire [3:0] ddr3_dqs_p_sdram ;
wire [3:0] ddr3_dqs_n_sdram ;
wire ddr3_odt_sdram;
//用户
wire [1:0] led ; //led灯
//复位信号
initial begin
sys_rst_n = 1'b0;
#200000
sys_rst_n = 1'b1;
end
//时钟信号
initial sys_clk=1'b0;
always sys_clk =#(clk_period) ~sys_clk;
top_ddr3_rw u_top_ddr3_rw(
.sys_clk (sys_clk) , //系统时钟,50MHz
.sys_rst_n (sys_rst_n) , //复位,低有效
.ddr3_dq (ddr3_dq_sdram) , //ddr3 数据
.ddr3_dqs_n (ddr3_dqs_n_sdram) , //ddr3 dqs负
.ddr3_dqs_p (ddr3_dqs_p_sdram) , //ddr3 dqs正
.ddr3_addr (ddr3_addr_sdram) , //ddr3 地址
.ddr3_ba (ddr3_ba_sdram) , //ddr3 banck 选择
.ddr3_ras_n (ddr3_ras_n_sdram) , //ddr3 行选择
.ddr3_cas_n (ddr3_cas_n_sdram) , //ddr3 列选择
.ddr3_we_n (ddr3_we_n_sdram) , //ddr3 读写选择
.ddr3_reset_n (ddr3_reset_n) , //ddr3 复位
.ddr3_ck_p (ddr3_ck_p_sdram) , //ddr3 时钟正
.ddr3_ck_n (ddr3_ck_n_sdram) , //ddr3 时钟负
.ddr3_cke (ddr3_cke_sdram) , //ddr3 时钟使能
.ddr3_cs_n (ddr3_cs_n_sdram) , //ddr3 片选
.ddr3_dm (ddr3_dm_sdram) , //ddr3_dm
.ddr3_odt (ddr3_odt_sdram) , //ddr3_odt
.led (led) //led灯
);
genvar i;
generate
for (i = 0; i < NUM_COMP; i = i + 1) begin: gen_mem
ddr3_model u_comp_ddr3
(
.rst_n (ddr3_reset_n ),
.ck (ddr3_ck_p_sdram ),
.ck_n (ddr3_ck_n_sdram ),
.cke (ddr3_cke_sdram ),
.cs_n (ddr3_cs_n_sdram ),
.ras_n (ddr3_ras_n_sdram),
.cas_n (ddr3_cas_n_sdram),
.we_n (ddr3_we_n_sdram ),
.dm_tdqs (ddr3_dm_sdram[(2*(i+1)-1)
2*i)]),
.ba (ddr3_ba_sdram ),
.addr (ddr3_addr_sdram ),
.dq (ddr3_dq_sdram[16*(i+1)-1:16*(i)]),
.dqs (ddr3_dqs_p_sdram[(2*(i+1)-1)
2*i)]),
.dqs_n (ddr3_dqs_n_sdram[(2*(i+1)-1)
2*i)]),
.tdqs_n (),
.odt (ddr3_odt_sdram)
);
end
endgenerate
endmodule
欢迎光临 野火电子论坛 (https://www.firebbs.cn/)
Powered by Discuz! X3.4