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

作者:Mculover666

在上一篇中提到,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和时钟相关内容取消注释,注意端口名称要对应:


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

      3.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目录下,如图:

      4.2.1.2.新建基于Pynq-Z2开发板的工程
      所有步骤都和之前新建工程一样,只是在选择Default Part页面不一样,如下:

      之后会出现开发板相关信息,再次检查是否正确,然后Finish

      4.2.2.创建Block Design,添加IP,vivado自动导出端口
      创建完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核,所以没有自动配置时钟,手动连线:

      再次验证,无错误!

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

      4.3.1.SDK Terminal
      SDK中自带串口终端,非常方便,点击按钮添加串口


      运行程序后即可看到结果:

      4.3.2.外部串口终端
      此处使用Xshell进行查看:

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

      测试结果如下:

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

    最新文章

    最新文章