嵌入式/SOC开发利器-ZYNQ简介与入门
我的学记|刘航宇的博客

嵌入式/SOC开发利器-ZYNQ简介与入门

刘航宇
2年前发布 /已收录
温馨提示:
本文最后更新于2023年11月19日,已超过493天没有更新,若内容或图片失效,请留言反馈。

ZYNQ是什么?

这是一款由Xilinx公司开发的集成了ARM处理器和FPGA可编程逻辑的片上系统(SoC)芯片。ZYNQ7000有多个型号,根据处理器核心数和FPGA系列的不同,可以应用于多种领域,如图像处理,通信,嵌入式系统等。
ZYNQ中国人读法 “zingke”、“任克”,“Soc”,英文全称叫 System on one Chip ,也就是片上系统的意思。没有微机基础的同学可能不明白什么叫Soc,但是你可以细细琢磨一下,我们的手机和台式电脑的不同,你就可以理解Soc的内含了。
传统计算机是将CPU,内存,GPU,南北桥焊接在印刷电路板上,各个组件之间是分立的。但是Soc则将CPU和各种外设集中到一块芯片上,集合成一个系统,因此像手机这种使用了Soc芯片的这种微机可以做的很轻薄,我们可以说,Soc是未来微机发展的一个趋势,我之前遇见过的像什么全志的A33就是典型的Soc。

ZYNQ为什么厉害

就在于它是一块可编程的Soc。其内部往往有处理器硬核和一些定制外设,并且外设当中有一个很厉害的玩意:PL,即可编程逻辑模块,也就是我们一般意义上的FPGA,所以简单理解ZYNQ就是“ 单片机 + FPGA “,它既可以执行代码程序,也可以实现FPGA。因此我们设计ZYNQ就是在做Soc设计。

ZYNQ的结构

我们先来开一下简化版的模型
图片[1] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
上面的模型细致低展开后就是下图的样子:
图片[2] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
图是 ZYNQ 7000的结构图,大体分为PS(Processing System)和 PL(Programmable Logic)两部分,其中的PS部分主要是由双核APU和外围的一些外设组成,说实话很像单片机的结构,而外围的PL则类似FPGA,并且两者通过AXI接口进行互联以实现功能.
重点介绍一下APU,应用处理单元:Application Processing Unit,位于PS(processing system)中,包括一个单核或者双核的cortex-A9处理器,处理器连接一个512KB的共享L2cache,每个处理器都有一个32KB的高速L1 cache,A9支持虚拟内存和32bit arm 指令。APU中的A9处理器由可配置的MP组成,MP包含SCU(snoop control unit:监控控制单元)单元,这个单元主要负责获取两个处理器的L1 cache和ACP(accelerator coherency port:加速器相关接口) PL的一致性。应用单元还有一个低延迟的片上memory,与L2 cache并行的,ACP(加速器接口)是PL与APU通信接口,该接口是PL作为主机的AXI协议的接口,最多支持64bit位宽,PL通过ACP接口访问L2 cache 和片上memory,同时保持和L1 cache的内存一致性。L2 cache 可以访问 DDR 控制,这个ddr 控制器是专用的,大大降低内存读写的延迟APU 还包括一个32bit的看门狗,一个64bit的全局定时器,APU 架构图如下所示:
图片[3] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客

开发工具

在Vivado 19.2之前,我们开发Zynq需要三样必须的软件:
Vivado
SDK
PetaLinux
其中Vivado用来开发硬件平台,SDK开发软件,PetaLinux则制作配套的Linux系统。可能有些人还有用到HLS ,即VIvado HLS 或者Vitis HLS;其中Vivado HLS 2020.1将是Vivado HLS的最后一个版本,取而代之的是VitisHLS。

到了Vivado 19.2之后,事情发生了变化。为了方便大家理解,我愿意称之这些软件成了为Vitis 家族的各个部分,原来的SDK被Vitis IDE取代,Vivado导出的 .hdf 文件被 .xsa文件代替,用来给vitis平台使用。因此我们需要的开发Zynq 最基本的软件变成了

Vivado
Vitis IDE
PetaLinux
各软件发挥的作用和之前的差不多,不过除了上面提到的四款软件外,Vitis家族还有 Vitis AI 等组件,他们共同组成了所谓的“Vitis™ Unified Software Platform ”,从发展趋势来看,这些开发软件应该会逐步的统一,入门的同学也不会再一头雾水地纠结 Vitis 和 Vivado 的区别和联系了。

ZYNQ开发流程

ZYNQ类似于一个 单片机 + FPGA的结构,其实我觉得如果大家接触过一些 Soc就会更好地理解ZYNQ的作用,就例如全志A33这块Soc,它是一块ASIC,不可以通过编程来对芯片的硬件进行重设计的。
图片[4] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
我们可以看到,灰色部分的外设都是固定的,像什么摄像头接口,什么视频接口都是设计好的,定制化的好处就使得总体比较高效,制造成本也低;但是如果我要运用到其它场景下,比如说我需要多个摄像头,那这块芯片就不再适合了(硬件控制的上限就是前后两颗摄像头)
而ZYNQ的意义相当于只给你定制的蓝色部分,也就是处理器内核,灰色的部分都可以通过FPGA实现,这让电子工程师们可以快速开发出各种各样有针对性的Soc;当然了,看过我第一篇博客的同学都知道,其实固定的硬核不止只有处理器内核,其实还有串口和内存控制器之类的外设,这其实是追寻一种固定和变化之间的平衡。
咱们把话说回ZYNQ的开发上来。
图片[5] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
ZYNQ的开发流程分为硬件和软件两部分,在SDK之前的属于硬件开发,也就是我们常说的PL部分的开发,而SDK后就属于软件部分的开发了,类似单片机,属于PS部分。当然现在最新的Vitis IDE已经取代了SDK,所以后半部分一般在SDK中进行。
PL部分的开发包括对 嵌入式最小系统的构建,以及FPGA外设的设计两个方面。我觉得要转变的一个思维是,我们现在不是在开发一个什么SDRAM控制器,什么IIC协议控制器,我们在开发的是一个小型的微机系统!因此嵌入式最小系统的设计是我们的核心。
首先,在IP INTEGRATOR中我们要创建BLOCK DESIGN。
图片[6] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
IP是用来进行 Embedded System Design ,也就是咱们常说的嵌入式系统设计。也就是咱们上面说的嵌入式最小系统的设计。
图片[7] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
大家可以看到,一个最小的系统其实不需要PL参与的,PL可以作为PS的一个外设使用,或者是自己做自己的事情,仅仅作为一个PL工作。既然是外设,当然是可用可不用的,毕竟咱们有好多的外设可以在Block Design 中直接配置使用,即下图绿色部分。
图片[8] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
配置好嵌入式系统后,咱们根据需要进行PL部分的设计。这里涉及一个问题,那就是PS和PL之间的数据传输方式有哪些:
中断
IO方式:MIO EMIO GPIO
BRAM或FIFO或EMIF
AXI DMA:PS通过AXI-lite向AXI DMA发送指令,AXI DMA通过HP通路和DDR交换数据,PL通过AXI-S读写DMA的数据。
等等。。。
可以看出,其实两个部分的交互方式还是很多的,以后咱们遇到一个说一个。

在Vivado端完成对嵌入式系统的设计后,我们就要进入Vitis IDE 端进行软件的开发。
图片[9] - 嵌入式/SOC开发利器-ZYNQ简介与入门 - 我的学记|刘航宇的博客
Vitis IDE简单来说流程一般是:新建一个工程,选择Platform ,也就是我们之前在Vivado中生成的 XSA文件,然后添加文件,进行开发。我相信使用过Keil 5的同学们应该心中对文件目录结构应该更胸有成竹,Src文件夹中存放的是源文件。
代码编写完之后是编译,编译完就是下载了。不过这里要注意以下,如果我们使用了PL的资源,那么在下载软件编译生成的 elf 文件之前,需要先下载硬件设计过程中生成的 bitstream 文件,对 PL 部分进行配置。
最后就是验证工作了,上述的流程是普通的ZYNQ开发流程;玩的花一点的同学可能是直接上Linux操作系统,这部分等后面我接触到了再说吧!
其实我觉得ZYNQ入门简单,精通的话需要大量的知识储备,但也不是不可能,开发ZYNQ相比于做单片机开发肯定路子会更广一些,向上可以做IC设计,向下嵌入式、单片机什么的工作也能胜任。

© 版权声明
THE END
喜欢就支持一下吧
点赞 2 分享 赞赏
人生缓缓,自有答案
评论 抢沙发
OωO
  • 惊讶
  • 撇嘴
  • 色
  • 发呆
  • 得意
  • 流泪
  • 害羞
  • 闭嘴
  • 睡
  • 大哭
  • 尴尬
  • 发怒
  • 调皮
  • 呲牙
  • 微笑
  • 难过
  • 酷
  • 抓狂
  • 吐
  • 偷笑
  • 可爱
  • 白眼
  • 傲慢
  • 饥饿
  • 困
  • 惊恐
  • 流汗
  • 憨笑
  • 悠闲
  • 奋斗
  • 咒骂
  • 疑问
  • 嘘
  • 晕
  • 折磨
  • 衰
  • 骷髅
  • 敲打
  • 再见
  • 发抖
  • 爱情
  • 跳跳
  • 猪头
  • 拥抱
  • 蛋糕
  • 炸弹
  • 刀
  • 便便
  • 咖啡
  • 玫瑰
  • 凋谢
  • 爱心
  • 心碎
  • 太阳
  • 月亮
  • 赞
  • 踩
  • 握手
  • 胜利
  • 飞吻
  • 怄火
  • 西瓜
  • 冷汗
  • 擦汗
  • 抠鼻
  • 鼓掌
  • 糗大了
  • 坏笑
  • 左哼哼
  • 右哼哼
  • 哈欠
  • 鄙视
  • 委屈
  • 快哭了
  • 阴险
  • 左亲亲
  • 吓
  • 可怜
  • 菜刀
  • 篮球
  • 示爱
  • 抱拳
  • 勾引
  • 拳头
  • 差劲
  • 爱你
  • NO
  • OK
  • 转圈
  • 挥手
  • 鞭炮
  • 喝彩
  • 爆筋
  • 棒棒糖
  • 喝奶
  • 手枪
  • 茶
  • 眨眼睛
  • 泪奔
  • 无奈
  • 卖萌
  • 小纠结
  • 喷血
  • 斜眼笑
  • doge
  • 惊喜
  • 戳一戳
  • 笑哭
  • 我最美
  • 羊驼
  • 幽灵
  • 大笑
  • 不开心
  • 呃
  • 求求
  • 点赞
  • 无聊
  • 托脸
  • 吃
  • 害怕
  • 飙泪
  • 我不看
  • 托腮
  • 啵啵
  • 糊脸
  • 拍头
  • 扯一扯
  • 舔一舔
  • 蹭一蹭
  • 顶呱呱
  • 抱抱
  • 暴击
  • 开枪
  • 撩一撩
  • 拍桌
  • 拍手
  • 干杯
  • 嘲讽
  • 哼
  • 佛系
  • 掐一掐
  • 颤抖
  • 偷看
  • 扇脸
  • 原谅
  • 喷脸
  • 生日快乐
  • 甩头
  • 扔狗
  • 脑阔疼
  • 沧桑
  • 捂脸
  • 辣眼睛
  • 哦哟
  • 头秃
  • 问号脸
  • 暗中观察
  • emm
  • 吃瓜
  • 呵呵哒
  • 我酸了
  • 汪汪
  • 汗
  • 无眼笑
  • 敬礼
  • 狂笑
  • 面无表情
  • 摸鱼
  • 魔鬼笑
  • 哦
  • 请
  • 睁眼
  • 敲开心
  • 让我康康
  • 摸锦鲤
  • 期待
  • 拿到红包
  • 拜谢
  • 元宝
  • 牛啊
  • 胖三斤
  • 好闪
  • 左拜年
  • 右拜年
  • 右亲亲
  • 牛气冲天
  • 喵喵
  • 打call
  • 变形
  • 仔细分析
  • 菜汪
  • 崇拜
  • 比心
  • 庆祝
  • 拒绝
  • 嫌弃
  • 吃糖
  • 惊吓
  • 生气
  • 举牌牌
  • 烟花
  • 虎虎生威
  • 豹富
  • 花朵脸
  • 我想开了
  • 舔屏
  • 打招呼
  • 酸Q
  • 我方了
  • 大怨种
  • 红包多多
  • 你真棒棒
  • 大展宏兔
  • 福萝卜
  • 坚强
  • 贴贴
  • 敲敲
  • 咦
  • 拜托
  • 尊嘟假嘟
  • 耶
  • 666
  • 裂开
  • 骰子
  • 包剪锤
  • 亲亲
  • 狗狗笑哭
  • 好兄弟
  • 狗狗可怜
  • 超级赞
  • 狗狗生气
  • 芒狗
  • 狗狗疑问
  • 奥特笑哭
  • 彩虹
  • 祝贺
  • 冒泡
  • 气呼呼
  • 忙
  • 波波流泪
  • 超级鼓掌
  • 跺脚
  • 嗨
  • 企鹅笑哭
  • 企鹅流泪
  • 真棒
  • 路过
  • emo
  • 企鹅爱心
  • 晚安
  • 太气了
  • 呜呜呜
  • 太好笑
  • 太头疼
  • 太赞了
  • 太头秃
  • 太沧桑
  • 龙年快乐
  • 新年中龙
  • 新年大龙
  • 略略略
  • 狼狗
  • 抛媚眼
  • 超级ok
  • tui
  • 快乐
  • 超级转圈
  • 别说话
  • 出去玩
  • 闪亮登场
  • 好运来
  • 姐是女王
  • 我听听
  • 臭美
  • 送你花花
  • 么么哒
  • 一起嗨
  • 开心
  • 摇起来
  • 划龙舟
经典
emoji
泡泡
阿鲁
颜文字
取消