上百篇原创人工智能系列教程,从理论到实战,手把手带你掌握人工智能,点击☞这里☜进入传送门~
在上一篇中提到,Pynq是为了降低开发人员的门槛,但是作为一个学习嵌入式开发的学生,当然要一步一个脚印打好基础,所以选择从Zynq入手学习,等跑起来Linux系统再运用Python开发也不迟,知其然也知其所以然,开发效率更高,所以接下来的几篇都是关于Zynq的,如果想直接玩Pynq可直接跳过,毫无影响。
在开始实验之前对Zynq芯片有一个基本的认识,如果想深入了解关于Zynq的理论部分,推荐参考The Zynq Book,有英文版和中文版,在此对于Zynq的理论浅尝辄止,不做深究,重点放在实验应用上。
Zynq中包含两大功能块:PS部分和PL部分。
PS部分指Processing System,一个基于双ARM Cortex A9内核的处理系统,其中集成了内存存储器和外部存储器接口,大量的外设:GPIO、UART、SD/SDIO、IIC、SPI、以太网、CAN等等接口;
PL部分指Programmable Logic,基于Xilinx 7系列架构的可编程逻辑单元,通过PL部分可以为ARM定制很多外设,这也是Zynq的一大优点。
Zynq中虽然包含PS端和PL端,但是整个设计是以ARM处理器为中心的,PS端的ARM内核可以独立于PL端运行,值得注意的是,虽然PL端也可以独立于PS端运行,但是PL的配置是由PS端完成的,所以不能采用传统的固化FLASH的方式固化PL端程序。
PS端和PL端通信是通过AXI接口协议连接,这个协议是AMBA的一部分,是一种高性能、高带宽、低延迟的片内总线,对这个总线不用进行太深的研究,在后续的实验中可以看到,Xilinx已经提供了大量的关于AXI总线ip核供我们调用。
实验所需Pynq-Z2开发板的全部资料都可以在TUL官网下载到:
配置PL端使板载4个LED闪烁
实验具体步骤参考 ALINX_ZYNQ开发平台基础教程V1.02 第四章:PL的“Hello World”LED实验,需要注意的有以下几点:
首先新建一个引脚约束文件后,将之前所下载的Pynq-Z2开发板的引脚约束文件中的内容拷贝过来,将led和时钟相关内容取消注释,注意端口名称要对应:
PL端的配置需要PS端配置,所以在这里我们只能使用JTAG方式下载测试程序,并且需要将Pynq-Z2开发板的启动方式切换为JTAG方式:将右上角的BOOT选择端子连接最右边两个引脚,选中JTAG方式。
Zynq中PL端的开发和FPGA芯片(Artix-7)的开发流程完全一样,但是只能在独立使用P端的时候,只能使用JTAG方式下载。
独立运行PS端,通过USB线连接的UART0串口()输出“Hello, world! ”
实验具体步骤参考 ALINX_ZYNQ开发平台基础教程V1.02 第六章:体验ARM,裸机输出“Hello World”实验 ,需要注意的有以下几点:
在第2节中获取Pynq-Z2开发板的Board file文件,这个文件包含了Pynq-Z2开发板上PS端的所有配置,所以我们接下来添加使用这个文件来代替 ALINX_ZYNQ开发平台基础教程V1.02 中手动配置PS端的过程:
之前下载的boardfile文件夹中包含pynq-z2文件夹,将其复制[vivado安装目录]/2018.1/data/boards/board_parts/zynq目录下,如图:
所有步骤都和之前新建工程一样,只是在选择Default Part页面不一样,如下:
之后会出现开发板相关信息,再次检查是否正确,然后Finish
创建完Block Design之后,向其中添加zynqIP核,如下图所示,要注意,这个zynqIP核只是一个独立的IP核,并没有进行任何设置和点击,因为工程是基于pynq-z2开发板创建的,已经包含ps端配置信息,所以直接点击Run Block Automation
,Vivado就会自动将这个zynqIP和的DDR和FIXED_IO接口与PS端的接口进行对应连接,连接后如图所示,然后保存:
自动连接完成之后双击ZynqIP核即可看到所有配置已经自动完成了,我们使用的UART0也已配置完成,这里只是查看,不作任何修改:
然后选择Tools -> Validate Design或者按下F6验证设计:
这是因为之前自动导出端口时只配置了DDR和FIXED_IO,设计里没有使用AXI 接口GP0相关IP核,所以没有自动配置时钟,手动连线:
再次验证,无错误!
本实验是串口输出"Hello World!\n\r",所以查看方式有三种:
SDK中自带串口终端,非常方便,点击按钮添加串口
运行程序后即可看到结果:
Zynq中PS端的使用包含两部分:
在设计硬件的时候都是基于IP核进行设计的,ARM处理器内核和Zynq7 Processing IP核相对应,在设计完成之后通过Vivado进行端口之间的自动连接,设计完成后到处SDK所需要的硬件文件,转入软件设计;
软件设计时和普通ARM内核处理器的开发相同,采用C语言开发,并无多大差异,详细细节可以参考Xilinx文档和例程。
printf在嵌入式开发中是一个很常用的函数,通过如下代码进行测试:
int main()
{
char str[20];
init_platform();
//print("Hello World\n\r");
/* Test Function print */
printf("%d\r\n",123);
printf("%f\r\n",1.23);
printf("%x\r\n",0xFF);
sprintf(str,"%s\r\n","hello");
printf(str);
cleanup_platform();
while(1);
}