当前位置:   article > 正文

【ZYNQ入门】第七篇、AXI Lite协议使用方法_zynq 修炼秘籍裸机篇2019版

zynq 修炼秘籍裸机篇2019版

目录

第一部分、参考文章

1、PL端读取   

2、PL端写入 

第二部分、AXI Lite IP封装

1、封装步骤

2、 AXI Lite寄存器的地址

第三部分、SDK的调用方法

1、调用方法

2、 AXI_Lite.c代码      

3、仿真测试

3.1、main.c文件

3.2、仿真的结果 

第四部分、总结


第一部分、参考文章

        关于AXI总线的相关知识,大家可以参考我之前写的这篇文章:【ZYNQ入门】第五篇、AXI HP口读写数据原理-CSDN博客

        AXI Lite总线内部协议就是AXI Lite协议,与FPGA之间通过GP口相连接。这里我就不过多去介绍它的基本知识,我只简单说一下我在使用过程中对AXI Lite IP的一些思考。

        AXI Lite IP可以看作是PS端与PL端中间的一块寄存器列表,这个寄存器列表可以PS端做主机,PL端做从机;也可以PL端做主机,PS段做从机。

        但是我目前遇到的情况如下图,都是:PS端做主机,PL端做从机。PS端对寄存器列表是可读可写,然后PL端去读取写入的值。

1、PL端读取   

        PL去读取AXI Lite寄存器列表的值还是非常简单的,将想要读取的值进行导出和赋值就可以了。这里采用always语句块,保证时序。

2、PL端写入 

        当然,PL端也是可以去修改AXI Lite寄存器列表内的值。通过修改下面这段源码就可以实现。具体细节请参考《米联客 ZYNQ 修炼秘籍裸机篇 2019 版》第248页(关于这本实验手册大家可以去官网下载,没有的可以在评论区留下邮箱,我发给你。)

第二部分、AXI Lite IP封装

1、封装步骤

第一步、Tools下Creat and Package New IP。

第二步、修改名称,描述文件等

第三步、选择协议为Lite,接口模式为Slave(因为ZYNQ做主机),数据位宽默认32位,寄存器的个数:按需填写

 第四步、根据硬件需求适当修改内部代码,导出某些端口等

 第五步、我在设计时把前六个寄存器的值都导出到了ila

2、 AXI Lite寄存器的地址

        AXI Lite寄存器的首地址,可以在Address Editer中查看和

第三部分、SDK的调用方法

1、调用方法

        如果调用了AXI Lite的IP,那么生成platform里面就会自动生成寄存器列表对应的.c和.h文件。如下图:只需将platform中的文件复制到主文件夹得src文件夹内部,修改代码,便可。

2、 AXI_Lite.c代码      

        在AXI_Lite.c文件中增加如下代码。然后去AXI_Lite.h文件中申明函数。注意:记得添加"xil_io.h"文件,不然会报错。

        这里函数这么封装,填写RedAddr的时候就可以从0,1,2,3........,一直往后。而不是0,4,8,12......。这是因为寄存器列表每一个数据的大小都是32位,占用4个字节,因此地址偏移量为4。

  1. /***************************** Include Files *******************************/
  2. #include "AXI_Lite.h"
  3. #include "xil_io.h"//防止报错
  4. /************************** Function Definitions ***************************/
  5. void write_conf_list(u32 BaseAddr,u32 RegAddr,u32 data){
  6. AXI_LITE_mWriteReg(BaseAddr, RegAddr<<2, data);
  7. }
  8. u32 read_conf_list(u32 BaseAddr,u32 RegAddr){
  9. return AXI_LITE_mReadReg(BaseAddr, RegAddr<<2);
  10. }

3、仿真测试

3.1、main.c文件

        定义了一个结构体,然后往寄存器列表写数据,最后在从PL端读取写入的数据。

  1. #include "xil_printf.h"
  2. #include "AXI_Lite.h"
  3. #include "sleep.h"
  4. //AXI Lite寄存器列表的首地址
  5. #define REGBASEADDR 0x43C00000
  6. typedef struct {
  7. u8 name;
  8. u8 sex;
  9. u32 phone_num;
  10. u32 class_a;
  11. u32 math_scores;
  12. u32 English_scores;
  13. }regdata;
  14. int main(){
  15. regdata data = {
  16. .name = 'A',
  17. .sex = 'm',
  18. .phone_num = 110,
  19. .class_a = 3,
  20. .math_scores = 99,
  21. .English_scores = 60
  22. };
  23. write_conf_list(REGBASEADDR,0,data.name);
  24. write_conf_list(REGBASEADDR,1,data.sex);
  25. write_conf_list(REGBASEADDR,2,data.phone_num);
  26. write_conf_list(REGBASEADDR,3,data.class_a);
  27. write_conf_list(REGBASEADDR,4,data.math_scores);
  28. write_conf_list(REGBASEADDR,5,data.English_scores);
  29. return 0;
  30. }

3.2、仿真的结果 

        仿真结果与写入的一致(这里的Name和Sex都是以ascII码的方式显示)。

        从仿真的结果:我个人觉得AXI Lite这块寄存器列表,很像ZYNQ内部两颗ARM的共享内存。只不过这里是ARM和FPGA之间的共享内存。

第四部分、总结

        这部分内容比较简单,相较于AXI HP口的使用,AXI GP口的使用就简单很多。这里做下记录,防止后面使用的时候忘记了流程。

        对了,群聊号码1020775171,有疑问的小伙伴可以加入哦,但是我不太爱在群聊里说话,我觉得在群聊里说话有好多人看,有点抗拒,不太喜欢这种感觉,等我有时间了我再尝试尝试声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/856897

推荐阅读
相关标签