体验ARM,裸机输出“Hello World”

体验ARM,裸机输出“Hello World”#

实验VIvado工程为“ps_hello”。

前面的实验都是在PL端进行的,可以看到和普通FPGA开发流程没有任何区别,ZYNQ的主要优势就是FPGA和ARM的合理结合,这对开发人员提出了更高的要求。从本章开始,我们开始使用ARM,也就是我们说的PS,本章我们使用一个简单的串口打印来体验一下Vivado Vitis和PS端的特性。

硬件介绍#

我们从原理图中可以看到ZYNQ芯片分为PL和PS,PS端的IO分配相对是固定的,不能任意分配,而且不需要在Vivado软件里分配管脚,虽然本实验仅仅使用了PS,但是还要建立一个Vivado工程,用来配置PS管脚。

Vivado工程建立#

  1. 创建一个名为“ps_hello”的工程

../_images/image126.png
  1. 点击“Create Block Design”,创建一个Block设计

../_images/image216.png
  1. “Design name”这里不做修改,保持默认“design_1”,这里可以根据需要修改,不过名字要尽量简短,否则在Windows下编译会有问题。

../_images/image313.png
  1. 点击“Add IP”快捷图标

../_images/image48.png
  1. 搜索“zynq”,在搜索结果列表中双击“ZYNQ7 Processing System”

../_images/image58.png
  1. 双击Block图中的“processing_system7_0”,配置相关参数

../_images/image67.png
  1. 在“PS-PL Configuration”选项中展开所以项目

../_images/image77.png
  1. 取消“M AXI GP0 interface”接口,这个接口可以扩展PL端的AXI接口外设,所以PL如果要和PS进行数据交互,都要按照AXI总线协议进行,xilinx为我们提供了大量的AXI接口的IP 核。

../_images/image87.png
  1. 从原理图中我们可以找到串口连接在PS的MIO12-MIO13上,所以在“Peripheral I/O Pins”选项中使能UART1(MIO12-13),Bank 0 电压选择“LVCMOS 3.3V”,Bank 1电压选择“LVCOMS 1.8 V”,本实验仅仅使用了一个串口功能,这里就不再使能其他设备。

../_images/image97.png
  1. 在“Clock Configuration”选项卡中我们可以配置PS时钟输入频率,这里默认是33.333333,和板子上一致,不用修改,CPU频率默认666.666666Mhz,这里也不修改。同时PS还可以给PL端提供4路时钟,频率可以配置,这里不需要,所以保持默认即可。

../_images/image107.png
  1. 在“DDR Configuration”选项卡中可以配置PS端ddr的参数,“Memory Part”选择“MT41J256M16 RE-125”,“Effective DRAM Bus Width”,选择“32 Bit”,到此配置完成,点击“OK”

../_images/image1112.png
  1. 点击“Run Block Automation”,vivado软件会自动完成一些导出端口的任务

../_images/image127.png
  1. 点击“OK”

../_images/image135.png
  1. 点击“OK”以后我们可以看到PS端导出一些管脚,包括DDR还有FIXED_IO,按键“Ctrl + s”保存设计

../_images/image145.png
  1. 选择Block设计,右键“Create HDL Wrapper…”,创建一个Verilog或VHDL文件

../_images/image154.png
  1. 保持默认选项,点击“OK”

../_images/image163.png
  1. 展开设计可以看到PS被当成一个普通IP 来使用。

../_images/image173.png
  1. 选择block设计,右键“Generate Output Products”

../_images/image183.png
  1. 点击“Generate”

../_images/image193.png
  1. 在菜单栏“File -> Export -> Export Hardware…”导出硬件信息,这里就包含了PS了的配置信息。

../_images/image203.png
  1. 在弹出的对话框中点击“next”,因为实验仅仅是使用了PS的串口,不需要PL参与,这里就没有使能“Include bitstream”,继续步骤直到finish。

../_images/image217.png ../_images/image223.png ../_images/image233.png ../_images/image242.png ../_images/image251.png

此时刚刚的路径下就会输出一个xsa文件,这个文件就是这个文件就包含了Vivado硬件设计的信息,供软件开发人员使用。

../_images/image261.png

Vitis调试#

创建Application工程#

  1. Vitis是独立的软件,我们可以通过ToolsLaunch Vitis打开Vitis软件

../_images/image271.png

也可以需要双击Vitis软件打开

../_images/image281.png

选择之前新建的文件夹,点击”Launch”

../_images/image291.png
  1. 启动Vitis之后界面如下,点击“Create Application Project”,这个选项会生成APP工程以及Platfrom工程,Platform工程类似于以前版本的hardware platform,包含了硬件支持的相关文件以及BSP。

../_images/image301.png
  1. 点击Next

../_images/image314.png
  1. 点击“Create a new platform hardware(XSA),软件已经提供了一些板卡的硬件平台,但对于我们自己的硬件平台,可以选择”+”

../_images/image322.png
  1. 选择之前生成的xsa,点击打开

../_images/image332.png
  1. 最下面的Generate boot components选项,如果勾选上,软件会自动生成fsbl工程,我们一般选择默认勾选上。点击Next

../_images/image341.png
  1. 项目名称填入“hello”,也可以根据自己的需要填写,CPU默认选择ps7_cortexa9_0,OS选择standalone,点击Next

../_images/image351.png ../_images/image361.png
  1. 模板选择Hello World,点击Finish

../_images/image371.png
  1. 完成之后可以看到生成了两个工程,一个是硬件平台工程,即之前所说的Platfrom工程,一个是APP工程

../_images/image381.png
  1. 展开Platform工程后可以看到里面包含有BSP工程,以及zynq_fsbl工程(此工程即选择Generate boot components之后的结果),双击platform.spr即可看到Platform对应生成的BSP工程,可以在这里对BSP进行配置。软件开发人员比较清楚,BSP也就是Board Support Package板级支持包的意思,里面包含了开发所需要的驱动文件,用于应用程序开发。可以看到Platform下有多个BSP,这是跟以往的Vitis软件不一样的,其中zynq_fsbl即是fsbl的BSP,standalone on ps7_cortexa9_0即是APP工程的BSP。也可以在Platform里添加BSP,在以后的例程中再讲。

../_images/image391.png
  1. 点开BSP,即可看到工程带有的外设驱动,其中Documentation是xilinx提供的驱动的说明文档,Import Examples是xilinx提供的example工程,加快学习。

../_images/image40.png
  1. 选中APP工程,右键Build Project,或者点击菜单栏的“锤子”按键,进行工程编译

../_images/image411.png
  1. 可以在Console看到编译过程

../_images/image421.png

编译结束,生成elf文件

../_images/image431.png
  1. 连接JTAG线到开发板、UART的USB线到PC

  2. 使用PuTTY软件做为串口终端调试工具,PuTTY是一个免安装的小软件

../_images/image441.png
  1. 选择Serial,Serial line填写COM3,Speed填写115200,COM3串口号根据设备管理器里显示的填写,点击“Open”

../_images/image451.png
  1. 给开发板上电,准备运行程序,开发板出厂时带有程序,这里可以把运行模式选择JTAG模式,然后重新上电。选择“hello”,右键,可以看到很多选项,本实验要用到这里的“Run as”,就是把程序运行起来,“Run as”里又有很对选项,选择第一个“Launch on Hardware(System Debuger)”,使用系统调试,直接运行程序。

../_images/image461.png
  1. 这个时候观察PuTTY软件,即可以看到输出”Hello World”

../_images/image471.png
  1. 为了保证系统的可靠调试,最好是右键“Run As -> Run Configuration…”

../_images/image481.png
  1. 我们可以看一下里面的配置,其中Reset entire system是默认选中的,这是跟以前的Vitis软件不同的。如果系统中还有PL设计,还必须选择“Program FPGA”。

../_images/image49.png
  1. 除了“Run As”,还可以“Debug As”,这样可以设置断点,单步运行

../_images/image50.png
  1. 进入Debug模式

../_images/image511.png
  1. 和其他C语言开发IDE一样,可以逐步运行、设置断点等

../_images/image521.png
  1. 右上角可以切换IDE模式

../_images/image531.png

本章小结#

本章从FPGA工程师和软件工程师两者角度出发,介绍了ZYNQ开发的经典流程,FPGA工程师的主要工作是搭建好硬件平台,提供硬件描述文件xsa给软件工程师,软件工程师在此基础上开发应用程序。本章是一个简单的例子介绍了FPGA和软件工程师协同工作,后续还会牵涉到PS与PL之间的联合调试,较为复杂,也是ZYNQ开发的核心部分。

后续的工程都会以本章节的配置为准,后面不再介绍ZYNQ的基本配置。

千里之行,始于足下,相信经过本章的学习,大家对ZYNQ开发有了基本概念,高楼稳不稳,要看地基打的牢不牢,虽然本章较为简单,但也有很多知识点待诸位慢慢消化。加油!!!