ZYNQ-7 LAB1:UART+MIO+EMIO+AXI GPIO+中断

硬件电路板:Xilinx的ZC702开发板

主芯片:ZYNQ-7000 XC7Z020

用到的外设:UART、LED、拨码开关

开发环境:家用电脑,Windows操作系统下的Vivado2017.2+SDK

ZYNQ PS设置:standalone模式(无操作系统)、单核

程序加载模式:JTAG

配件:电源、两根USB线,接口见开发板说明

工程源码下载见文末链接。

1.工程简介

1.1 VIVADO开发

工程的顶层设计如下图所示,包含了PS、AXI GPIO核、ILA、VIO以及AXI复位核互联总线核。

对外接口有4位LED和2位拨码开关,由PS的M_AXI_GP0口控制,通过AXI GPIO IP核将AXI4总线的数据提取出转换为GPIO的数据。

中断使用了SPI(IRQ_F2P)、PPI(Core0_nFIQ)。

MIO使用了UART,用于串口打印信息。

EMIO直接引出8bit到PL,用于PS到PL直接的数据交互。

1.2 SDK开发

软件工程需要将标题中的几项都进行一遍测试,我们通过开发板上的拨码开关(连接至MIO)进行模式切换

主函数在初始化好各接口后,会通过串口打印"LAB1 BEGIN!",紧接着

进入while(1)主循环,主循环中会控制AXI GPIO的LED灯闪烁(左右交替闪烁);

通过MIO的按钮SW13进行中断触发(中断号52),会进入中断函数,串口打印"MIO interrupt entry successful!",控制MIO的一个LED灯快速闪烁;

切换到各模式进行测试。


2.性能测试:

2.1 PS通过EMIO向PL发数据

调出来两路时钟给PL,50M的clk0作为ILA的采样时钟,5M的clk1作为参考信号输入进ILA。

SDK中C代码8bit EMIO累加1,使用延时函数进行延时。

工程中我们既使用了ILA核,还使用了System ILA核,我们发现他们两个还是有区别的:

  • System ILA可以自动匹配位宽,ILA不可以;
  • System ILA可以有MIX接口,也就是既有AXI又有Native;ILA不可以;
  • System ILA波形界面由一些提示信息,更方便观测一些;
  • ILA是双边沿采样;System ILA是单边沿?。也就是说使用50M采5M的信号,ILA采集到的点数是System ILA的两倍。

延时使用usleep(1),ILA抓到的波形如下:

从图中可以看出一个数据周期234个点(有的是236),对应时间是1/50 * 234 /2=2.34us。

也就是说ARM的延时不精确的。

我们将延时函数改为自己编写的计数器,计数为10时,ILA抓到的波形如下:

从图中可以看出一个数据周期32个点,对应时间是1/50 * 32/2=0.32us。

计数为1时,ILA抓到的波形如下:

从图中可以看出一个数据周期11个点,对应时间是1/50 * 11/2=0.11us。

不加任何延时,直接循环累加:

因为每个数据周期的时间有细微的差异,所以我们卡10个数的时间:

从图中可以看出一个数据周期7.2个点,对应时间是1/50 * 7.2/2=0.072us。

从以上实验可以得出以下结论:

  1. PS的延时时间不准确,debug模式下差的非常离谱,可能固化进去会好一些?;
  2. EMIO接口受PS软件的限制,最快的频率是1/0.072MHz=13.89MHz;
  3. 当然EMIO有64根之多,都连出来的话,带宽还是很可观的,可以达到888Mbps;
  4. 从波形图还可以看出,数据与时钟的相位关系并不固定,PL要稳定接收数据的话,PS端最好通过C编程输出一路同步时钟。

比较可行的一种方法是,将数据的最高位或者最低位作为同步时钟,每次发数都写2次,详见代码。

这样做,使得上升沿全部位于了数据的中心,PL就可以稳定收数了。速率有所下降,64bit全开的话最大带宽可以达到(保守估计):

周期=1/50 * 18/2=0.18us。带宽=63/0.18MHz=350Mbps。

MIO和EMIO都是PS的GPIO,对于PS来说是一样的,只是在不同的bank而已,所以EMIO都结论也是适用于MIO的。


2.2 PS通过AXI GPIO向PL发数据

PS的低速总线M_AXI_GP读写数据位宽是32bit,每个AXI GPIO最多有两个channel,也就是说IP核右侧最多有两个GPIO,每个32bit。

我们同样将AXI GPIO的led都4根线引到了ILA,我们看看AXI GPIO能跑多快。

在将LED输出连接到ILA核后,发现个bug,连接到ILA核后就没有LED PORT了,非常奇怪,不得已自己加了个RTL模块。

从这里还可以看出自己拉出来的输出端口,VIVADO封装好的蓝色总线没有显示位宽(gpio_sw),并且在top_wrapper.v生成后还会加些后缀。

好了,开始测试,延时选1秒时自然可以看到led闪烁。

我们将延时设置为1us,ILA抓到的波形如下:

不延时,以最快速率输出数据,ILA抓到的波形如下:

周期=1/50 * 21=0.41us。32bit全用满的话,极限带宽=32/0.41=78Msps。

另外一个ILA还抓了AXI总线的数据:

从以上实验可以得出以下结论:

  • M_AXI_GP总线的读写速度与AXI GPIO核右侧的数据速率相同;
  • M_AXI_GP总线是低速总线,速率还没有EMIO高。

还想测什么,你下载后可以自行测试,可以把测试结果写在评论里。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wandering_star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值