硬件电路板: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。
从以上实验可以得出以下结论:
- PS的延时时间不准确,debug模式下差的非常离谱,可能固化进去会好一些?;
- EMIO接口受PS软件的限制,最快的频率是1/0.072MHz=13.89MHz;
- 当然EMIO有64根之多,都连出来的话,带宽还是很可观的,可以达到888Mbps;
- 从波形图还可以看出,数据与时钟的相位关系并不固定,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高。
还想测什么,你下载后可以自行测试,可以把测试结果写在评论里。