ZYNQ 7000系列PS端裸机学习日志(1)——从经典HelloWorld入门PS开发工作流
在开始之前想要叨叨两句:主播在本科期间学习过一些嵌入式的皮毛,包括stm32等等微控制器的裸机开发到最简单的Linux嵌入式系统开发以及最简单的FPGA开发等等,然而这一切都停留在表面,仅仅只是为了完成一些既定的功能要素或者是课程需要,对于其核心内部原理基本上一概不知,到研究生学习阶段,开始接触了正儿八经的FPGA开发后才开始意识到这些看似平常简单的开发表面下其实大有学问。可以看到,UART的RX
ZYNQ 7000系列PS端裸机学习日志(1)
开坑了!
最近在学习ZYNQ的PS端开发,于是撰写本篇博客用于记录学习历程。
在开始之前想要叨叨两句:主播在本科期间学习过一些嵌入式的皮毛,包括stm32等等微控制器的裸机开发到最简单的Linux嵌入式系统开发以及最简单的FPGA开发等等,然而这一切都停留在表面,仅仅只是为了完成一些既定的功能要素或者是课程需要,对于其核心内部原理基本上一概不知,到研究生学习阶段,开始接触了正儿八经的FPGA开发后才开始意识到这些看似平常简单的开发表面下其实大有学问。于是打算通过这篇博客来记录xilinx体系下ZYNQ芯片的PS端开发流程,加深对嵌入式和FPGA的底层理解!
说到ZYNQ,不得不承认的是,这是一块强大的芯片,在如此低成本和小体积下集成了完整的FPGA+ARM架构,并配套有如此完善强大的开发环境,必须佩服AMD的能力和远见!那么叨叨完毕,开始这一次的分享:ZYNQ PS开发第一课从经典HelloWorld入门PS开发工作流。
HelloWorld——ZYNQ工程范例详解
不同于常规的嵌入式开发,在ZYNQ中开发我们先需要在vivado中进行硬件设计。我们需要在vivado中通过block design的方式例化一个ZYNQ Processing System内核,具体步骤这里省略,但是需要强调的是关于PS核的IP配置。双击打开PS核的IP设置,接下来简要介绍一下大致的配置界面:

在 Zynq Block Design 页面,显示了 Zynq 处理系统(PS)的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。
-
PS-PL Configuration 页面能够配置 PS-PL 接口,包括 AXI、HP 和 ACP 总线接口。
-
Peripheral IO Pins 页面可以为不同的 I/O 外设选择对应的 MIO/EMIO 引脚。
-
MIO Configuration 页面可以为不同的 I/O 外设具体配置 MIO/EMIO 引脚,例如电平标准等。
-
Clock Configuration 页面用来配置 PS 输入时钟、外设时钟,以及 DDR 和 CPU 时钟等。
-
DDR Configuration 页面用于设置 DDR 控制器配置信息。
-
SMC Timing Calculation 页面用于执行 SMC 时序计算。
-
Interrupts 页面用于配置 PS-PL 中断端口。
在本次的Helloworld实验中,我们首先考虑的是需要用到的硬件资源:我们的目的是通过驱动ZYNQ核心的最小可运行单元,并在UART输出Helloworld字段,这里就涉及两个部分:即UART的IO配置和相关的内核资源配置。首先我们看UART的配置:
点击 Peripheral I/O Pins 页面,出现上图 IO 引脚配置界面。PS 和外部设备之间的连接主要是通过复用的输入/输出(Multiplexed Input/Output,MIO)来实现的。这里需要查看一下开发板的原理图,我使用的是微相的Z7-NANO开发板,找到原理图中UART部分的电路连接:
可以看到,UART的RX和TX在BANK500上的MIO14和15引脚上,于是对应在设置页面中配置MIO对应的引脚为UART。


接下来在MIO Configuration中,可以对UART端口的IO STANDARD进行进一步配置:

在PS-PLConfiguration中,可以设置UART的波特率,在 General 目录下,可以看到 UART0的波特率默认是 115200。通过下拉按钮可以选择其他波特率,一般保持默认设置。

到这里,UART的配置结束,接下来还需设置DDR来作为PS端的运行内存。
接下来需要配置PS端时钟。对于 CPU 的时钟、DDR 的时钟以 及其它外设的时钟,我们直接保持默认设置即可。如果想设置成其他的时钟频率,可以在 Requested Frequency 一栏里输入想要的频率,只要保证输入的频率保持在 Range 一栏中的频率范围之内。配置好的选项卡如下图所示:

由于本次的实验我们不需要对PL端的资源进行操作,只需要使用 ZYNQ 中的 PS 端。因此我们将 PS 中与 PL 端交互的接口信号移除。 同样是在 Clock Configuration 页面,展开 PL Fabric Clocks,取消勾选 FCLK_CLK0。另外由于不需要使用AXI设备,需要在当前界面中展开 AXI Non Secure Enablement 下的 GP Master AXI Interface,取消勾选其中的 MAXI GP0 interface。如下图所示:


这样我们的配置就完成了,点击“OK”,保存配置并返回。 在 Diagram 中可以看到 ZYNQ7 Processing System IP 模块发生了变化,可以发现,ZYNQ7 PS模块少了四个接口,这正是因为我们在配置 ZYNQ7 PS 的过程中移除了与 PL 相关的接口信号。接下来点击Run Block Automation,之后 Validate Design。


在弹出的对话框中确认勾选“Let Vivado manage wrapper and auto-update”, 然后点击“OK”。这样我们的硬件设计就创建完成了,对于用到 PL 部分资源的项目需要添加引脚约束并进行综合、实现并生成Bitstream 文件。由于本实验未用到 PL 部分,所以无需上述步骤,可直接导出硬件到 SDK 即可。在菜单栏选择 File > Export > Export hardware。
在弹出的对话框中可以选则是否包含 Bitstream 文件,因为我们没有生成Bitstream 文件,所以不勾选,点击“OK”。到这里,我们就完成了系统硬件部分的设计,接下来需要到 SDK 软件中进行应用程序开发,也就是软件设计部分。点击启动vitis:

关于vitis的工程创建步骤,这里也略过,这里需要指出vitis中的一些文件定义:
- Workspace:vitis的工作目录
- Platform:从xsa硬件描述文件导入到vitis后生成的平台文件
- System:基于Platform创建的系统,可以是裸板(Standalone)也可以附带操作系统
- Domain:我的理解是由于Zynq存在2个A7核,裸板在一个核中可以创建一个Domain,而操作系统需要将两个核作为一个Domain使用
- Application:在System下的应用,一般是c/cpp工程
这里我们使用vitis自带的Helloworld样例工程作为APP PROJECT:

对该工程build后进行运行即可完成Helloworld的实现。这里暂时不分析代码相关的内容,只是提供一个工作流程的示意,接下来我们在后续的文章中在继续分析~
更多推荐



所有评论(0)