Avalon-MM总线控制DDR读写
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的差异。

代码
下面代码实现DDR简单读写。突发长度设置为4,将4个数据写入DDR,再读出4个数据。代码需要将输入的waitrequest先取反,把高电平有效改成低电平有效。
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)
beginif(!rst_n)beginstate <= st0;address <= 25'd0;cnt <= 4'd0;write <= 1'b0;read <= 1'b0;endelsebegincase(state)st0:beginif(cal_success)beginstate <= st1;endendst1:beginif(!waitrequest_n)beginif(cnt < 4'd4)begincnt <= cnt + 1'b1;write <= 1'b1;endelsebegincnt <= 4'd0;write <= 1'b0;state <= st2;endendendst2:beginif(!waitrequest_n)beginread <= 1'b1;state <= st3;end endst3:beginread <= 1'b0;state <= st4;endst4:beginif(readdatavalid)beginstate <= st5;endendst5:beginstate <= st0;endendcase;end
end
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
