ZYNQ入门教程:从PS到PL的连接详解
ZYNQ入门教程:从PS到PL的连接详解
ZYNQ是Xilinx公司推出的新一代全可编程片上系统(SoC),它将ARM处理器的软件可编程性与FPGA的硬件可编程性完美结合,为高端嵌入式应用提供了强大的处理能力和灵活性。本文将从嵌入式Linux开发者的视角,详细介绍ZYNQ的基本概念、PS和PL的连接方式、AXI协议以及ZYNQ的开发流程,帮助读者快速入门ZYNQ技术。
从嵌入式Linux到ZYNQ
在嵌入式开发领域,从STM32到NXP iMX6,从裸机开发到Linux操作系统开发,开发者们一直在ARM架构上深耕细作。而ZYNQ的出现,为嵌入式系统开发带来了全新的可能性。ZYNQ本质上是ARM+FPGA的组合,它将双核ARM Cortex-A9处理器与FPGA逻辑部件集成在同一芯片上,通过高效的AXI总线协议实现处理器与可编程逻辑之间的高速通信。
ZYNQ简介
Zynq-7000 All Programmable SoC是Xilinx公司推出的新一代全可编程片上系统。它将处理器的软件可编程性与FPGA的硬件可编程性完美整合,为视频监控、汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供了所需的处理能力与计算性能。
ZYNQ的本质特征是它组合了一个双核ARM Cortex-A9处理器和一个传统的现场可编程门阵列(FPGA)逻辑部件。为了实现ARM处理器和FPGA之间的高速通信和数据交互,需要设计高效的片内高性能处理器与FPGA之间的互联通路。因此,如何设计高效的PL和PS数据交互通路是ZYNQ芯片设计的重中之重,也是产品设计的成败关键之一。
PL简介
PL(Programmable Logic)是ZYNQ中可编程逻辑部分,它允许用户通过编程来设定逻辑功能。PLD(Programmable Logic Device)内部的电路结构可以通过写入编程数据来设置,写入的编程数据还可以擦除重写。
常用的可编程逻辑器件
- CPLD:复杂可编程逻辑器件(Complex Programmable Logic Device)
- FPGA:现场可编程门阵列(Field Programmable Gate Array)
本质差异在于电路结构不同:
- CPLD:基于“乘积项”的与或逻辑阵列
- FPGA:基于“查找表”(LUT,Look UP Table)的CLB阵列
如图就是一个FPGA结构。
PL结构
对照ZYNQ的结构,我们可以看到PL部分的结构主要还是可编程逻辑单元、可编程IO单元等资源。
ZYNQ不同的产品线采用不同的架构:
- Artix™-based devices: Z-7010, Z-7015, and Z-7020
- Kintex™-based devices: Z-7030, Z-7045, and Z-7100
PS简介
PS(Processing System)是ZYNQ中的处理器系统部分,主要包含双核ARM Cortex-A9处理器。在ZYNQ芯片内部用硬件实现了AXI总线协议,包括9个物理接口:
- AXI GP0~AXI GP3
- AXI HP0~AXI HP3
- AXI ACP接口
其中:
- AXI_ACP接口:ARM多核架构下定义的一种接口,中文翻译为加速器一致性端口,用来管理DMA之类的不带缓存的AXI外设,PS端是Slave接口。
- AXI_HP接口:高性能带宽的AXI3.0标准的接口,总共有四个,PL模块作为主设备连接。主要用于PL访问PS上的存储器(DDR和On Chip RAM)。
- AXI_GP接口:通用的AXI接口,总共有四个,包括两个32位主设备接口和两个32位从设备接口。
只有两个AXI GP是Master Port(主机接口),即主机接口具有发起读写的权限,ARM可以利用两个AXI GP主机接口主动访问PL逻辑,其实就是把PL映射到某个地址,读写PL寄存器如同在读写自己的存储器。其余从机接口就属于被动接口,接受来自PL的读写。
AXI协议
AXI(Advanced eXtensible Interface)是Xilinx从6系列的FPGA开始引入的一个接口协议,主要描述了主设备和从设备之间的数据传输方式。在ZYNQ中继续使用,版本是AXI4。
AXI协议主要描述了主设备和从设备之间的数据传输方式,主设备和从设备之间通过握手信号建立连接。当从设备准备好接收数据时,会发出READY信号。当主设备的数据准备好时,会发出和维持VALID信号,表示数据有效。数据只有在VALID和READY信号都有效的时候才开始传输。
在ZYNQ中,支持AXI Lite、AXI4和AXI Stream三种总线:
- AXI-4 Memory Map:存储映射
- AXI-4 Stream:传输大量数据
ZYNQ芯片开发流程
ZYNQ的开发也是先硬件后软件的方法。具体流程如下:
- 在Vivado上新建工程,增加一个嵌入式的源文件。
- 在Vivado里添加和配置PS和PL部分基本的外设,或需要添加自定义的外设。
- 在Vivado里生成顶层HDL文件,并添加约束文件。再编译生成比特流文件(*.bit)。
- 导出硬件信息到SDK软件开发环境,在SDK环境里可以编写一些调试软件验证硬件和软件,结合比特流文件单独调试ZYNQ系统。
- 在SDK里生成FSBL文件。
- 在VMware虚拟机里生成u boot.elf、bootloader镜像。
- 在SDK里通过FSBL文件、比特流文件system.bit和u boot.elf文件生成一个BOOT.bin文件。
- 在VMware里生成Ubuntu的内核镜像文件Zimage和Ubuntu的根文件系统。另外还需要要对FPGA自定义的IP编写驱动。
- 把BOOT、内核、设备树、根文件系统文件放入到SD卡中,启动开发板电源,Linux操作系统会从SD卡里启动。
学习ZYNQ所需技能
学习ZYNQ比学习FPGA、MCU、ARM等传统工具开发要求更高,需要具备以下技能:
软件开发人员:
计算机组成原理
C、C++语言
计算机操作系统
Tcl脚本
良好的英语阅读基础
逻辑开发人员:
计算机组成原理
C语言
数字电路基础
Verilog、VHDL语言
良好的英语阅读基础