PYNQ上手笔记 | ②PL端和PS端的独立开发

上百篇原创人工智能系列教程,从理论到实战,手把手带你掌握人工智能,点击☞这里☜进入传送门~

在上一篇中提到,Pynq是为了降低开发人员的门槛,但是作为一个学习嵌入式开发的学生,当然要一步一个脚印打好基础,所以选择从Zynq入手学习,等跑起来Linux系统再运用Python开发也不迟,知其然也知其所以然,开发效率更高,所以接下来的几篇都是关于Zynq的,如果想直接玩Pynq可直接跳过,毫无影响。

1.Zynq的架构

在开始实验之前对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核供我们调用。

2.获取Pynq-Z2开发板资料

实验所需Pynq-Z2开发板的全部资料都可以在TUL官网下载到:

  • TUL PYNQ-Z2产品公告(PDF)
  • PYNQ-Z2用户手册(PDF)
  • 原理图(PDF)
  • Board files
    Board file包含了Pynq-Z2开发板上PS端所有的配置,用法在PS独立实验中提及。
  • XDC 约束文件

3.Zynq中PL端的独立运行

3.1.实验目标

配置PL端使板载4个LED闪烁

3.2.实验步骤

实验具体步骤参考 ALINX_ZYNQ开发平台基础教程V1.02 第四章:PL的“Hello World”LED实验,需要注意的有以下几点:

3.2.1.引脚约束

首先新建一个引脚约束文件后,将之前所下载的Pynq-Z2开发板的引脚约束文件中的内容拷贝过来,将led和时钟相关内容取消注释,注意端口名称要对应
PYNQ上手笔记 | ②PL端和PS端的独立开发_第1张图片
PYNQ上手笔记 | ②PL端和PS端的独立开发_第2张图片

3.2.2.下载比特流

PL端的配置需要PS端配置,所以在这里我们只能使用JTAG方式下载测试程序,并且需要将Pynq-Z2开发板的启动方式切换为JTAG方式:将右上角的BOOT选择端子连接最右边两个引脚,选中JTAG方式。

3.3.实验现象

PYNQ上手笔记 | ②PL端和PS端的独立开发_第3张图片

3.3.实验总结

Zynq中PL端的开发和FPGA芯片(Artix-7)的开发流程完全一样,但是只能在独立使用P端的时候,只能使用JTAG方式下载。

3.4.实验扩展

  • 驱动板载的两颗RGBled
  • ip核的使用

4.Zynq中PS端独立运行

4.1.实验目标

独立运行PS端,通过USB线连接的UART0串口()输出“Hello, world! ”

4.2.实验流程

实验具体步骤参考 ALINX_ZYNQ开发平台基础教程V1.02 第六章:体验ARM,裸机输出“Hello World”实验 ,需要注意的有以下几点:

4.2.1.使用Boardfile新建Vivado工程

在第2节中获取Pynq-Z2开发板的Board file文件,这个文件包含了Pynq-Z2开发板上PS端的所有配置,所以我们接下来添加使用这个文件来代替 ALINX_ZYNQ开发平台基础教程V1.02 中手动配置PS端的过程:

4.2.1.1.添加board file文件

之前下载的boardfile文件夹中包含pynq-z2文件夹,将其复制[vivado安装目录]/2018.1/data/boards/board_parts/zynq目录下,如图:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第4张图片

4.2.1.2.新建基于Pynq-Z2开发板的工程

所有步骤都和之前新建工程一样,只是在选择Default Part页面不一样,如下:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第5张图片
之后会出现开发板相关信息,再次检查是否正确,然后Finish
PYNQ上手笔记 | ②PL端和PS端的独立开发_第6张图片

4.2.2.创建Block Design,添加IP,vivado自动导出端口

创建完Block Design之后,向其中添加zynqIP核,如下图所示,要注意,这个zynqIP核只是一个独立的IP核,并没有进行任何设置和点击,因为工程是基于pynq-z2开发板创建的,已经包含ps端配置信息,所以直接点击Run Block Automation,Vivado就会自动将这个zynqIP和的DDR和FIXED_IO接口与PS端的接口进行对应连接,连接后如图所示,然后保存:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第7张图片
PYNQ上手笔记 | ②PL端和PS端的独立开发_第8张图片
PYNQ上手笔记 | ②PL端和PS端的独立开发_第9张图片
自动连接完成之后双击ZynqIP核即可看到所有配置已经自动完成了,我们使用的UART0也已配置完成,这里只是查看,不作任何修改:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第10张图片
然后选择Tools -> Validate Design或者按下F6验证设计
PYNQ上手笔记 | ②PL端和PS端的独立开发_第11张图片
这是因为之前自动导出端口时只配置了DDR和FIXED_IO,设计里没有使用AXI 接口GP0相关IP核,所以没有自动配置时钟,手动连线:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第12张图片
再次验证,无错误!

4.3.实验结果

本实验是串口输出"Hello World!\n\r",所以查看方式有三种:

4.3.1.SDK Terminal

SDK中自带串口终端,非常方便,点击按钮添加串口
PYNQ上手笔记 | ②PL端和PS端的独立开发_第13张图片
PYNQ上手笔记 | ②PL端和PS端的独立开发_第14张图片
运行程序后即可看到结果:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第15张图片

4.3.2.外部串口终端

此处使用Xshell进行查看:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第16张图片

4.4.实验总结

Zynq中PS端的使用包含两部分:

  • 硬件设计
  • 软件设计

在设计硬件的时候都是基于IP核进行设计的,ARM处理器内核和Zynq7 Processing IP核相对应,在设计完成之后通过Vivado进行端口之间的自动连接,设计完成后到处SDK所需要的硬件文件,转入软件设计;
软件设计时和普通ARM内核处理器的开发相同,采用C语言开发,并无多大差异,详细细节可以参考Xilinx文档和例程。

4.5.实验扩展——printf的测试

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);
}

测试结果如下:
PYNQ上手笔记 | ②PL端和PS端的独立开发_第17张图片

你可能感兴趣的:(#,Pynq/Zynq实战教程,FPGA开发)