本文以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。文章来源:https://www.toymoban.com/news/detail-540944.html
---------------------------------------------------------------------------------------------------------------------------------文章来源地址https://www.toymoban.com/news/detail-540944.html
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开始。
到了这里,关于DDR3(AXI接口例程)知识点笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!