空白工程的创建请参照上一篇博文
VIVADO+ZYNQ7000入门一, 第一个PL程序,从创建到运行
ZYNQ系列产品中,PS系统在Vivado的开发环境下下被当作一个IP core来调用,接下来我们先准备一个具备简单功能的PS系统,然后在这个系统上运行一个串口打印程序,输出hello world字符串。
涉及到的内容主要有三个方面,一是定义一个ARM核的IP core,配置简单接口;二是封装IP核,设置顶层头文件;三是在Vivado集成的SDK上,设计一个简单的串口程序。
一、定义IP
在新建工程窗口的最左侧,如下图所示,点击1,弹出窗口中,在2的位置输入IP的名称,然后点击OK
在弹出的新窗口中点击1处的图标,在2的位置输入zy搜索,可以看到ZYNQ的处理器系统block,双击。
稍等片刻,zynq的模块图标展现在我们面前!
双击它,目的是订制一些接口功能以及参数。接下来的工作量会有点大,这个就相当于配置一个CPU的功能接口了。首先我们从时钟配置入手,点击下图中红线标注处。
在进行设置前,我们可以先浏览一下Xilinx的官方文档UG585,里面关于clock的功能框图。我们可以看到CPU内部有三个PLL,把外部的晶振时钟分成三个不同的时钟源,同时ARM核时钟又可以有两种倍频配置,分别是6:3:2:1和4:2:2:1。
基本上都暂时用默认配置,注意红线框处,目前只做一个简单的PS系统,不需要输出时钟,把此处的勾选去掉。
接下来选择PL-PS配置,去掉AXI总线接口,本文暂时不用。
接下来配置CPU直接引出的MIO功能,这个配置主要是以据自己手上开发板的硬件电路图来设置。
继续配置一下DDR,选择板卡上用到的内存型号,配置PCB布线延时补偿。
各项功能配置完成后,点击一下自动布线。
然后选择校验功能,检查一下设计有没有问题。
二、封装IP
依次点选下图中的1、2、3步
在弹出窗口中,选择自动。
这是可以看到design system这里图标已经发生变化,名称也变为“design sys wrapper”,下图红线处点击右键,在弹出窗口中选择Generate Output Products…
稍后弹出新窗口,参数都默认,点击Generate即可。
这里提示了一个错误,是网络信号的电平设置不对。
回去修改一下,改为1.8V,修改后记得再次 选择Generate Output Products…
接下来是把生成的硬件配置输出给SDK开发环境。
File–Export–Exprot Hardware…
工作路径默认即可。
然后打开SDK开发环境。
三、SDK开发
二、串口SDK应用程序
接下来的操作是在SDK环境下进行。
新建工程/新建C文件。
我们可以先调用一个系统自带的验证程序,看硬件系统是否能跑起来。
电路板上电、连上JTAG,测试一下是否找到设备。
SDK自带串口接收程序,当然也可以用独立的串口软件,我用的是独立串口软件。
执行如下操作可以让程序运行起来。
正常的话,串口可以看到一些接口检查程序打印PASSED。
接下来再创建我们自己的串口测试工程。
#include "xparameters.h"
#include "xuartps.h"
XUartPs Uart_Ps;
int main(void)
{
u8 HelloWorld[] = "Hello World";
int SentCount = 0;
XUartPs_Config *Config;
Config = XUartPs_LookupConfig(XPAR_XUARTPS_0_DEVICE_ID);
XUartPs_CfgInitialize(&Uart_Ps, Config, Config->BaseAddress);
XUartPs_SetBaudRate(&Uart_Ps, 115200);
while (SentCount < (sizeof(HelloWorld) - 1)) {
/* Transmit the data */
SentCount += XUartPs_Send(&Uart_Ps,
&HelloWorld[SentCount], 1);
}
return SentCount;
}
运行后,可以看到串口终端最后一行打印了 Hello World。