深入了解DDR3(AXI接口例程)的知识点笔记

本文以7035开发板中的DDR3master例程对DDR3中所涉及的知识点梳理下笔记。

DDR支持的突发长度是2,4,8。即如果芯片的数据位宽是16bit的话那么接口数据位宽是32bit,64bit以及128bit。因为 L-Bank一次就存取两倍于芯片位宽的数据,所以芯片至少也要进行两次传输才可以。我认为芯片位宽就是DDR3中bank中每个地址存储的数据的位宽,这个是芯片型号以及确定的,是DDR3存储的最小单位位宽。而根据突发长度,其外部接口位宽可以有3种。

②根据DDR突发传输类型的选择,当选择类型是INCR(没传输一次地址增加一次)其突发长度在1-256之间(AXI中规定)但是DDR是2,4,8。

每次突发传输一次都要握手。握手成功后将要传输的数据放在数据通道的总线上。根据7035例程17_1。

———————————————————————————————————————————

assign M_AXI_AWLEN[7:0]   = reg_w_len[7:0];

assign WR_FIFO_RE  = rd_first_data | (reg_wvalid & ~WR_FIFO_EMPTY & M_AXI_WREADY & rd_fifo_enable);

 S_WD_PROC: begin
          if(M_AXI_WREADY & ~WR_FIFO_EMPTY) begin
            if(reg_w_len[7:0] == 8'd0) begin
              wr_state        <= S_WR_WAIT;
              reg_wvalid      <= 1'b0;
              reg_w_stb[7:0]  <= 8'h00;
            end else begin
              reg_w_len[7:0]  <= reg_w_len[7:0] -8'd1;
            end
          end
        end
  • reg_w_len连在AXI的AWLEN上表示突发长度。master程序控制的情况下递减,要一定注意的是这里的突发长度一定不要DDR的突发长度混淆,这里的突发长度单纯是对我们的ip核而言,而ip核的传输是遵循AXI总线的而不是DDR。所以这里的突发长度设置最大是256。而根据例程中的程序,即使wr_len大于256状态机也会把他分成很多个256然后多循环几次。当然如果小于256,就直接传输一次,传输长度就按我们要求的长度就可以。
  • 如上图伪代码可以看出:每次握手成功就从外部fifo中读取一个64bit(程序中将接口数据位宽设置成64bit也可以设置成32bit,64bit,128bit)数据。共需要读reg_w_len次数据。
  • .WR_ADRS ({wr_burst_addr,3'd0}     ),
    reg_wr_adrs[31:0] <= WR_ADRS[31:0];
    
    assign M_AXI_AWADDR[31:0] = reg_wr_adrs[31:0];
    
     S_WR_WAIT: begin
              if(M_AXI_BVALID) begin
                reg_wr_status[1:0]  <= reg_wr_status[1:0] | M_AXI_BRESP[1:0];
                if(reg_w_last) begin
                  wr_state          <= S_WR_DONE;
                end else begin
                  wr_state          <= S_WA_WAIT;
                  reg_wr_adrs[31:0] <= reg_wr_adrs[31:0] + 32'd2048;
                end
              end
            end
  • 外部的地址值左移3位后直接赋给M_AXI_AWADDR。如果wr_burst_addr每次递增128(和write_leb==128对应)——当给定地址wr_burst_addr==0,M_AXI_AWADDR==wr_burst_addr*8赋给ddr3的ip核;之后wr_burst_addr==128,M_AXI_AWADDR==128*8。
  • 关于左移3位我的理解:因为DDR3的突发长度固定是8。所以每次突发传输8次16位数据。所以两次初始地址之间相差8。而我们的master程序在一个状态机中会读fifo128次64位数据【注意8次16位对应ddr3的突发传输,128次64位对应axi的突发传输】。也就说不管我们设置的忌口位宽是32bit还是64bit还是128bit,ddr3都会突发读写8次放在自己16bit的bank中。所以没传输一次64bit给ddr3的ip核,对应的DDR3地址都会增加8,而我们传输了128次。那么就需要增加128*8地址。所以当设置的write_len是128时,完成一次给DDR3ip核的传输后的下一次,其其实地址应该从128*8开始。
  • 上面伪代码最后一行 reg_wr_adrs[31:0] <= reg_wr_adrs[31:0] + 32'd2048;是因为前面提到过INCR类型的AXI突发传输其突发长度最大是256。因此较上一次传输首地址而言新的一次的传输首地址应该从256*8开始。
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 深入了解DDR3(AXI接口例程)的知识点笔记

    发表评论