当前位置:   article > 正文

利用Xilinx DDR3 IP 官方仿真文件做小实验_vivado ddr3仿真

vivado ddr3仿真

一、实验目的

在 Xilinx 的vivado软件配置好 DDR3的控制器后,官方会提供一个相应的设计样板(这个样板的目的是,比较DDR3的写入和输出数据是否一致,一致则输出标识。)。这个样板包括设计代码和验证代码,可以通过添加这个样板到自己的设计模块,实现自己需要的功能。

二、实验框架

在这里插入图片描述
example_top 是官方提供的设计模块,这个模块的目的是比较写入DDR3的数据和读出DDR3的数据,如果不一样,则输出信号 tg_compare_error 为高。输出信号 init_calib_complete 为DDR3初始化完成的标志,它为高,则代表DDR3初始化完成。这两个信号通过开发板的 led 来显示。

图中还有一个 PLL 模块,这是为了产生 DDR3控制器所需要的 时钟和复位信号。
FPGA的外部是 50M的时钟,经过 PLL后,输出 200M的时钟给 DDR3控制器模块使用。
PLL的输出信号 locked 信号用作 DDR3控制器的复位信号。
于是 DDR3控制器先有稳定的时钟信号,然后再把复位取消,这样便可以开始工作。

三、流程概述

1、配置DDR3控制器、2、打开官方DDR3设计模板,3、生成PLL时钟管理单元

4、添加自己的设计模块ddr_test,并且把 ddr_test 设置为顶层模块(“set as top”)

5、综合后,进行引脚配置

6、下载到板子,发现 led[1] 是一直暗的,表示 DDR3控制器的写入和读出的数据一致。
led[0]是亮的,表示DDR3的初始化完成。

四、顶层代码

创建一个我自己设计的顶层模块,ddr_test,它里面例化了两个模块,一个是官方的设计样板(example_top),另外一个是 PLL时钟管理单元。

module ddr_test(

   inout [15:0]   ddr3_dq,
   inout [1:0]    ddr3_dqs_n,
   inout [1:0]    ddr3_dqs_p,
   output [13:0]  ddr3_addr,
   output [2:0]   ddr3_ba,
   output         ddr3_ras_n,
   output         ddr3_cas_n,
   output         ddr3_we_n,
   output         ddr3_reset_n,
   output [0:0]   ddr3_ck_p,
   output [0:0]   ddr3_ck_n,
   output [0:0]   ddr3_cke,
   output [0:0]   ddr3_cs_n,
   output [1:0]   ddr3_dm,
   output [0:0]   ddr3_odt,

   input          clk50m,
   input          reset_n,
   output [1:0]   led
    );
//ddr_test 的端口声明剔除了 example_top 模块的 两个输入端口(sys_clk_i、sys_rst) 因为这两个输入端口由 PLL模块的输出提供,所以它们不是 ddr_test 的端口。剔除了 example_top 的两个输出端口(tg_compare_error,init_calib_complete)因为这两个端口用 led 这个端口代替了。其他的example_top 端口都保留。
此外,还加了两个PLL的输入端口 clk50m,reset_n 和输出端口 led

wire pll_locked;
wire sys_clk_i;
// 把PLL的输出时钟sys_clk_i(200M)用作 example_top模块的输入时钟sys_clk_i
// 把PLL的输出时钟pll_locked信号用作 example_top模块的输入复位sys_rst
      
clk_wiz_0 instance_name
   (
    .clk_out1(sys_clk_i),    
    .resetn(reset_n), 
    .locked(pll_locked),      
    .clk_in1(clk50m)
        );       
//将 tg_compare_error  init_calib_complete 这两个信号用来显示led

assign led = {tg_compare_error,init_calib_complete};

//tg_compare_error为1,表示DDR3的写入和读出的数据不一样。
//init_calib_complete 为1,表示DDR3的初始化完成。


example_top example_top (

   .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),
   .sys_clk_i (sys_clk_i),
   .tg_compare_error (tg_compare_error),
   .init_calib_complete(init_calib_complete),
   .sys_rst(pll_locked)
   );
   
   
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/976519
推荐阅读
相关标签
  

闽ICP备14008679号