ZYNQ的ARM侧基础学习_Part1
1 初始Vitis
前面应该学习过ZYNQ的PL端的开发,还不涉及PS端。ZYNQ实际上是以PS端为核心,PL端呢作为它的外设,来去比方说做一个硬件加速了或者是对PS端做一个外设的扩展,那么要学习ZYNQ,一定是要学习PS端开发的。
前面所学的FPGA开发是通过Verilog语言,是偏底层硬件的开发和设计。而这里所学习的一个Vitis软件是开发它的PS端,使用C或者是C++。
另外需要说明的是,ZYNQ是PS+PL,而这个MPSoC也是PS+PL,他们只不过是ARM处理器以及PL端的一些资源等等有些差异,但他们的开发很类似,所以说下面的教程以ZYNQ为主要目标来去讲解,那么针对它们的差异地方也会去做一些说明。
1.1 Vitis是什么
AMD Vitis软件平台是一款开发环境,主要用于开发包括FPGA架构,ARM处理器子系统和AI引擎在内的设计。Vitis 工具与Vivado设计套件相结合,可以为开发提供更高层次的抽象设计。
说起这个Vitis,如果之前看过比较旧一点的资料的话,会发现它的一个嵌入式裸机开发工具是SDK,那么这个软件在升级之后就叫Vitis了。其实他俩开发方式有很多类似的地方,像这个SDK呢,它原来是集成在*Vivado* 软件当中的,而后面这个SDK独立出来了,那么也就叫Vitis。
1.2 为什么学习Vitis
目的:为了发挥出ZYNQ/MPSoC软硬件协同设计的优势。
因为ZYNQ包含PS和PL的,并且以PS为核心,他俩是通过AXI接口进行互联的。在很多的使用场景中,用全FPGA不好实现,而用纯软件呢也不好实现,所以就需要他俩结合到一起。
那么在学习Vitis的时候,一方面学习他的PS开发,另一方面也是学习PS跟PL他俩是怎么协同设计的。
1.3 嵌入式系统的开发流程
上图是嵌入式部分的流程图。首先第一步就是创建Vivado工程,这个过程呢其实就跟我们前面做FPGA开发是一样的,就是通过Vivado软件创建一个工程。在创建好之后,就需要来去使用IP的集成器来创建一个PS系统,这个IP集成器是塞灵斯提供了的一个工具,在里面可以调用用赛灵斯的官方的IP核,然后像搭积木一样的方式去搭建整个系统.
接下来是生成这个顶层的HDL,就是说我们通过这个软件呢来去创建一个顶层的模块,对前面所搭建的系统进行例化。那么接下来就是生成比特流然后把硬件导出,可以发现这个生成比特流打了个括号,意思是它是一个可选的,如果这个系统只有PS端,那么是没有必要生成这个比特流(也生成不了,因为里面是没有包含PL端的,因为比特流实际上是PL端的一个配置文件,如果说这个系统里面包含了PL,那么你在后面导出硬件之前就要生成比特流文件)。
接下来就进入Vitis的一个开发了,它是基于前面所搭建的硬件平台进行一个开发,那么最后就是进行板级验证。
1.4 ZYNQ/MPSoC最小系统
下面再来看一下ZYNQ的一个最小系统,下图是给出了ZYNQ的一个最小系统(ZYNQ的最小系统只包含了PS,不包含PL):
最小系统这里给出了两个条件:① 它是系统正常工作的最小条件;② 它是其他系统建立的基础。
最小系统中,至少包含一个ARM A9处理器,然后它还有一个DDR3存储控制器,与外部的DDR3存储芯片连接,程序是要运行在这个DDDR3上面的,另外有一些数据也可以存储在里面。接着还需要一个UART控制器,它通过MIO外设接到了USB_UART。那么为什么需要这个串口呢?其实大家如果说按照我们的文档操作的话呢,应该是所有历程都会包含这个UART,这个UART在我们后面开发过程当中会比较频繁的用到,可以通过它打印一些信息。
另外还有一点需要跟大家强调一下,这个DDR3控制器它并不是必须的,因为也可以把程序运行在这个OCM(片上存储器)里面,只不过这种程序运行在OCM上不典型,那么为什么不典型呢?主要是他的这个存储容量比较小,跟外置的DDR3肯定没法比。
1.5 参考资料
- 正点原子文档:
- 嵌入式Vitis开发指南
- Xiinx官方手册:
- Zynq-7000 SoC技术参考手册(UG585)
- Zynq UIltraScale+技术参考手册(UG1085)
2 HelloWorld-ZYNQ最小系统搭建
2.1 创建Vivado工程
然后,会让你选择工程所在的路径。然后起一个工程名,这里就叫Hello_world。注意要选择Creat project subdirectory,让Vivado帮助我们管理工程目录。
然后选择创建RTL工程,注意选择Do not specify at this time,也就是我们在创建工程过程中不指定RTL文件。
然后点击下一步,选择开发板上的芯片型号。点击完成。
双击ZYNQ打开PS端的配置:
首先是DDR配置:
接着是串口UART配置:
方法1,如下图所示:
方法2:如下图所示
配置串口的参数:












