一、目标
熟悉PS的底层硬件控制、熟悉PS与PL联合开发。
二、预备知识
我们从Xilinx的官方文档UG585的第二章可以了解到,PS与PL数据交换主要就是通过AXI总线,此外还有时钟/中断、DMA等控制信号接口。详细的各部分功能框图如下。
UG585的第四章可以看到ZYNQ上ARM核的地址空间分配情况。
第14章可以了解到如何配置、读写EMIO。
三、工程实例
空白工程的创建请参照VIVADO+ZYNQ7000入门一博文。
工程建立好以后,首先添加一个IP block,点击1处,在2处输入名称,点击OK,
在新窗口中,点击1处添加IP,在2处搜索zynq,双击3处。
双击下图1处可以自动布线,双击2可以配置CPU的功能引脚,这部分可以参照VIVADO+ZYNQ7000入门二
设置一下flash的引脚、内存型号选择、延迟补偿等。
在本工程中,我们设置一组8位宽度的MIO从PS输出给PL。
在新建立的系统模块里,默认会有有个复位信号从PS端输出给PL端,同时会默认有一个时钟源提供给PL。
初步效果是这样。
在下图1的位置点击一下会展开GPIO,鼠标放置在2处标识输出端口处,然后右键,弹出窗口中选择3的位置,创建端口。
弹出窗口可以默认直接点击OK即可。
输出的IO数据,我们可以连接到内置的一个叫VIO的IP核上,它的作用类似于逻辑分析仪。
空白窗口处点击鼠标右键,然后选择add ip。
双击配置新的IP,只需要输入填1、输出填0,然后设置输入位宽为8.
验证提示问题,有一个时钟源需要去掉。
把下面的勾选项去掉。
各IP连线很方便,只需要把鼠标放到端口的位置,拖动鼠标到另一端即可实现连线。
模块添加完后,生成一个工程的配置文件。
Sources 栏,design system上点击鼠标右键,选择Create HDL Wrapper。在弹出窗口中默认,点OK。
配置完成后,执行编译,因为添加了新的IP核,注意IP模块除了CPU以外,其它的IP都是运行在PL上的。弹出窗口中,默认选项,然后点击OK。
后面需要生成一个可以下载到开发板的bit文件。弹出窗口默认配置,点OK,yes。
编译过程有点漫长!编译完成后弹出一个窗口,可以选择cancel,如果选Ok的话,会打开综合布局布线效果。这里暂时不做介绍。
下一步像入门二一样的操作,把生成的硬件信息导出,然后链接到SDK里面。File–export–export hardware ,这里需要选择include bitstream。然后执行File – launch SDK。
四、SDK开发
File - new - Application Project,输入工程名字,点击next,然后选择empty Application,点击Finish。
src上右键,新建一个C文件。弹出窗口中输入文件名,注意需要加.c 后缀。
拷贝下面代码。
/*
* emio.c
*
*/
#include "xparameters.h"
#include "xil_io.h"
#define DIRM 0x00000284 //方向控制寄存器地址
#define OEN 0x00000288 //是能控制寄存器地址
#define DATA 0x00000048 // BANK2 数据寄存器地址
int main( )
{
u8 data;
u32 receive;
volatile int Delay;
data = 0xAA;
Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + DIRM,0xFF);
Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + OEN,0xFF);
receive = Xil_In32(XPAR_XGPIOPS_0_BASEADDR + DATA); //读出当前输入输出配置
receive = receive & 0xFFFFFF00; //只改变需要的通道,设置为输出
receive = receive | data; // 把设置值写入到控制寄存器
Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + DATA,receive);
while(1)
{
data = ~data; //数据隔一段时间取反一次
receive = Xil_In32(XPAR_XGPIOPS_0_BASEADDR + DATA);
receive = receive & 0xFFFFFF00;
receive = receive | data;
Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + DATA,receive);
for (Delay = 0; Delay < 100000000; Delay++);
}
return 1;
}
然后点击Project 下的Build all,或者直接Ctrl + B。编译过程中如果提示头文件错误,可以查看最右侧看一下包含的文件有没有错误提示,一般会提示解决方法,比如按F5刷新。
五、下载运行
依次点击下图中的1、2,把vivado编译好的bit文件下载到目标板卡上,记得下载前,连接好JTAG、板卡上电。
下一步需要把应用程序下载到板卡上,右键点击GPIO。
弹出串口中,选择 Run As – Launch on Hardwre
现在回到Vivado的主界面,找到左侧Program and Debug 项,点击 Generate Bitstream。过程完成后会弹出一个小窗口,如下图右侧所示,选择 Open Hardware Manage。
点击Open target,然后选择 Auto Connect。
这时会看到hw_vios 窗口,点击“+”,双击下图中蓝色背景处。
这样IO上的数据就通过vio监测到了,我们可以看到Value列依次从55变到AA。