前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PYNQ上手笔记 | ②PL端和PS端的独立开发

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

作者头像
Mculover666
发布2020-07-15 17:35:12
2.2K0
发布2020-07-15 17:35:12
举报
文章被收录于专栏:TencentOS-tinyTencentOS-tiny

在上一篇中提到,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在嵌入式开发中是一个很常用的函数,通过如下代码进行测试:

代码语言:javascript
复制
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);
}

测试结果如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Zynq的架构
  • 2.获取Pynq-Z2开发板资料
  • 3.Zynq中PL端的独立运行
  • 3.1.实验目标
  • 3.2.实验步骤
  • 3.2.1.引脚约束
  • 3.2.2.下载比特流
  • 3.3.实验现象
  • 3.3.实验总结
  • 3.4.实验扩展
    • 4.Zynq中PS端独立运行
      • 4.2.1.1.添加board file文件
      • 4.2.1.2.新建基于Pynq-Z2开发板的工程
  • 4.1.实验目标
  • 4.2.实验流程
  • 4.2.1.使用Boardfile新建Vivado工程
  • 4.2.2.创建Block Design,添加IP,vivado自动导出端口
  • 4.3.实验结果
  • 4.3.1.SDK Terminal
  • 4.3.2.外部串口终端
  • 4.4.实验总结
  • 4.5.实验扩展——printf的测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档