提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
没看过上一篇的去看一下上一章节对AXI_Lite在PL端的编写和使用,接下来是PS端的介绍
AXI_Lite总线使用方法(上)pl端读写BRAM
一、总览
如图,main函数实现的功能主要是初始化中断,中断来自WRRD模块发送数据完毕,中断触发为上升沿。具体功能往下看。
我们首先来看#define。不知道还有没有记得上一讲的slv_reg寄存器。这个寄存器主要是AXI Lite的数据,我们来看上一讲我们在PL端定义的寄存器功能。
如图,slv_reg0对应读起始信号(STAR)。slv_reg1对应读起始地址(STAR_ADDR)。slv_reg2对应PS向PL写数据长度,slv_reg3对应PL向PS写数据长度。我们点进具体看看这些地址是来自哪。ctrl+鼠标左键点击。
我们发向pl_bram_wrrd.h里写着slv_reg0-4的地址为0 4 8 12.这是为什么呢?我们在选择AXI_Lite总线位宽的时候默认选择的是32位,1字节等于8bit(8位)。所以32位就等于4个字节,寄存器也是32位的。所以一个寄存器占地址4个字节,所以slv_reg0地址位0-3。slv_reg1地址位4-7.。以此类推。
然后我们来看main函数
中断初始化和配置我就不讲了,资料很多。我这while里实现的功能就是识别到输入后发送至PL并读出来。
中断服务函数自然是检测到PL端的中断后开始读取PL端发送的数据。这里读数据和上面的读数据有一点区别。while里的读的数据长度是PS端输入字符后由strlen函数读取的。中断里的字符长度是读取PL端的数据slv_reg3得到的。区别如下图。。
PS写数据函数如下
PS和PL的通信应该还算是比较清楚了。。之间的联系主要就是PL写寄存器的方式,PS通过查询地址读写数据。
二、实战效果
1.PL 写数据给PS效果
PL定时每两秒发送四个字符串数据,字符串为a-z循环发送,我们先来看ILA的效果
我们打开VIVADO的ILA窗口,设置如下en信号位上升沿触发,
we信号为0XF(4‘b1111)(读写方向,1为PL写向PS。0为PS写向PL)。
开始仿真。
我们看到传输了字符串。我们看看SDK的串口信息
PS端读取正常,PL端发送正常
2.PS写数据给PL效果
我们现在把ILA的触发方式,we信号由1111改成0000(读写方向取反)
然后再SDK串口输入字符12345
PS环回识别正常,我们也看到PL和PS传输数据长度不同时是可以区分的。我们来看看PL端
我们看到,PL端也接收到了12345的串口信号。实验结束
总结
AXI_Lite总线的使用方法还是很简单的,可能时序对新手来说看起来还是比较头疼。我们在使用时注意PL关注寄存器的功能,我们给寄存器自定义功能要和PS上相对应。PS读写这些寄存器就通过地址映射。这就是ZYNQ的魅力吧。让人兴奋的硬软件协同设计。