Xilinx系ZYNQ学习笔记(二)ZYNQ入门

系列文章目录


文章目录


前言

简单入门一下ZYNQ是何种架构,如何编程,至于深入了解应该要分开深入学习Linux和FPGA


简单介绍

其基本架构都是在同一个硅片上集成 FPGA 和 CPU,并通过高速、高带宽的互联架构连接起来。

ARM 的顺序控制、丰富外设,开源驱动、FPGA 的并行运算、高速接口、灵活定制、数字之王的特性交错相融,相得益彰。再加上其内部多条高速桥接总线,使其数据交互链路畅行无阻。

SOPC 和 SoC FPGA 是统一的,都是由 FPGA 和处理器组成。在 SoC FPGA 中,嵌入的是 ARM 公司 32 位的 Cortex-A9 硬核处理器,简称 PS(Processor System)。

而 SOPC 技术中,嵌入的是 Xilinx 自己开发的 32 位MicroBlaze 软核处理器,两者指令集与处理器性能均有差异。Cortex-A9 硬核处理器性能远远高于 MicroBlaze 软核处理器。

Zynq-7000 SoC FPGA 片上的 PS 部分,不仅集成了双核的 Cortex-A9 硬核处理器,还集成了各种高性能外设,如 MMU、DDR3 控制器、NAND FLASH控制器等,有这些外设,PS 部分就可以运行成熟的 Linux 操作系统,提供统一的系统 API,降低开发者的软件开发难度。而 Microblaze 或 NIOS II、Risc-V 软核 CPU 虽然可以通过配置,用逻辑资源来搭建相应的控制器以支持相应功能,但是从性能和开发难度上来说,无法与之媲美。因此,采用基于 SoC FPGA 架构进行设计开发是比较好的选择。

虽然 SoC FPGA 芯片上既包含了有 ARM,又包含了有 FPGA,但是两者一定程度上是相互独立的,SoC 芯片上的 ARM 处理器核并非是包含于FPGA 逻辑单元内部的,而是与 FPGA 一同封装到同一个芯片中,JTAG 接口、电源引脚和外设的接口引脚都是独立的。因此,如果使用 SoC FPGA 芯片进行设计,即使不用片上的 ARM 处理器,ARM 处理器部分占用的芯片资源也无法释放出来,不能用作通用的 FPGA 资源。而 SOPC 则是使用 FPGA 通用逻辑和存储器资源搭建的 CPU,当不使用 CPU 时,CPU 占用的资源可以被释放,重新用作通用 FPGA 资源。

SoC FPGA 芯片上包含现场可编程逻辑门阵列,可以根据实际应用需求设计相应的逻辑电路,FPGA 侧设计的功能电路可以直接连接到 PS 的总线上,从而映射为 PS 的一个外设,由 PS 对其进行读/写操作,该操作就像处理器操作本身片上含有的外设一样简单方便。

例如 S3C2410 处理器的片上 UART 控制器带有 16 个字节的 FIFO 缓冲,但是在某些大数据量的应用中,片上的 UART 控制器不能完全满足要求,需要有更大容量的 FIFO 来满足功能开发需求,此时只能通过软件的方式处理。但SoC FPGA就可以实现64 字节的接/收 FIFO

单独的 FPGA 设计的系统也有其不足之处,由于 FPGA 实现功能都是通过功能固定的逻辑电路实现的,那么当应用中需要灵活的控制和人机交互或者复杂的以太网协议通信时,使用 FPGA 实现就会有较大的难度,即使使用复杂的状态机能够勉强实现功能,也面临着功能固定、修改难度大的问题。例如液晶显示屏绘制波形,或者 TCP/IP 协议传输到远端服务器时,而 ARM 处理器有较大的优势。这些在调试中深有体会,像之前IIC通信,复杂又开发时间长。

我们之前板子用的FPGA+ARM,是电路板连接,各自使用独立器件,相互间的通信速率会有较大的限制,器件间使用高位宽的并行总线,存在竞争冒险(数据位到达时间不一致导致输出异常)的情况,因此数据线翻转速率有较大的限制,通信频率无法做到很高。

而 SoC FPGA使用的是片上集成的方式,在同一个芯片上集成 FPGA 和 PS 系统,两者间通过一种高性能、高带宽、低延迟的片内总线 AXI 连接,为两者通信提供了较高的数据带宽,大大提高了两者的通信带宽和通信效率。

简称

PS:(Processing System),ZYNQ可以大概分为ARM和FPGA两部分,PS就是ARM的SOC部分,是整块板子的处理系统。

PL:(Progarmmable Logic),意为可编程逻辑,也就是ZYNQ上的FPGA部分。

MIO:(Multiuse I/O),多功能IO引脚,如果学过单片机可以把它理解为引脚复用,属于PS部分,也就是ARM部分。值得一提的是,MIO 信号对 PL部分是不可见的,所以对 MIO 的操作可以看作是纯 PS 的操作。

EMIO:(Extendable Multiuse I/O),可拓展多功能IO引脚,依然属于PS部分,但是连接到了PL上,再从PL的引脚连到芯片外面实现数据输入输出。如果MIO不够用的话, PS 可以通过驱动 EMIO 控制 PL 部分的引脚 。EMIO 有 64 个引脚可供我们使用。

APU:(Application Processor Unit),应用处理器单元,曾经AMD公司用它来特指加速处理器(Accelerated Processing Units),但是在ZYNQ上的意思就截然不同,注意区分。APU包含了双ARM-CortexA9核,加上高速缓冲,DMA,定时器,中断控制,浮点和NEON协处理,可以类比51单片机中的MCU,Cortex-M系列的STM32上的MPU来理解。

但是APU这个称呼还是有说法的,没有了M就说明意图摆脱微处理器Micro的名头,换上Application就不简单了,说明在上面可以跑应用程序, 暗示着这个系统是需要全尺寸的操作系统的。

TTC:(Triple Time Counter),直译就是三倍时间计数器,其实是这个计数器内有3个独立通道,可以独立计数。挂在APB上,为系统或外设提供定时或计数服务的。

WDT:看门狗定时器,有两个, 分别监视ARM-Cortex A9用的。 如果软件跑飞,无法清定时器,一段时间后,看门狗就复位。一般没什么用,学STM32时就觉得这功能还挺厉害,能一直监视程序有没有跑飞,后来发现跑飞的几率太小了,现在的板子稳定性都很好,以至于我现在都没见到过看门狗起作用,不过也算是个风险保障。

SWDT:系统级看门狗定时器, 这个看门狗的时钟和复位信号,都可以来自于芯片外部, 这样,即使系统有严重故障,比如时钟频率本身都有问题了,仍然可以通过与系统无关的外部信号计数,计数满就复位。

SCU:(Snoop Control Unit),用来保持双核之间的数据Cache的一致性,两个ARM-Cortex A9,如果一个写存储时只写进缓存,没写进主存,如果第二个A9读操作,涉及到第一个写脏了的数据段, SCU要保证第二个A9的缓存里是最新的数据。 SCU的存在,才使得两个核成互相联系的"双核",才能成为MPsoc。

AHB:Advanced High performance Bus,先进高性能总线,主要用于高性能模块(如CPU、DMA和DSP等)之间的连接

APB:APB(Advanced Peripheral Bus),外围总线的意思。该总线协议是ARM公司提出的AMBA总线结构之一,主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。

xc7z020型号FPGA

xc7z020 芯片有 3 个 IO Bank 设计为了 FPGA 的通用 IO Bank, 为 Bank34、Bank35、Bank13(xc7z010 芯片为两个,Bank34 和 Bank35),总共 125 个可用IO,这些引脚中大部分既可以作为单端输入输出,也可以作为差分输入输出。支持的 IO 电平标准也非常多,从 LVCMOS 1.8V 到 LVCMOS 3.3V 等多种 IO 标准。

其中,有 12 个引脚可以用作全局时钟输入引脚,在 Vivado 软件的 Open Elaborated Design 中,这些引脚以 MRCC 时符号标记

实际使用时,如果是单端时钟信号输入,建议接在以"MRCC"标志标记的引脚上。另外,这些引脚如果不接时钟输入,也可以作为通用的 IO 使用。但是Altera中这些只能当通用输入IO,不能当输出,Xilinx应该类似的吧

同一个 IO Bank 中的 I/O,只能使用同一种电压标准的IO电平。是通过专用的 I/O 电压设置引脚来

设置的。这些引脚的名称为 VCCO_x,其中 x 为对应的 Bank 编号,一般设计原理图时要考虑供电电压。

ZYNQ实操

通用IO

MIO 分配在 GPIO 的 Bank0 和Bank1,属于 PS 部分, 而 EMIO 也是 PS 上 GPIO 的一部分,但连接到了 PL,分配在 GPIO 的 Bank2 和 Bank3。MIO 在芯片外部有 54 个引脚,这些引脚可以用于 GPIO、SPI、UART、USB 等功能上,每个引脚都同时具有多种功能。EMIO 有 64 个引脚, EMIO 与 MIO 的不同在于,EMIO 连接到了 PL,再从 PL 输出信号,而 MIO 直接从 PS 端输出。

一些 IOP(I/O Peripheral)信号仅在 MIO 接口上可用,如 USB 外设信号;一些信号在 MIO 或 EMIO 接口上可用,如 UART 信号;而一些接口信号只能在 EMIO 接口上访问,如 UART的 Modem signals 接口信号。

引脚的分配(路由)必须按组进行,信号不能被分割并路由到不同的 MIO 引脚组。例如,如果 SPI_0_CLK 路由到 MIO 引脚 40,那么 SPI_0 接口的其他信号必须路由到 MIO 引脚 41 ~ 45。

点亮LED灯

硬件逻辑基础

创建图形化设计模块,在里面添加ZYNQ的IP核,双击即可进入IP核设计界面

左侧栏为 zynq IP 核配置的导航窗口,共分为八个部分:

Zynq Block Design: 图形化向导界面,可以快速知道各部分功能使用情况,并能迅速跳转到对应项设置。

PS-PL Configuration: PS-PL 接口配置界面,可以对 AXI,HP,DMA 等总线接口进行配置。

Peripheral I/O Pins: I/O 外设引脚配置界面,可对 I/O 外设引脚进行MIO 以及 EMIO 的配置,配置时需要注意 Bank 电平。

MIO Configuration:MIO 配置界面,相较于 I/O 外设引脚配置界面,功能更为复杂。

Clock Configuration: 时钟配置界面,页面用来配置 PS 输入时钟、外设时钟,以及 DDR 和 CPU 时钟等。

DDR Configuration: DDR 配置界面,控制 DDR 型号以及细节参数等。

SMC Timing Calculation: SMC 时序计算界面,可进行 SMC 时序计算 。

Interrupts: 中断控制界面,可对 PS 与 PL 间的中断进行配置。

PS 端的引脚是固定的,我们不需要分配, PL 端的按键和 led 灯都需要一个 EMIO 信号,因此我们将 EMIO 的位宽设置为 2。设置完成后检查电平状态,将 Bank1 的电平设置为 1.8V。

使能完自己会打勾

还要配置DDR:

DDR 全名为双速率同步动态随机存储器(Double Data Rate Synchronous Dynamic Random Access Memory),也就是我们常说的内存。基于 PS 端的应用,大部分都需要基于片外存储外设 DDR 上运行。因此在使用时,我们需要配置 DDR 型号。

配置完成后多了一个GPIO0

将 IP 核的引脚导出,点击上方的蓝色小字"Run Block Automation",让系统自动帮我们导出引脚。

之后手动到处GPIO0,在导出时,我们也可以先点击选中 IP核,然后右键点击 Make External 或者通过快捷键 Ctrl+T 一次性导出所有引脚。导出的引脚信号也支持重命名,只需点击信号名,然后在左侧的"External Interface Propetirs"栏内的"Name"修改即可

FCLK_RESET0_N:全局复位信号,低电平有效。

M_AXI_GPIO:通用 AXI 接口信号,M 代表其作为主机信号。

M_AXI_GPIO_ACLK:M_AXI_GPIO 的输入时钟信号。

FCLK_CLK0:PS 输出时钟信号。

M_AXI_GPIO_ACLK 虽然本次设计并未使用到,但是如果不给其一个输入信号,软件便会报错。为了防止出现该现象,我们只需将 FCLK_CLK0和 M_AXI_GPIO_ACLK 连接即可。之后验证

生成封装:



system_wrapper.v 文件为顶层例化文件,在用户修改设计并生成输出后,只要更新 Wrapper,system_wrapper.v 中的内容便会被覆盖。建议用户手动创建一个顶层文件,在文件中例化 system_wrapper.v文件,并添加自己的逻辑代码。

根据硬件进行分配引脚,这里分配了一个LED和按键的引脚

之后生成比特流就行,点击"Generate Bitstream"开始生成比特流

之后"File- Export-Export Hardware...",导出硬件,因为涉及到PL端,勾选比特流

对于纯 PS 端的设计,用户在导出时无论是否勾选包含比特流都是可以的。

之后打开SDK,2020版本集成到visit IDE中

browser里面选择刚刚生成的文件.xsa

之后在File里面新建一个application应用,用我们的硬件逻辑来编程

因为我们前面没有配置串口,所以一般选的hello world也选不了,就选个空应用

接下来就是移植库的操作,写自己的main函数

相关推荐
Diamond技术流5 分钟前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
DS小龙哥6 分钟前
基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
fpga开发·sd nand·雷龙·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
密码小丑6 分钟前
11月4日(内网横向移动(一))
笔记
斑布斑布8 分钟前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
鸭鸭梨吖1 小时前
产品经理笔记
笔记·产品经理
Chef_Chen1 小时前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!2 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚2 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea