跳转到主要内容

PYNQ上手笔记(2)——PL端和PS端的独立开发

judy 提交于

<font color="#FF8000">作者:Mculover666</font>

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

1.Zynq的架构
在开始实验之前对Zynq芯片有一个基本的认识,如果想深入了解关于Zynq的理论部分,推荐参考The Zynq Book,有英文版和中文版,在此对于Zynq的理论浅尝辄止,不做深究,重点放在实验应用上。

Zynq中包含两大功能块:PS部分和PL部分。

<li>PS部分指Processing System,一个基于双ARM Cortex A9内核的处理系统,其中集成了内存存储器和外部存储器接口,大量的外设:GPIO、UART、SD/SDIO、IIC、SPI、以太网、CAN等等接口;</li>

<li>PL部分指Programmable Logic,基于Xilinx 7系列架构的可编程逻辑单元,通过PL部分可以为ARM定制很多外设,这也是Zynq的一大优点。</li>

Zynq中虽然包含PS端和PL端,但是整个设计是以ARM处理器为中心的,PS端的ARM内核可以独立于PL端运行,值得注意的是,虽然PL端也可以独立于PS端运行,但是PL的配置是由PS端完成的,所以不能采用传统的固化FLASH的方式固化PL端程序。
PS端和PL端通信是通过AXI接口协议连接,这个协议是AMBA的一部分,是一种高性能、高带宽、低延迟的片内总线,对这个总线不用进行太深的研究,在后续的实验中可以看到,Xilinx已经提供了大量的关于AXI总线ip核供我们调用。

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

<p>实验所需Pynq-Z2开发板的全部资料都可以在<a href="http://www.tul.com.tw/ProductsPYNQ-Z2.html">TUL官网</a>下载到:</p>
<ul>
<li><a href="http://www.tul.com.tw/download/PYNQ-Z2_PA_v3.pdf">TUL PYNQ-Z2产品公告(PDF)</a></li>
<li><a href="https://d2m32eurp10079.cloudfront.net/Download/pynqz2_user_manual_v1_0…(PDF)</a></li>
<li><a href="http://www.tul.com.tw/download/TUL_PYNQ%20Schematic_R12.pdf">原理图(PDF)</a></li>
<li><a href="http://www.tul.com.tw/download/pynq-z2.zip">Board files</a><br />
Board file包含了Pynq-Z2开发板上PS端所有的配置,用法在PS独立实验中提及。</li>
<li><a href="http://www.tul.com.tw/download/pynq-z2_v1.0.xdc.zip">XDC 约束文件</a></li>

3.Zynq中PL端的独立运行
3.1.实验目标
配置PL端使板载4个LED闪烁

3.2.实验步骤
实验具体步骤参考 <a href="https://download.csdn.net/download/mculover666/10719382&quot; rel="nofollow" target="_blank">ALINX_ZYNQ开发平台基础教程V1.02</a> 第四章:PL的&ldquo;Hello World&rdquo;LED实验,需要注意的有以下几点:

3.2.1.引脚约束
首先新建一个引脚约束文件后,将之前所下载的Pynq-Z2开发板的引脚约束文件中的内容拷贝过来,将led和时钟相关内容取消注释,注意端口名称要对应:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

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

3.3.实验现象
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

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

3.4.实验扩展
<li>驱动板载的两颗RGBled</li>
<li>ip核的使用</li>

4.Zynq中PS端独立运行
4.1.实验目标
独立运行PS端,通过USB线连接的UART0串口()输出“Hello, world! ”

4.2.实验流程
实验具体步骤参考 <a href="https://download.csdn.net/download/mculover666/10719382&quot; rel="nofollow" target="_blank">ALINX_ZYNQ开发平台基础教程V1.02</a> 第六章:体验ARM,裸机输出&ldquo;Hello World&rdquo;实验 ,需要注意的有以下几点:

4.2.1.使用Boardfile新建Vivado工程
在第2节中获取Pynq-Z2开发板的Board file文件,这个文件包含了Pynq-Z2开发板上PS端的所有配置,所以我们接下来添加使用这个文件来代替 <a href="https://download.csdn.net/download/mculover666/10719382&quot; rel="nofollow" target="_blank">ALINX_ZYNQ开发平台基础教程V1.02</a> 中手动配置PS端的过程:

4.2.1.1.添加board file文件
之前下载的boardfile文件夹中包含pynq-z2文件夹,将其复制[vivado安装目录]/2018.1/data/boards/board_parts/zynq目录下,如图:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

4.2.1.2.新建基于Pynq-Z2开发板的工程
所有步骤都和之前新建工程一样,只是在选择Default Part页面不一样,如下:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt="" width="670"></center>

之后会出现开发板相关信息,再次检查是否正确,然后Finish
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt="" width="670"></center>

4.2.2.创建Block Design,添加IP,vivado自动导出端口
创建完Block Design之后,向其中添加zynqIP核,如下图所示,要注意,这个zynqIP核只是一个独立的IP核,并没有进行任何设置和点击,因为工程是基于pynq-z2开发板创建的,已经包含ps端配置信息,所以直接点击Run Block Automation,Vivado就会自动将这个zynqIP和的DDR和FIXED_IO接口与PS端的接口进行对应连接,连接后如图所示,然后保存:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt="" width="670"></center>
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt="" width="670"></center>
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt="" width="670"></center>

自动连接完成之后双击ZynqIP核即可看到所有配置已经自动完成了,我们使用的UART0也已配置完成,这里只是查看,不作任何修改:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt="" width="670"></center>

然后选择Tools -> Validate Design或者按下F6验证设计:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

这是因为之前自动导出端口时只配置了DDR和FIXED_IO,设计里没有使用AXI 接口GP0相关IP核,所以没有自动配置时钟,手动连线:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

再次验证,无错误!

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

4.3.1.SDK Terminal
SDK中自带串口终端,非常方便,点击按钮添加串口
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

运行程序后即可看到结果:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

4.3.2.外部串口终端
此处使用Xshell进行查看:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

4.4.实验总结
Zynq中PS端的使用包含两部分:
<li>硬件设计</li>
<li>软件设计</li>

在设计硬件的时候都是基于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);
}

测试结果如下:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/article/201812/13978-412…; alt=""></center>

原文链接: https://blog.csdn.net/Mculover666/article/details/83033918
<font color="#ec091f">声明:本文由原创博主授权转发,如需转载请联系博主</font>