Intel FPGA 的DDR控制器通过 Avalon总线进行读写控制,本文对Avalon总线突发读写DDR方法进行详细介绍。
Avalon-MM突发读写时序
突发写
下图是avalon突发写时序,当突发长度设置为4时,每次写入4个数据。waitrequest信号时从机发出的,主机操作只有在waitrequest为0低时有效,写是能信号write在waitrequest为低时,写入data1和addr1,在发送过程中如果waitrequest变为高电平,writedata、address和write需要保持原来的值,直到waitrequest变为低。突发写过程中,只需要写入首地址,其余地址会自动加1。
突发读
突发读时序中,在waitrequest为低时,读使能有效,主机输出突发读首地址,根据burstcount数值,在readdatavalid为高时,读取相应数量的数据。readdatavalid不受waitrequest影响。
DDR4接口ctrl_amm
DDR控制器的ctrl_amm接口是Avalon MM类型。通过ctrl_amm接口控制DDR读写。
DDR4读写时序
DDR接口读时序
对比DDR接口时序与Avalon总线协议接口时序,发现waitrequest信号存在差异,Avalon总线协议中waitrequest为低有效,DDR接口时序中waitrequest为高有效。
DDR接口写时序
DDR接口写时序更能明显看出waitrequest的差异。
文章来源:https://www.toymoban.com/news/detail-590305.html
代码
下面代码实现DDR简单读写。突发长度设置为4,将4个数据写入DDR,再读出4个数据。代码需要将输入的waitrequest先取反,把高电平有效改成低电平有效。文章来源地址https://www.toymoban.com/news/detail-590305.html
assign burstcount = 7'd4;
assign byteenable = 16'hffff;
assign writedata = {124'd0,cnt};
reg [5:0] state;
reg [3:0] cnt;
always@(posedge clk,negedge rst_n)
begin
if(!rst_n)
begin
state <= st0;
address <= 25'd0;
cnt <= 4'd0;
write <= 1'b0;
read <= 1'b0;
end
else
begin
case(state)
st0:
begin
if(cal_success)
begin
state <= st1;
end
end
st1:
begin
if(!waitrequest_n)
begin
if(cnt < 4'd4)
begin
cnt <= cnt + 1'b1;
write <= 1'b1;
end
else
begin
cnt <= 4'd0;
write <= 1'b0;
state <= st2;
end
end
end
st2:
begin
if(!waitrequest_n)
begin
read <= 1'b1;
state <= st3;
end
end
st3:
begin
read <= 1'b0;
state <= st4;
end
st4:
begin
if(readdatavalid)
begin
state <= st5;
end
end
st5:
begin
state <= st0;
end
endcase;
end
end
到了这里,关于Avalon-MM总线控制DDR读写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!