当前位置:   article > 正文

基于FPGA+MIG+AXI4实现DDR3 SDRAM读写操作仿真(附代码+各模块仿真时序图)_四端口ddr3fpga

四端口ddr3fpga

前言

一、仿真工程结构

二、Test Bench文件代码

2.图像数据源模块(img_data_gen.v)仿真

2.1全局视角仿真图

2.2局部视角仿真图

3.图像写请求模块(img_write_req_gen.v)仿真

4.图像帧写入模块(frame_write.v)仿真

4.1全局视角仿真图

 4.2局部视角仿真图

4.2.1write_buf

 4.2.2frame_fifo_write

 5.图像通道写仲裁模块(mem_write_arbit.v)仿真(可选,非必须)

 6.AXI主机端读写(aq_axi_master)模块仿真

6.1写部分状态机

6.2读部分状态机

6.3全局视角仿真图

6.4局部视角仿真图

6.4.1写地址通道

 6.4.2写数据通道

 6.4.3写响应通道

6.4.4读地址通道

 6.4.5读数据通道

7.MIG IP模块仿真

 7.1与ddr3相关的信号

 7.2本地接口维护信号

 7.3与读写事务相关信号

 7.4初始化完成、时钟等信号

8.图像帧读出模块(frame_read.v)仿真

8.1全局视角仿真图

 8.2局部视角仿真图

8.2.1read_buf

 8.2.2frame_fifo_read

  9.图像通道读仲裁模块(mem_read_arbit.v)仿真(可选,非必须)

  10.其他部分


前言

        上一篇文章谈到如何利用Xilinx 7系列FPGA实现DDR3 SDRAM的读写操作(详情请参见基于FPGA+MIG+AXI4实现DDR3 SDRAM读写操作(附代码)_春风细雨无声的博客-CSDN博客),大家积极留言或发消息联系希望能用仿真的形式和大家进一步沟通。本篇文章利用第三方软件Modelsim(没有该软件的小伙伴可以联系我获取)对工程中涉及到的各模块进行仿真,给出仿真时序图,帮助大家进一步理解FPGA实现DDR3 SDRAM读写的整个过程。


一、仿真工程结构

        首先建立仿真工程,需要包含Test Bench文件、源文件顶层模块、DDR3模型和连接线延迟等模块,工程结构如图所示。

二、Test Bench文件代码

        Test Bench文件是整个工程仿真的第一步,如何用代码来描述Test Bench文件可能是大家比较关心的问题,此处直接附上源码,如下。

  1. `timescale 1ps/100fs
  2. module tb_top_design;
  3. //***************************************************************************
  4. // Traffic Gen related parameters
  5. //***************************************************************************
  6. parameter SIMULATION = "TRUE";
  7. parameter BEGIN_ADDRESS = 32'h00000000;
  8. parameter END_ADDRESS = 32'h00000fff;
  9. parameter PRBS_EADDR_MASK_POS = 32'hff000000;
  10. //***************************************************************************
  11. // The following parameters refer to width of various ports
  12. //***************************************************************************
  13. parameter COL_WIDTH = 10;
  14. // # of memory Column Address bits.
  15. parameter CS_WIDTH = 1;
  16. // # of unique CS outputs to memory.
  17. parameter DM_WIDTH = 2;
  18. // # of DM (data mask)
  19. parameter DQ_WIDTH = 16;
  20. // # of DQ (data)
  21. parameter DQS_WIDTH = 2;
  22. parameter DQS_CNT_WIDTH = 1;
  23. // = ceil(log2(DQS_WIDTH))
  24. parameter DRAM_WIDTH = 8;
  25. // # of DQ per DQS
  26. parameter ECC = "OFF";
  27. parameter RANKS = 1;
  28. // # of Ranks.
  29. parameter ODT_WIDTH = 1;
  30. // # of ODT outputs to memory.
  31. parameter ROW_WIDTH = 15;
  32. // # of memory Row Address bits.
  33. parameter ADDR_WIDTH = 29;
  34. // # = RANK_WIDTH + BANK_WIDTH
  35. // + ROW_WIDTH + COL_WIDTH;
  36. // Chip Select is always tied to low for
  37. // single rank devices
  38. //***************************************************************************
  39. // The following parameters are mode register settings
  40. //***************************************************************************
  41. parameter BURST_MODE = "8";
  42. // DDR3 SDRAM:
  43. // Burst Length (Mode Register 0).
  44. // # = "8", "4", "OTF".
  45. // DDR2 SDRAM:
  46. // Burst Length (Mode Register).
  47. // # = "8", "4".
  48. parameter CA_MIRROR = "OFF";
  49. // C/A mirror opt for DDR3 dual rank
  50. //***************************************************************************
  51. // The following parameters are multiplier and divisor factors for PLLE2.
  52. // Based on the selected design frequency these parameters vary.
  53. //***************************************************************************
  54. parameter CLKIN_PERIOD = 5000;
  55. // Input Clock Period
  56. //***************************************************************************
  57. // Simulation parameters
  58. //***************************************************************************
  59. parameter SIM_BYPASS_INIT_CAL = "FAST";
  60. // # = "SIM_INIT_CAL_FULL" - Complete
  61. // memory init &
  62. // calibration sequence
  63. // # = "SKIP" - Not supported
  64. // # = "FAST" - Complete memory init & use
  65. // abbreviated calib sequence
  66. //***************************************************************************
  67. // IODELAY and PHY related parameters
  68. //***************************************************************************
  69. parameter TCQ = 100;
  70. //***************************************************************************
  71. // IODELAY and PHY related parameters
  72. //***************************************************************************
  73. parameter RST_ACT_LOW = 1;
  74. // =1 for active low reset,
  75. // =0 for active high.
  76. //***************************************************************************
  77. // Referece clock frequency parameters
  78. //***************************************************************************
  79. parameter REFCLK_FREQ = 200.0;
  80. // IODELAYCTRL reference clock frequency
  81. //***************************************************************************
  82. // System clock frequency parameters
  83. //***************************************************************************
  84. parameter tCK = 2500;
  85. // memory tCK paramter.
  86. // # = Clock Period in pS.
  87. parameter nCK_PER_CLK = 4;
  88. // # of memory CKs per fabric CLK
  89. //***************************************************************************
  90. // AXI4 Shim parameters
  91. //***************************************************************************
  92. parameter C_S_AXI_ID_WIDTH = 4;
  93. // Width of all master and slave ID signals.
  94. // # = >= 1.
  95. parameter C_S_AXI_ADDR_WIDTH = 29;
  96. // Width of S_AXI_AWADDR, S_AXI_ARADDR, M_AXI_AWADDR and
  97. // M_AXI_ARADDR for all SI/MI slots.
  98. // # = 32.
  99. parameter C_S_AXI_DATA_WIDTH = 64;
  100. // Width of WDATA and RDATA on SI slot.
  101. // Must be <= APP_DATA_WIDTH.
  102. // # = 32, 64, 128, 256.
  103. parameter C_S_AXI_SUPPORTS_NARROW_BURST = 0;
  104. // Indicates whether to instatiate upsizer
  105. // Range: 0, 1
  106. //***************************************************************************
  107. // Debug and Internal parameters
  108. //***************************************************************************
  109. parameter DEBUG_PORT = "OFF";
  110. // # = "ON" Enable debug signals/controls.
  111. // = "OFF" Disable debug signals/controls.
  112. //***************************************************************************
  113. // Debug and Internal parameters
  114. //***************************************************************************
  115. parameter DRAM_TYPE = "DDR3";
  116. //**************************************************************************//
  117. // Local parameters Declarations
  118. //**************************************************************************//
  119. localparam real TPROP_DQS = 0.00;
  120. // Delay for DQS signal during Write Operation
  121. localparam real TPROP_DQS_RD = 0.00;
  122. // Delay for DQS signal during Read Operation
  123. localparam real TPROP_PCB_CTRL = 0.00;
  124. // Delay for Address and Ctrl signals
  125. localparam real TPROP_PCB_DATA = 0.00;
  126. // Delay for data signal during Write operation
  127. localparam real TPROP_PCB_DATA_RD = 0.00;
  128. // Delay for data signal during Read operation
  129. localparam MEMORY_WIDTH = 16;
  130. localparam NUM_COMP = DQ_WIDTH/MEMORY_WIDTH;
  131. localparam ECC_TEST = "OFF" ;
  132. localparam ERR_INSERT = (ECC_TEST == "ON") ? "OFF" : ECC ;
  133. localparam real REFCLK_PERIOD = (1000000.0/(2*REFCLK_FREQ));
  134. localparam RESET_PERIOD = 200000; //in pSec
  135. localparam real SYSCLK_PERIOD = tCK;
  136. //**************************************************************************//
  137. // Wire Declarations
  138. //**************************************************************************//
  139. reg sys_rst_n;
  140. wire sys_rst;
  141. reg sys_clk_i;
  142. reg clk_ref_i;
  143. wire ddr3_reset_n;
  144. wire [DQ_WIDTH-1:0] ddr3_dq_fpga;
  145. wire [DQS_WIDTH-1:0] ddr3_dqs_p_fpga;
  146. wire [DQS_WIDTH-1:0] ddr3_dqs_n_fpga;
  147. wire [ROW_WIDTH-1:0] ddr3_addr_fpga;
  148. wire [3-1:0] ddr3_ba_fpga;
  149. wire ddr3_ras_n_fpga;
  150. wire ddr3_cas_n_fpga;
  151. wire ddr3_we_n_fpga;
  152. wire [1-1:0] ddr3_cke_fpga;
  153. wire [1-1:0] ddr3_ck_p_fpga;
  154. wire [1-1:0] ddr3_ck_n_fpga;
  155. wire init_calib_complete;
  156. wire tg_compare_error;
  157. wire [(CS_WIDTH*1)-1:0] ddr3_cs_n_fpga;
  158. wire [DM_WIDTH-1:0] ddr3_dm_fpga;
  159. wire [ODT_WIDTH-1:0] ddr3_odt_fpga;
  160. reg [(CS_WIDTH*1)-1:0] ddr3_cs_n_sdram_tmp;
  161. reg [DM_WIDTH-1:0] ddr3_dm_sdram_tmp;
  162. reg [ODT_WIDTH-1:0] ddr3_odt_sdram_tmp;
  163. wire [DQ_WIDTH-1:0] ddr3_dq_sdram;
  164. reg [ROW_WIDTH-1:0] ddr3_addr_sdram [0:1];
  165. reg [3-1:0] ddr3_ba_sdram [0:1];
  166. reg ddr3_ras_n_sdram;
  167. reg ddr3_cas_n_sdram;
  168. reg ddr3_we_n_sdram;
  169. wire
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/819979
推荐阅读
相关标签
  

闽ICP备14008679号