vivado mig IP的仿真

FPGA开源工作室将通过五篇文章来给大家讲解xilinx FPGA 使用mig IP对DDR3的读写控制,旨在让大家更快的学习和应用DDR3。

本实验和工程基于Digilent的Arty Artix-35T FPGA开发板完成。

软件使用Vivado 2018.1。

参考工程:ddr3_sim。

第一篇:DDR3和mig的介绍

第二篇:mig IP的创建

第三篇:mig IP用户读写时序

  第四篇:mig IP的仿真

第五篇:mig读写时序下板实现

1快速仿真

1>①ddr3_ip->②Open IP Example Design

2>选择ddr3仿真生成的路径。

 

3>DDR3自带仿真工程生成完毕。

4>①Run Simulation ->②Run Behavioral Simulation。

5>等待10几分钟左右仿真完成。

 

6>仿真完成查看波形。

对于xiinx官方自带的DDR3仿真的例子大家可以参看UG586

(https://china.xilinx.com/support/documentation/ip_documentation/mig_7series/v4_2/ug586_7Series_MIS.pdf)。

2仿真

目标:对DDR3的8个bank从0 bank开始对每个bank写入0-99,然后依次读出,循环读写。

修改example_top模块如下所示:

  1. `timescale 1ps/1ps  
  2. `define CMD_WR 3'b000  
  3. `define CMD_RD 3'b001  
  4. module example_top   
  5.   (  
  6.   
  7.    // Inouts  
  8.    inout [15:0]                         ddr3_dq,  
  9.    inout [1:0]                        ddr3_dqs_n,  
  10.    inout [1:0]                        ddr3_dqs_p,  
  11.   
  12.    // Outputs  
  13.    output [13:0]                       ddr3_addr,  
  14.    output [2:0]                      ddr3_ba,  
  15.    output                                       ddr3_ras_n,  
  16.    output                                       ddr3_cas_n,  
  17.    output                                       ddr3_we_n,  
  18.    output                                       ddr3_reset_n,  
  19.    output [0:0]                        ddr3_ck_p,  
  20.    output [0:0]                        ddr3_ck_n,  
  21.    output [0:0]                       ddr3_cke,  
  22.      
  23.    output [0:0]           ddr3_cs_n,  
  24.      
  25.    output [1:0]                        ddr3_dm,  
  26.      
  27.    output [0:0]                       ddr3_odt,  
  28.      
  29.   
  30.    // Inputs  
  31.      
  32.    // Single-ended system clock  
  33.    input                                        sys_clk_i,  
  34.      
  35.    // Single-ended iodelayctrl clk (reference clock)  
  36.    input                                        clk_ref_i,  
  37.   
  38.    output                                       tg_compare_error,  
  39.    output                                       init_calib_complete,  
  40.      
  41.         
  42.   
  43.    // System reset - Default polarity of sys_rst pin is Active Low.  
  44.    // System reset polarity will change based on the option   
  45.    // selected in GUI.  
  46.    input                                        sys_rst  
  47.    );  
  48.   
  49. //***************************************************************************  
  50. parameter IDLE  = 5'd0,  
  51.            WR1   = 5'd1,  
  52.            WR2   = 5'd2,  
  53.            WR3   = 5'd3,  
  54.            WR4   = 5'd4,  
  55.            WR5   = 5'd5,  
  56.            WR6   = 5'd6,  
  57.            WR7   = 5'd7,  
  58.            WR8   = 5'd8,  
  59.            RD1   = 5'd9,  
  60.            RD2   = 5'd10,  
  61.            RD3   = 5'd11,  
  62.            RD4   = 5'd12,  
  63.            RD5   = 5'd13,  
  64.            RD6   = 5'd14,  
  65.            RD7   = 5'd15,  
  66.            RD8   = 5'd16;    
  67.       
  68.       // user interface signals  
  69.       wire [27:0]        app_addr;//i  
  70.       reg [2:0]         app_cmd;//i  
  71.       wire               app_en;//i  
  72.       reg [127:0]       app_wdf_data;//i  
  73.       wire               app_wdf_end;//i  
  74.       wire [15:0]        app_wdf_mask;//i  
  75.       wire              app_wdf_wren;//i  
  76.       wire [127:0]       app_rd_data;  
  77.       wire               app_rd_data_end;  
  78.       wire               app_rd_data_valid;  
  79.       wire               app_rdy;  
  80.       wire               app_wdf_rdy;  
  81.       wire               app_sr_req;//i  
  82.       wire               app_ref_req;//i  
  83.       wire               app_zq_req;//i  
  84.       wire               app_sr_active;  
  85.       wire               app_ref_ack;  
  86.       wire               app_zq_ack;  
  87.       wire               ui_clk;  
  88.       wire               ui_clk_sync_rst;  
  89.       //wire               init_calib_complete;  
  90.       wire               sys_rst_n;//i  
  91.         
  92.       reg [4:0] cstate,nstate;  
  93.       //wire [27:0]        wr_addr;//i  bank row column [2:0] [13:0] [9:0]  
  94.       //wire [27:0]        rd_addr;//i  bank row column [2:0] [13:0] [9:0]  
  95.       wire wr1_done;  
  96.       wire wr2_done;  
  97.       wire wr3_done;  
  98.       wire wr4_done;  
  99.       wire wr5_done;  
  100.       wire wr6_done;  
  101.       wire wr7_done;  
  102.       wire wr8_done;  
  103.         
  104.       wire rd1_done;  
  105.       wire rd2_done;  
  106.       wire rd3_done;  
  107.       wire rd4_done;  
  108.       wire rd5_done;  
  109.       wire rd6_done;  
  110.       wire rd7_done;  
  111.       wire rd8_done;       
  112.         
  113.       reg [2:0] bank; 
  114.  
  115.       reg [23:0] addr;      
  116. assign app_addr ={1'b0,bank,addr};    
  117. assign  app_sr_req = 1'b0;  
  118. assign app_ref_req = 1'b0;  
  119. assign app_zq_req  = 1'b0;  
  120. //assign app_addr = (app_cmd ==`CMD_WR && app_en == 1'b1)?wr_addr:rd_addr;  
  121. assign app_wdf_mask = 16'h0000;  
  122. assign app_wdf_end = app_wdf_wren;  
  123. assign wr1_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b000) ? 1'b1:1'b0;  
  124. assign wr2_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b001) ? 1'b1:1'b0;  
  125. assign wr3_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b010) ? 1'b1:1'b0;  
  126. assign wr4_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b011) ? 1'b1:1'b0;  
  127. assign wr5_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b100) ? 1'b1:1'b0;  
  128. assign wr6_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b101) ? 1'b1:1'b0;  
  129. assign wr7_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b110) ? 1'b1:1'b0;  
  130. assign wr8_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b111) ? 1'b1:1'b0;  
  131.   
  132. assign rd1_done = (cstate == RD1 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  133. assign rd2_done = (cstate == RD2 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  134. assign rd3_done = (cstate == RD3 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  135. assign rd4_done = (cstate == RD4 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  136. assign rd5_done = (cstate == RD5 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  137. assign rd6_done = (cstate == RD6 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  138. assign rd7_done = (cstate == RD7 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  139. assign rd8_done = (cstate == RD8 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  140.   
  141. assign done_flag = (cstate == DONE)?1'b1:1'b0;  
  142.   
  143. assign app_en =(((cstate == WR1 ||cstate == WR2 ||cstate == WR3 ||cstate == WR4 ||cstate == WR5 ||cstate == WR6 ||cstate == WR7 ||cstate == WR8)&& app_wdf_rdy == 1'b1&&app_rdy == 1'b1)||((cstate == RD1 ||cstate == RD2 ||cstate == RD3 ||cstate == RD4 ||cstate == RD5 ||cstate == RD6 ||cstate == RD7 ||cstate == RD8)&& app_rdy == 1'b1)&&((!wr1_done)||(!wr2_done)||(!wr3_done)||(!wr4_done)||(!wr5_done)||(!wr6_done)||(!wr7_done)||(!wr8_done)||(!rd1_done)||(!rd2_done)||(!rd3_done)||(!rd4_done)||(!rd5_done)||(!rd6_done)||(!rd7_done)||(!rd8_done)))?1'b1:1'b0;  
  144. assign app_wdf_wren =(((cstate == WR1 ||cstate == WR2 ||cstate == WR3 ||cstate == WR4 ||cstate == WR5 ||cstate == WR6 ||cstate == WR7 ||cstate == WR8) && app_wdf_rdy == 1'b1&&app_rdy == 1'b1)&&((!wr1_done)||(!wr2_done)||(!wr3_done)||(!wr4_done)||(!wr5_done)||(!wr6_done)||(!wr7_done)||(!wr8_done)))?1'b1:1'b0;  
  145. always @(posedge ui_clk or posedge ui_clk_sync_rst) begin  
  146.   if(ui_clk_sync_rst == 1'b1)  
  147.     cstate <= IDLE;  
  148.   else  
  149.     cstate <= nstate;   
  150. end  
  151.   
  152. always @(*) begin  
  153.   nstate = IDLE;  
  154.   case(cstate)  
  155.     IDLE:begin  
  156.       if(init_calib_complete == 1'b1)  
  157.         nstate = WR1;  
  158.       else  
  159.         nstate = IDLE;  
  160.     end  
  161.     WR1:begin  
  162.       if(wr1_done == 1'b1)  
  163.         nstate = WR2;   
  164.       else  
  165.         nstate = WR1;   
  166.     end  
  167.     WR2:begin  
  168.       if(wr2_done == 1'b1)  
  169.         nstate = WR3;   
  170.       else  
  171.         nstate = WR2;   
  172.     end  
  173.     WR3:begin  
  174.       if(wr3_done == 1'b1)  
  175.         nstate = WR4;   
  176.       else  
  177.         nstate = WR3;   
  178.     end  
  179.     WR4:begin  
  180.       if(wr4_done == 1'b1)  
  181.         nstate = WR5;   
  182.       else  
  183.         nstate = WR4;   
  184.     end  
  185.     WR5:begin  
  186.       if(wr5_done == 1'b1)  
  187.         nstate = WR6;   
  188.       else  
  189.         nstate = WR5;   
  190.     end  
  191.     WR6:begin  
  192.       if(wr6_done == 1'b1)  
  193.         nstate = WR7;   
  194.       else  
  195.         nstate = WR6;   
  196.     end  
  197.     WR7:begin  
  198.       if(wr7_done == 1'b1)  
  199.         nstate = WR8;   
  200.       else  
  201.         nstate = WR7;   
  202.     end  
  203.     WR8:begin  
  204.       if(wr8_done == 1'b1)  
  205.         nstate = RD1;   
  206.       else  
  207.         nstate = WR8;   
  208.     end  
  209.     RD1:begin  
  210.       if(rd1_done == 1'b1)  
  211.         nstate = RD2;   
  212.       else  
  213.         nstate = RD1;   
  214.      end  
  215.      RD2:begin  
  216.        if(rd2_done == 1'b1)  
  217.          nstate = RD3;   
  218.        else  
  219.          nstate = RD2;   
  220.      end  
  221.      RD3:begin  
  222.         if(rd3_done == 1'b1)  
  223.           nstate = RD4;   
  224.         else  
  225.           nstate = RD3;   
  226.      end  
  227.      RD4:begin  
  228.         if(rd4_done == 1'b1)  
  229.           nstate = RD5;   
  230.         else  
  231.           nstate = RD4;   
  232.      end  
  233.      RD5:begin  
  234.         if(rd5_done == 1'b1)  
  235.           nstate = RD6;   
  236.         else  
  237.           nstate = RD5;   
  238.      end  
  239.      RD6:begin  
  240.         if(rd6_done == 1'b1)  
  241.           nstate = RD7;   
  242.         else  
  243.           nstate = RD6;   
  244.      end  
  245.      RD7:begin  
  246.         if(rd7_done == 1'b1)  
  247.           nstate = RD8;   
  248.         else  
  249.           nstate = RD7;   
  250.      end  
  251.      RD8:begin  
  252.         if(rd8_done == 1'b1)  
  253.           nstate = WR1;   
  254.         else  
  255.           nstate = RD8;   
  256.      end  
  257.   endcase  
  258. end  
  259.   
  260. always @(posedge ui_clk or posedge ui_clk_sync_rst) begin  
  261.   if(ui_clk_sync_rst == 1'b1) begin  
  262.     app_cmd <= `CMD_WR;  
  263.     app_wdf_data <= 128'b0;  
  264.             
  265.     bank <= 3'b000;  
  266.     addr <=24'b0;  
  267.   end  
  268.   else  
  269.     case(cstate)  
  270.       WR1:begin  
  271.         app_cmd <= `CMD_WR;  
  272.         bank <= 3'b000;  
  273.         if(wr1_done == 1'b1) begin  
  274.           addr <=24'b0;  
  275.           app_wdf_data <= 128'b0;  
  276.         end  
  277.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  278.           addr <= addr +8;  
  279.           app_wdf_data <= app_wdf_data +1;  
  280.         end  
  281.         else begin  
  282.           addr <= addr;  
  283.           app_wdf_data <= app_wdf_data;  
  284.         end  
  285.       end  
  286.       WR2:begin  
  287.         app_cmd <= `CMD_WR;  
  288.         bank <= 3'b001;  
  289.        if(wr2_done == 1'b1) begin  
  290.           addr <=24'b0;  
  291.           app_wdf_data <= 128'b0;  
  292.         end  
  293.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  294.           addr <= addr +8;  
  295.           app_wdf_data <= app_wdf_data +1;  
  296.         end  
  297.         else begin  
  298.           addr <= addr;  
  299.           app_wdf_data <= app_wdf_data;  
  300.         end  
  301.       end  
  302.       WR3:begin  
  303.         app_cmd <= `CMD_WR;  
  304.         bank <= 3'b010;  
  305.         if(wr3_done == 1'b1) begin  
  306.           addr <=24'b0;  
  307.           app_wdf_data <= 128'b0;  
  308.         end  
  309.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  310.           addr <= addr +8;  
  311.           app_wdf_data <= app_wdf_data +1;  
  312.         end  
  313.         else begin  
  314.           addr <= addr;  
  315.           app_wdf_data <= app_wdf_data;  
  316.         end  
  317.       end  
  318.       WR4:begin  
  319.         app_cmd <= `CMD_WR;  
  320.         bank <= 3'b011;  
  321.         if(wr4_done == 1'b1) begin  
  322.           addr <=24'b0;  
  323.           app_wdf_data <= 128'b0;  
  324.         end  
  325.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  326.           addr <= addr +8;  
  327.           app_wdf_data <= app_wdf_data +1;  
  328.         end  
  329.         else begin  
  330.           addr <= addr;  
  331.           app_wdf_data <= app_wdf_data;  
  332.         end  
  333.       end     
  334.       WR5:begin  
  335.         app_cmd <= `CMD_WR;  
  336.         bank <= 3'b100;  
  337.         if(wr5_done == 1'b1) begin  
  338.           addr <=24'b0;  
  339.           app_wdf_data <= 128'b0;  
  340.         end  
  341.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  

 

  1.           addr <= addr +8;  
  2.           app_wdf_data <= app_wdf_data +1;  
  3.         end  
  4.         else begin  
  5.           addr <= addr;  
  6.           app_wdf_data <= app_wdf_data;  
  7.         end  
  8.       end   
  9.       WR6:begin  
  10.         app_cmd <= `CMD_WR;  
  11.         bank <= 3'b101;  
  12.        if(wr6_done == 1'b1) begin  
  13.           addr <=24'b0;  
  14.           app_wdf_data <= 128'b0;  
  15.         end  
  16.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  17.  
  18.           addr <= addr +8;  
  19.           app_wdf_data <= app_wdf_data +1;  
  20.         end  
  21.         else begin  
  22.           addr <= addr;  
  23.           app_wdf_data <= app_wdf_data;  
  24.         end  
  25.       end   
  26.       WR7:begin  
  27.         app_cmd <= `CMD_WR;  
  28.         bank <= 3'b110;  
  29.        if(wr7_done == 1'b1) begin  
  30.           addr <=24'b0;  
  31.           app_wdf_data <= 128'b0;  
  32.         end  
  33.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  34.  
  35.           addr <= addr +8;  
  36.           app_wdf_data <= app_wdf_data +1;  
  37.         end  
  38.         else begin  
  39.           addr <= addr;  
  40.           app_wdf_data <= app_wdf_data;  
  41.         end  
  42.       end    
  43.       WR8:begin  
  44.         app_cmd <= `CMD_WR;  
  45.         bank <= 3'b111;  
  46.         if(wr8_done == 1'b1) begin  
  47.           addr <=24'b0;  
  48.           app_wdf_data <= 128'b0;  
  49.         end  
  50.         else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin   
  51.           addr <= addr +8;  
  52.           app_wdf_data <= app_wdf_data +1;  
  53.         end  
  54.         else begin  
  55.           addr <= addr;  
  56.           app_wdf_data <= app_wdf_data;  
  57.         end  
  58.       end       
  59.       RD1:begin  
  60.         app_cmd <= `CMD_RD;  
  61.         bank <= 3'b000;  
  62.         if(rd1_done == 1'b1) begin  
  63.           addr <= 24'b0;  
  64.         end  
  65.         else if(app_rdy == 1'b1)begin  
  66.            addr <= addr+8;  
  67.         end  
  68.         else begin  
  69.           addr <= addr;  
  70.         end  
  71.       end  
  72.       RD2:begin  
  73.         app_cmd <= `CMD_RD;  
  74.         bank <= 3'b001;  
  75.         if(rd2_done == 1'b1) begin  
  76.           addr <= 24'b0;  
  77.         end  
  78.         else if(app_rdy == 1'b1)begin  
  79.            addr <= addr+8;  
  80.         end  
  81.         else begin  
  82.           addr <= addr;  
  83.         end  
  84.       end  
  85.       RD3:begin  
  86.         app_cmd <= `CMD_RD;  
  87.         bank <= 3'b010;  
  88.         if(rd3_done == 1'b1) begin  
  89.           addr <= 24'b0;  
  90.         end  
  91.         else if(app_rdy == 1'b1)begin  
  92.            addr <= addr+8;  
  93.         end  
  94.         else begin  
  95.           addr <= addr;  
  96.         end  
  97.       end  
  98.       RD4:begin  
  99.         app_cmd <= `CMD_RD;  
  100.         bank <= 3'b011;  
  101.         if(rd4_done == 1'b1) begin  
  102.           addr <= 24'b0;  
  103.         end  
  104.         else if(app_rdy == 1'b1)begin  
  105.            addr <= addr+8;  
  106.         end  
  107.         else begin  
  108.           addr <= addr;  
  109.         end  
  110.       end  
  111.       RD5:begin  
  112.         app_cmd <= `CMD_RD;  
  113.         bank <= 3'b100;  
  114.         if(rd5_done == 1'b1) begin  
  115.           addr <= 24'b0;  
  116.         end  
  117.         else if(app_rdy == 1'b1)begin  
  118.            addr <= addr+8;  
  119.         end  
  120.         else begin  
  121.           addr <= addr;  
  122.         end  
  123.       end  
  124.       RD6:begin  
  125.         app_cmd <= `CMD_RD;  
  126.         bank <= 3'b101;  
  127.         if(rd6_done == 1'b1) begin  
  128.           addr <= 24'b0;  
  129.         end  
  130.         else if(app_rdy == 1'b1)begin  
  131.            addr <= addr+8;  
  132.         end  
  133.         else begin  
  134.           addr <= addr;  
  135.         end  
  136.       end  
  137.       RD7:begin  
  138.         app_cmd <= `CMD_RD;  
  139.         bank <= 3'b110;  
  140.         if(rd7_done == 1'b1) begin  
  141.           addr <= 24'b0;  
  142.         end  
  143.         else if(app_rdy == 1'b1)begin  
  144.            addr <= addr+8;  
  145.         end  
  146.         else begin  
  147.           addr <= addr;  
  148.         end  
  149.       end  
  150.       RD8:begin  
  151.         app_cmd <= `CMD_RD;  
  152.         bank <= 3'b111;  
  153.         if(rd8_done == 1'b1) begin  
  154.           addr <= 24'b0;  
  155.         end  
  156.         else if(app_rdy == 1'b1)begin  
  157.            addr <= addr+8;  
  158.         end  
  159.         else begin  
  160.           addr <= addr;  
  161.         end  
  162.       end  
  163.       DONE:begin  
  164.         bank <= 3'b000;  
  165.         addr <=24'b0;  
  166.         app_cmd <= `CMD_WR;  
  167.         app_wdf_data <= 128'b0;  
  168.       end  
  169.     endcase  
  170. end  
  171.   
  172.   
  173.   
  174. //***************************************************************************  
  175.         
  176. // Start of User Design top instance  
  177. //***************************************************************************  
  178. // The User design is instantiated below. The memory interface ports are  
  179. // connected to the top-level and the application interface ports are  
  180. // connected to the traffic generator module. This provides a reference  
  181. // for connecting the memory controller to system.  
  182. //***************************************************************************  
  183.   
  184.   ddr3_ip u_ddr3_ip  
  185.       (  
  186.          
  187.          
  188. // Memory interface ports  
  189.        .ddr3_addr                      (ddr3_addr),  
  190.        .ddr3_ba                        (ddr3_ba),  
  191.        .ddr3_cas_n                     (ddr3_cas_n),  
  192.        .ddr3_ck_n                      (ddr3_ck_n),  
  193.        .ddr3_ck_p                      (ddr3_ck_p),  
  194.        .ddr3_cke                       (ddr3_cke),  
  195.        .ddr3_ras_n                     (ddr3_ras_n),  
  196.        .ddr3_we_n                      (ddr3_we_n),  
  197.        .ddr3_dq                        (ddr3_dq),  
  198.        .ddr3_dqs_n                     (ddr3_dqs_n),  
  199.        .ddr3_dqs_p                     (ddr3_dqs_p),  
  200.        .ddr3_reset_n                   (ddr3_reset_n),  
  201.        .init_calib_complete            (init_calib_complete),  
  202.         
  203.        .ddr3_cs_n                      (ddr3_cs_n),  
  204.        .ddr3_dm                        (ddr3_dm),  
  205.        .ddr3_odt                       (ddr3_odt),  
  206. // Application interface ports  
  207.        .app_addr                       (app_addr),  
  208.        .app_cmd                        (app_cmd),  
  209.        .app_en                         (app_en),  
  210.        .app_wdf_data                   (app_wdf_data),  
  211.        .app_wdf_end                    (app_wdf_end),  
  212.        .app_wdf_wren                   (app_wdf_wren),  
  213.        .app_rd_data                    (app_rd_data),  
  214.        .app_rd_data_end                (app_rd_data_end),  
  215.        .app_rd_data_valid              (app_rd_data_valid),  
  216.        .app_rdy                        (app_rdy),  
  217.        .app_wdf_rdy                    (app_wdf_rdy),  
  218.        .app_sr_req                     (app_sr_req),  
  219.        .app_ref_req                    (app_ref_req),  
  220.        .app_zq_req                     (app_zq_req),  
  221.        .app_sr_active                  (app_sr_active),  
  222.        .app_ref_ack                    (app_ref_ack),  
  223.        .app_zq_ack                     (app_zq_ack),  
  224.        .ui_clk                         (ui_clk),  
  225.        .ui_clk_sync_rst                (ui_clk_sync_rst),  
  226.         
  227.        .app_wdf_mask                   (app_wdf_mask),  
  228.         
  229.          
  230. // System Clock Ports  
  231.        .sys_clk_i                       (sys_clk_i),  
  232. // Reference Clock Ports  
  233.        .clk_ref_i                      (clk_ref_i),  
  234.         
  235.        .sys_rst                        (sys_rst)  
  236.        );  
  237. // End of User Design top instance  
  238.      
  239.   
  240. endmodule  

 

如上图所示,app_cmd信号在①处为写ddr3命令,从bank0写到bank7。②处为ddr3读命令,从bank0读到bank7。

    如图红框所示,我们采用写时序第一种情况(具体参看《第三篇:mig IP用户读写时序》)。地址每次加8,数据每次加1。

如上图红框所示,连续写数据。

如上图红框所示,app_rd_data_valid信号有效,读出数据和写入数据一致,仿真验证完成。

FPGA开源工作室为了大家更好更快的学习FPGA目前开通了知识星球(FPGA自习学院)。

FPGA自习学院将不断更新和总结FPGA相关的学习资料,欢迎大家加入,一起学习一起成长。

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/baidu_34971492/article/details/88377919