野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 270|回复: 1

[xilinx] 基于MIG _IP核的DDR3读写模型自行搭建仿真平台

[复制链接]
发表于 2025-3-18 12:31:37 | 显示全部楼层 |阅读模式
本帖最后由 liguanghui 于 2025-3-22 18:32 编辑

基于MIG _IP核的DDR3读写模型功能仿真

  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.


文件1.png
文件2.png
回复

使用道具 举报

 楼主| 发表于 2025-3-18 12:32:06 | 显示全部楼层
仿真代码:
`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
回复 支持 反对

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-4-1 18:05 , Processed in 0.157007 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表