使用AXI-Full接口的IP进行DDR的读写测试

网友投稿 359 2022-11-05

使用AXI-Full接口的IP进行DDR的读写测试

学习内容

本文首先进行自定义IP的AXI总线IP的设计,然后在SDK下编写代码进行DDR的读写数据的测试。

开发环境

系统框图

自定义IP设计

硬件平台构建

首先,添加ZYNQ7 IP核,以及添加已经完成设计的ddr读写IP核。

添加用户自定义IP

添加按键消抖IP

module key_filter(Clk, //50M时钟输入Rst_n, //模块复位key_in, //按键输入key_flag, //按键标志信号key_state //按键状态信号);input Clk;input Rst_n;input key_in;output reg key_flag;output reg key_state;localparamIDEL= 4'b0001,FILTER0= 4'b0010,DOWN= 4'b0100,FILTER1 = 4'b1000;reg [3:0]state;reg [19:0]cnt;reg en_cnt;//使能计数寄存器//对外部输入的异步信号进行同步处理reg key_in_sa,key_in_sb;always@(posedge Clk or negedge Rst_n)if(!Rst_n)beginkey_in_sa <= 1'b0;key_in_sb <= 1'b0;endelse beginkey_in_sa <= key_in;key_in_sb <= key_in_sa;endreg key_tmpa,key_tmpb;wire pedge,nedge;reg cnt_full;//计数满标志信号//使用D触发器存储两个相邻时钟上升沿时外部输入信号(已经同步到系统时钟域中)的电平状态always@(posedge Clk or negedge Rst_n)if(!Rst_n)beginkey_tmpa <= 1'b0;key_tmpb <= 1'b0;endelse beginkey_tmpa <= key_in_sb;key_tmpb <= key_tmpa;end//产生跳变沿信号assign nedge = !key_tmpa & key_tmpb;assign pedge = key_tmpa & (!key_tmpb);always@(posedge Clk or negedge Rst_n)if(!Rst_n)beginen_cnt <= 1'b0;state <= IDEL;key_flag <= 1'b0;key_state <= 1'b1;endelse begincase(state)IDEL :beginkey_flag <= 1'b0;if(nedge)beginstate <= FILTER0;en_cnt <= 1'b1;endelsestate <= IDEL;endFILTER0:if(cnt_full)beginkey_flag <= 1'b1;key_state <= 1'b0;en_cnt <= 1'b0;state <= DOWN;endelse if(pedge)beginstate <= IDEL;en_cnt <= 1'b0;endelsestate <= FILTER0;DOWN:beginkey_flag <= 1'b0;if(pedge)beginstate <= FILTER1;en_cnt <= 1'b1;endelsestate <= DOWN;endFILTER1:if(cnt_full)beginkey_flag <= 1'b1;key_state <= 1'b1;state <= IDEL;en_cnt <= 1'b0;endelse if(nedge)beginen_cnt <= 1'b0;state <= DOWN;endelsestate <= FILTER1;default:begin state <= IDEL; en_cnt <= 1'b0;key_flag <= 1'b0;key_state <= 1'b1;endendcaseendalways@(posedge Clk or negedge Rst_n)if(!Rst_n)cnt <= 20'd0;else if(en_cnt)cnt <= cnt + 1'b1;elsecnt <= 20'd0;always@(posedge Clk or negedge Rst_n)if(!Rst_n)cnt_full <= 1'b0;else if(cnt == 20'd999_999)cnt_full <= 1'b1;elsecnt_full <= 1'b0;endmodule

SDK软件部分

打开SDK后,新建application project。在main.c中输入以下代码:

代码简要说明

这里使用的IP我们设定成不需要进行缓存的,所以在main函数中调用Xil_DCacheDisable();。使用Xil_In32(),对DDR对应位置的数据进行读取。参数只需要传递所要读取的地址即可。因为一次写入的数据是32位的,每个地址的数据位宽是8位,所以在for循环中使用了i=i+4。

在串口中使用printf("%d is %d ",i,(int)(Xil_In32(0x10000000+i)));对相应地址的数据进行读取显示。

运行效果

如何波形进行debug?

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SHELL脚本基础命令知识(编程规范与变量)
下一篇:文本处理与grep
相关文章

 发表评论

暂时没有评论,来抢沙发吧~