vivadon mig读写时序下板实现

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

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

软件使用Vivado 2018.1。

参考工程:ddr3_test。

第一篇:DDR3和mig的介绍

第二篇:mig IP的创建

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

第四篇:mig IP的仿真

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

1顶层文件和约束文件

ddr3_test.v

  1. `timescale 1ns / 1ps    
  2. `define CMD_WR 3'b000  
  3. `define CMD_RD 3'b001  
  4. module ddr3_test(  
  5.        input clk,//100MHZ  
  6.        input reset,  
  7.        output init_calib_complete,  
  8.       //DDR3 Interface  
  9.       // Inouts  
  10.       inout [15:0]        ddr3_dq,  
  11.       inout [1:0]         ddr3_dqs_n,  
  12.       inout [1:0]         ddr3_dqs_p,  
  13.       // Outputs  
  14.       output [13:0]       ddr3_addr,  
  15.       output [2:0]        ddr3_ba,  
  16.       output              ddr3_ras_n,  
  17.       output              ddr3_cas_n,  
  18.       output              ddr3_we_n,  
  19.       output              ddr3_reset_n,  
  20.       output [0:0]        ddr3_ck_p,  
  21.       output [0:0]        ddr3_ck_n,  
  22.       output [0:0]        ddr3_cke,  
  23.       output [0:0]        ddr3_cs_n,  
  24.       output [1:0]        ddr3_dm,  
  25.       output [0:0]         ddr3_odt  
  26.        );  
  27.  //***************************************************************************  
  28.        parameter IDLE  = 5'd0,  
  29.                   WR1   = 5'd1,  
  30.                   WR2   = 5'd2,  
  31.                   WR3   = 5'd3,  
  32.                   WR4   = 5'd4,  
  33.                   WR5   = 5'd5,  
  34.                   WR6   = 5'd6,  
  35.                   WR7   = 5'd7,  
  36.                   WR8   = 5'd8,  
  37.                   RD1   = 5'd9,  
  38.                   RD2   = 5'd10,  
  39.                   RD3   = 5'd11,  
  40.                   RD4   = 5'd12,  
  41.                   RD5   = 5'd13,  
  42.                   RD6   = 5'd14,  
  43.                   RD7   = 5'd15,  
  44.                   RD8   = 5'd16,  
  45.                   DONE  = 5'd17;     
  46.            //  
  47.               // Single-ended system clock  
  48.            wire                                       sys_clk_i;//166.667MHZ  
  49.              
  50.            // Single-ended iodelayctrl clk (reference clock)  
  51.            wire                                        clk_ref_i;//200MHZ  
  52.   
  53.              
  54.              // user interface signals  
  55.              wire [27:0]        app_addr;//i  
  56.              reg [2:0]         app_cmd;//i  
  57.              wire               app_en;//i  
  58.              reg [127:0]       app_wdf_data;//i  
  59.              wire               app_wdf_end;//i  
  60.              wire [15:0]        app_wdf_mask;//i  
  61.              wire              app_wdf_wren;//i  
  62.              wire [127:0]       app_rd_data;  
  63.              wire               app_rd_data_end;  
  64.              wire               app_rd_data_valid;  
  65.              wire               app_rdy;  
  66.              wire               app_wdf_rdy;  
  67.              wire               app_sr_req;//i  
  68.              wire               app_ref_req;//i  
  69.              wire               app_zq_req;//i  
  70.              wire               app_sr_active;  
  71.              wire               app_ref_ack;  
  72.              wire               app_zq_ack;  
  73.              wire               ui_clk;  
  74.              wire               ui_clk_sync_rst;  
  75.              //wire               init_calib_complete;  
  76.              wire                sys_rst_n;  
  77.              wire                sys_rst;  
  78.              assign sys_rst =    sys_rst_n;  
  79.              reg [4:0] cstate,nstate;  
  80.              //wire [27:0]        wr_addr;//i  bank row column [2:0] [13:0] [9:0]  
  81.              //wire [27:0]        rd_addr;//i  bank row column [2:0] [13:0] [9:0]  
  82.              wire wr1_done;  
  83.              wire wr2_done;  
  84.              wire wr3_done;  
  85.              wire wr4_done;  
  86.              wire wr5_done;  
  87.              wire wr6_done;  
  88.              wire wr7_done;  
  89.              wire wr8_done;  
  90.                
  91.              wire rd1_done;  
  92.              wire rd2_done;  
  93.              wire rd3_done;  
  94.              wire rd4_done;  
  95.              wire rd5_done;  
  96.              wire rd6_done;  
  97.              wire rd7_done;  
  98.              wire rd8_done;       
  99.                
  100.              reg [2:0] bank;  
  101.              //reg [13:0] row;  
  102.              //reg [9:0] column;  
  103.              reg [23:0] addr;  
  104.        //assign  wr_addr =(cstate == WR1 ||cstate == WR2 ||cstate == WR3 ||cstate == WR4 ||cstate == WR5 ||cstate == WR6 ||cstate == WR7 ||cstate == WR8)?{1'b0,bank,addr}:28'b0;  
  105.        //assign  wr_addr =(cstate == RD1 ||cstate == RD2 ||cstate == RD3 ||cstate == RD4 ||cstate == RD5 ||cstate == RD6 ||cstate == RD7 ||cstate == RD8)?{1'b0,bank,addr}:28'b0;    
  106.        assign app_addr ={1'b0,bank,addr};    
  107.        assign  app_sr_req = 1'b0;  
  108.        assign app_ref_req = 1'b0;  
  109.        assign app_zq_req  = 1'b0;  
  110.        //assign app_addr = (app_cmd ==`CMD_WR && app_en == 1'b1)?wr_addr:rd_addr;  
  111.        assign app_wdf_mask = 16'h0000;  
  112.        assign app_wdf_end = app_wdf_wren;  
  113.        assign wr1_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b000) ? 1'b1:1'b0;  
  114.        assign wr2_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b001) ? 1'b1:1'b0;  
  115.        assign wr3_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b010) ? 1'b1:1'b0;  
  116.        assign wr4_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b011) ? 1'b1:1'b0;  
  117.        assign wr5_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b100) ? 1'b1:1'b0;  
  118.        assign wr6_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b101) ? 1'b1:1'b0;  
  119.        assign wr7_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b110) ? 1'b1:1'b0;  
  120.        assign wr8_done = (app_cmd ==`CMD_WR && addr == 28'd800 && bank == 3'b111) ? 1'b1:1'b0;  
  121.          
  122.        assign rd1_done = (cstate == RD1 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  123.        assign rd2_done = (cstate == RD2 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  124.        assign rd3_done = (cstate == RD3 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  125.        assign rd4_done = (cstate == RD4 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  126.        assign rd5_done = (cstate == RD5 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  127.        assign rd6_done = (cstate == RD6 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  128.        assign rd7_done = (cstate == RD7 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  129.        assign rd8_done = (cstate == RD8 && app_cmd ==`CMD_RD && addr == 28'd800) ? 1'b1:1'b0;  
  130.          
  131.        assign done_flag = (cstate == DONE)?1'b1:1'b0;  
  132.          
  133.        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;  
  134.        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;  
  135.        always @(posedge ui_clk or posedge ui_clk_sync_rst) begin  
  136.          if(ui_clk_sync_rst == 1'b1)  
  137.            cstate <= IDLE;  
  138.          else  
  139.            cstate <= nstate;   
  140.        end  
  141.          
  142.        always @(*) begin  
  143.          nstate = IDLE;  
  144.          case(cstate)  
  145.            IDLE:begin  
  146.              if(init_calib_complete == 1'b1)  
  147.                nstate = WR1;  
  148.              else  
  149.                nstate = IDLE;  
  150.            end  
  151.            WR1:begin  
  152.              if(wr1_done == 1'b1)  
  153.                nstate = WR2;   
  154.              else  
  155.                nstate = WR1;   
  156.            end  
  157.            WR2:begin  
  158.              if(wr2_done == 1'b1)  
  159.                nstate = WR3;   
  160.              else  
  161.                nstate = WR2;   
  162.            end  
  163.            WR3:begin  
  164.              if(wr3_done == 1'b1)  
  165.                nstate = WR4;   
  166.              else  
  167.                nstate = WR3;   
  168.            end  
  169.            WR4:begin  
  170.              if(wr4_done == 1'b1)  
  171.                nstate = WR5;   
  172.              else  
  173.                nstate = WR4;   
  174.            end  
  175.            WR5:begin  
  176.              if(wr5_done == 1'b1)  
  177.                nstate = WR6;   
  178.              else  
  179.                nstate = WR5;   
  180.            end  
  181.            WR6:begin  
  182.              if(wr6_done == 1'b1)  
  183.                nstate = WR7;   
  184.              else  
  185.                nstate = WR6;   
  186.            end  
  187.            WR7:begin  
  188.              if(wr7_done == 1'b1)  
  189.                nstate = WR8;   
  190.              else  
  191.                nstate = WR7;   
  192.            end  
  193.            WR8:begin  
  194.              if(wr8_done == 1'b1)  
  195.                nstate = RD1;   
  196.              else  
  197.                nstate = WR8;   
  198.            end  
  199.            RD1:begin  
  200.              if(rd1_done == 1'b1)  
  201.                nstate = RD2;   
  202.              else  
  203.                nstate = RD1;   
  204.             end  
  205.             RD2:begin  
  206.               if(rd2_done == 1'b1)  
  207.                 nstate = RD3;   
  208.               else  
  209.                 nstate = RD2;   
  210.             end  
  211.             RD3:begin  
  212.                if(rd3_done == 1'b1)  
  213.                  nstate = RD4;   
  214.                else  
  215.                  nstate = RD3;   
  216.             end  
  217.             RD4:begin  
  218.                if(rd4_done == 1'b1)  
  219.                  nstate = RD5;   
  220.                else  
  221.                  nstate = RD4;   
  222.             end  
  223.             RD5:begin  
  224.                if(rd5_done == 1'b1)  
  225.                  nstate = RD6;   
  226.                else  
  227.                  nstate = RD5;   
  228.             end  
  229.             RD6:begin  
  230.                if(rd6_done == 1'b1)  
  231.                  nstate = RD7;   
  232.                else  
  233.                  nstate = RD6;   
  234.             end  
  235.             RD7:begin  
  236.                if(rd7_done == 1'b1)  
  237.                  nstate = RD8;   
  238.                else  
  239.                  nstate = RD7;   
  240.             end  
  241.             RD8:begin  
  242.                if(rd8_done == 1'b1)  
  243.                  nstate = DONE;   
  244.                else  
  245.                  nstate = RD8;   
  246.             end  
  247.             DONE:begin  
  248.                nstate = WR1;   
  249.             end  
  250.          endcase  
  251.        end  
  252.          
  253.        always @(posedge ui_clk or posedge ui_clk_sync_rst) begin  
  254.          if(ui_clk_sync_rst == 1'b1) begin  
  255.            //wr_addr <= 28'd0; //bank [] row [] col []  
  256.            //rd_addr <= 28'b0;   
  257.            app_cmd <= `CMD_WR;  
  258.            app_wdf_data <= 128'b0;  
  259.                    
  260.            bank <= 3'b000;  
  261.            //row  <= 14'b0;  
  262.            //column <= 10'b0;  
  263.            addr <=24'b0;  
  264.          end  
  265.          else  
  266.            case(cstate)  
  267.              WR1:begin  
  268.                app_cmd <= `CMD_WR;  
  269.                bank <= 3'b000;  
  270.                if(wr1_done == 1'b1) begin  
  271.                  addr <=24'b0;  
  272.                  app_wdf_data <= 128'b0;  
  273.                end  
  274.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  275.                  //wr_addr <= wr_addr + 8;  
  276.                  //row  <= 14'b0;  
  277.                  //column <= column+8;  
  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.                  //wr_addr <= wr_addr + 8;  
  295.                  //row  <= 14'b0;  
  296.                  //column <= column+8;  
  297.                  addr <= addr +8;  
  298.                  app_wdf_data <= app_wdf_data +1;  
  299.                end  
  300.                else begin  
  301.                  addr <= addr;  
  302.                  app_wdf_data <= app_wdf_data;  
  303.                end  
  304.              end  
  305.              WR3:begin  
  306.                app_cmd <= `CMD_WR;  
  307.                bank <= 3'b010;  
  308.                if(wr3_done == 1'b1) begin  
  309.                  addr <=24'b0;  
  310.                  app_wdf_data <= 128'b0;  
  311.                end  
  312.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  313.                  //wr_addr <= wr_addr + 8;  
  314.                  //row  <= 14'b0;  
  315.                  //column <= column+8;  
  316.                  addr <= addr +8;  
  317.                  app_wdf_data <= app_wdf_data +1;  
  318.                end  
  319.                else begin  
  320.                  addr <= addr;  
  321.                  app_wdf_data <= app_wdf_data;  
  322.                end  
  323.              end  
  324.              WR4:begin  
  325.                app_cmd <= `CMD_WR;  
  326.                bank <= 3'b011;  
  327.                if(wr4_done == 1'b1) begin  
  328.                  addr <=24'b0;  
  329.                  app_wdf_data <= 128'b0;  
  330.                end  
  331.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  332.                  //wr_addr <= wr_addr + 8;  
  333.                  //row  <= 14'b0;  
  334.                  //column <= column+8;  
  335.                  addr <= addr +8;  
  336.                  app_wdf_data <= app_wdf_data +1;  
  337.                end  
  338.                else begin  
  339.                  addr <= addr;  
  340.                  app_wdf_data <= app_wdf_data;  
  341.                end  
  342.              end     
  343.              WR5:begin  
  344.                app_cmd <= `CMD_WR;  
  345.                bank <= 3'b100;  
  346.                if(wr5_done == 1'b1) begin  
  347.                  addr <=24'b0;  
  348.                  app_wdf_data <= 128'b0;  
  349.                end  
  350.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  351.                  //wr_addr <= wr_addr + 8;  
  352.                  //row  <= 14'b0;  
  353.                  //column <= column+8;  
  354.                  addr <= addr +8;  
  355.                  app_wdf_data <= app_wdf_data +1;  
  356.                end  
  357.                else begin  
  358.                  addr <= addr;  
  359.                  app_wdf_data <= app_wdf_data;  
  360.                end  
  361.              end   
  362.              WR6:begin  
  363.                app_cmd <= `CMD_WR;  
  364.                bank <= 3'b101;  
  365.               if(wr6_done == 1'b1) begin  
  366.                  addr <=24'b0;  
  367.                  app_wdf_data <= 128'b0;  
  368.                end  
  369.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  370.                  //wr_addr <= wr_addr + 8;  
  371.                  //row  <= 14'b0;  
  372.                  //column <= column+8;  
  373.                  addr <= addr +8;  
  374.                  app_wdf_data <= app_wdf_data +1;  
  375.                end  
  376.                else begin  
  377.                  addr <= addr;  
  378.                  app_wdf_data <= app_wdf_data;  
  379.                end  
  380.              end   
  381.              WR7:begin  
  382.                app_cmd <= `CMD_WR;  
  383.                bank <= 3'b110;  
  384.               if(wr7_done == 1'b1) begin  
  385.                  addr <=24'b0;  
  386.                  app_wdf_data <= 128'b0;  
  387.                end  
  388.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  389.                  //wr_addr <= wr_addr + 8;  
  390.                  //row  <= 14'b0;  
  391.                  //column <= column+8;  
  392.                  addr <= addr +8;  
  393.                  app_wdf_data <= app_wdf_data +1;  
  394.                end  
  395.                else begin  
  396.                  addr <= addr;  
  397.                  app_wdf_data <= app_wdf_data;  
  398.                end  
  399.              end    
  400.              WR8:begin  
  401.                app_cmd <= `CMD_WR;  
  402.                bank <= 3'b111;  
  403.                if(wr8_done == 1'b1) begin  
  404.                  addr <=24'b0;  
  405.                  app_wdf_data <= 128'b0;  
  406.                end  
  407.                else if(app_wdf_rdy == 1'b1&&app_rdy == 1'b1) begin  
  408.                  //wr_addr <= wr_addr + 8;  
  409.                  //row  <= 14'b0;  
  410.                  //column <= column+8;  
  411.                  addr <= addr +8;  
  412.                  app_wdf_data <= app_wdf_data +1;  
  413.                end  
  414.                else begin  
  415.                  addr <= addr;  
  416.                  app_wdf_data <= app_wdf_data;  
  417.                end  
  418.              end       
  419.              RD1:begin  
  420.                app_cmd <= `CMD_RD;  
  421.                bank <= 3'b000;  
  422.                if(rd1_done == 1'b1) begin  
  423.                  addr <= 24'b0;  
  424.                end  
  425.                else if(app_rdy == 1'b1)begin  
  426.                   addr <= addr+8;  
  427.                end  
  428.                else begin  
  429.                  addr <= addr;  
  430.                end  
  431.              end  
  432.              RD2:begin  
  433.                app_cmd <= `CMD_RD;  
  434.                bank <= 3'b001;  
  435.                if(rd2_done == 1'b1) begin  
  436.                  addr <= 24'b0;  
  437.                end  
  438.                else if(app_rdy == 1'b1)begin  
  439.                   addr <= addr+8;  
  440.                end  
  441.                else begin  
  442.                  addr <= addr;  
  443.                end  
  444.              end  
  445.              RD3:begin  
  446.                app_cmd <= `CMD_RD;  
  447.                bank <= 3'b010;  
  448.                if(rd3_done == 1'b1) begin  
  449.                  addr <= 24'b0;  
  450.                end  
  451.                else if(app_rdy == 1'b1)begin  
  452.                   addr <= addr+8;  
  453.                end  
  454.                else begin  
  455.                  addr <= addr;  
  456.                end  
  457.              end  
  458.              RD4:begin  
  459.                app_cmd <= `CMD_RD;  
  460.                bank <= 3'b011;  
  461.                if(rd4_done == 1'b1) begin  
  462.                  addr <= 24'b0;  
  463.                end  
  464.                else if(app_rdy == 1'b1)begin  
  465.                   addr <= addr+8;  
  466.                end  
  467.                else begin  
  468.                  addr <= addr;  
  469.                end  
  470.              end  
  471.              RD5:begin  
  472.                app_cmd <= `CMD_RD;  
  473.                bank <= 3'b100;  
  474.                if(rd5_done == 1'b1) begin  
  475.                  addr <= 24'b0;  
  476.                end  
  477.                else if(app_rdy == 1'b1)begin  
  478.                   addr <= addr+8;  
  479.                end  
  480.                else begin  
  481.                  addr <= addr;  
  482.                end  
  483.              end  
  484.              RD6:begin  
  485.                app_cmd <= `CMD_RD;  
  486.                bank <= 3'b101;  
  487.                if(rd6_done == 1'b1) begin  
  488.                  addr <= 24'b0;  
  489.                end  
  490.                else if(app_rdy == 1'b1)begin  
  491.                   addr <= addr+8;  
  492.                end  
  493.                else begin  
  494.                  addr <= addr;  
  495.                end  
  496.              end  
  497.              RD7:begin  
  498.                app_cmd <= `CMD_RD;  
  499.                bank <= 3'b110;  
  500.                if(rd7_done == 1'b1) begin  
  501.                  addr <= 24'b0;  
  502.                end  
  503.                else if(app_rdy == 1'b1)begin  
  504.                   addr <= addr+8;  
  505.                end  
  506.                else begin  
  507.                  addr <= addr;  
  508.                end  
  509.              end  
  510.              RD8:begin  
  511.                app_cmd <= `CMD_RD;  
  512.                bank <= 3'b111;  
  513.                if(rd8_done == 1'b1) begin  
  514.                  addr <= 24'b0;  
  515.                end  
  516.                else if(app_rdy == 1'b1)begin  
  517.                   addr <= addr+8;  
  518.                end  
  519.                else begin  
  520.                  addr <= addr;  
  521.                end  
  522.              end  
  523.              DONE:begin  
  524.                //wr_addr <= 28'd0; //bank [] row [] col []  
  525.                //rd_addr <= 28'b0;   
  526.                bank <= 3'b000;  
  527.                //row  <= 14'b0;  
  528.                //column <= 10'b0;  
  529.                addr <=24'b0;  
  530.                app_cmd <= `CMD_WR;  
  531.                app_wdf_data <= 128'b0;  
  532.              end  
  533.            endcase  
  534.        end  
  535.          
  536.          
  537.  clk_wiz_0  U_clk_wiz_0(  
  538.         // Clock in ports  
  539.          .clk_in1(clk),  
  540.          // Clock out ports  
  541.          .clk_out1(sys_clk_i),  
  542.          .clk_out2(clk_ref_i),  
  543.          // Status and control signals  
  544.          .reset(reset),  
  545.          .locked(sys_rst_n)  
  546.         );        
  547.        //***************************************************************************  
  548.                   
  549. ddr3_ip u_ddr3_ip  
  550.              (  
  551.        // Memory interface ports  
  552.               .ddr3_addr                      (ddr3_addr),  
  553.               .ddr3_ba                        (ddr3_ba),  
  554.               .ddr3_cas_n                     (ddr3_cas_n),  
  555.               .ddr3_ck_n                      (ddr3_ck_n),  
  556.               .ddr3_ck_p                      (ddr3_ck_p),  
  557.               .ddr3_cke                       (ddr3_cke),  
  558.               .ddr3_ras_n                     (ddr3_ras_n),  
  559.               .ddr3_we_n                      (ddr3_we_n),  
  560.               .ddr3_dq                        (ddr3_dq),  
  561.               .ddr3_dqs_n                     (ddr3_dqs_n),  
  562.               .ddr3_dqs_p                     (ddr3_dqs_p),  
  563.               .ddr3_reset_n                   (ddr3_reset_n),  
  564.               .init_calib_complete            (init_calib_complete),  
  565.                
  566.               .ddr3_cs_n                      (ddr3_cs_n),  
  567.               .ddr3_dm                        (ddr3_dm),  
  568.               .ddr3_odt                       (ddr3_odt),  
  569.        // Application interface ports  
  570.               .app_addr                       (app_addr),  
  571.               .app_cmd                        (app_cmd),  
  572.               .app_en                         (app_en),  
  573.               .app_wdf_data                   (app_wdf_data),  
  574.               .app_wdf_end                    (app_wdf_end),  
  575.               .app_wdf_wren                   (app_wdf_wren),  
  576.               .app_rd_data                    (app_rd_data),  
  577.               .app_rd_data_end                (app_rd_data_end),  
  578.               .app_rd_data_valid              (app_rd_data_valid),  
  579.               .app_rdy                        (app_rdy),  
  580.               .app_wdf_rdy                    (app_wdf_rdy),  
  581.               .app_sr_req                     (app_sr_req),  
  582.               .app_ref_req                    (app_ref_req),  
  583.               .app_zq_req                     (app_zq_req),  
  584.               .app_sr_active                  (app_sr_active),  
  585.               .app_ref_ack                    (app_ref_ack),  
  586.               .app_zq_ack                     (app_zq_ack),  
  587.               .ui_clk                         (ui_clk),  
  588.               .ui_clk_sync_rst                (ui_clk_sync_rst),  
  589.                
  590.               .app_wdf_mask                   (app_wdf_mask),  
  591.                
  592.                 
  593.        // System Clock Ports  
  594.               .sys_clk_i                       (sys_clk_i),  
  595.        // Reference Clock Ports  
  596.               .clk_ref_i                      (clk_ref_i),  
  597.                
  598.               .sys_rst                        (sys_rst)  
  599.               );  
  600.              
  601.  ila_0 U_ila(  
  602.              .clk(ui_clk),  
  603.                
  604.                
  605.              .probe0(app_addr),  
  606.              .probe1(app_cmd),  
  607.              .probe2(app_en),  
  608.              .probe3(app_wdf_data),  
  609.              .probe4(app_wdf_end),  
  610.              .probe5(app_wdf_mask),  
  611.              .probe6(app_wdf_wren),  
  612.              .probe7(app_rd_data),  
  613.              .probe8(app_rd_data_end),  
  614.              .probe9(app_rd_data_valid),  
  615.              .probe10(app_rdy),  
  616.              .probe11(app_wdf_rdy),  
  617.              .probe12(app_sr_req),  
  618.              .probe13(app_ref_req),  
  619.              .probe14(app_zq_req),  
  620.              .probe15(app_sr_active)  
  621.              );  
  622. endmodule  

ddr3.xdc

扫描二维码关注公众号,回复: 6151309 查看本文章
  1. set_property PACKAGE_PIN E3 [get_ports clk]  
  2. set_property IOSTANDARD LVCMOS33 [get_ports clk]  
  3. set_property PACKAGE_PIN D9 [get_ports reset]  
  4. set_property PACKAGE_PIN E1 [get_ports init_calib_complete]  
  5. set_property IOSTANDARD LVCMOS33 [get_ports init_calib_complete]  
  6. set_property IOSTANDARD LVCMOS33 [get_ports reset]  

2 下板实现读写时序

1>①完成综合和实现

 

2>下载bit文件和debug文件。

3>下载完成,查看波形。

 

4>将app_wdf_data数据格式改为Unsigned Decimal。

5>查看写时序。

 

6>查看读时序。

 

基于xilinx mig ip对ddr3读写的验证完成。学会ddr3接口的读写控制是每个FPGA工程师必须掌握的技能(几乎所有的公司都会要求),暂时没时间学习的同学可以在FPGA开源工作室(微信公众号)下回复“DDR3”获取xilinx mig ip使用的五篇pdf文档,以备不时之需。

FPGA开源工作室为了大家更好更快的学习FPGA目前开通了知识星球(FPGA自习学院)。FPGA自习学院将不断更新和总结FPGA相关的学习资料,欢迎大家加入,一起学习一起成长。

 

 

猜你喜欢

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