
这个zynq图,可以以您的视角给小白讲讲嘛,这个布局包含哪些硬件,这些硬件用来干嘛的,为什么是这样布局的,我们作为ps端工程师是如何来使用的,讲讲这个ps端是如何工作的,工作原理是什么样子的,谢谢啦,老师,
同学,坐。看到你发来的这张截图,老师心里特别高兴。这张图,就是整个 Zynq 芯片的**"上帝视角"**。
在 FPGA 时代,你是在画一张白纸;但在 Zynq 时代,你是在驾驭一座已经建好的"超级城市"。这张图就是这座城市的规划图。
咱们今天不抠细节,老师用**"一座城市的运作"**作为比喻,带你从上帝视角俯瞰这座城,看看它包含了哪些核心硬件,为什么这么布局,以及作为 PS 端工程师,你到底在扮演什么角色。
🏙️ 第一幕:城市的版图(大块硬件的分布)
你看这张图,其实被切割成了两个世界:
-
左边和中间的一大片(灰底) :这是 PS 端(Processing System)。这是城市的核心区,是纯硬件打造的固定区域(ARM 处理器、DDR控制器、各种外设),买来就造好了,你改不了它的内部结构。
-
右下角的一小块(黄底标着 PL) :这是 PL 端(Programmable Logic)。这是城市的"扩建区",也就是你熟悉的 FPGA,你可以随便写 Verilog 在里面盖房子。
🏘️ 第二幕:城里的核心部门(硬件是用来干嘛的?)
咱们从左到右,看看城市里的核心部门:
1. 城门与海关(I/O Peripherals 和 MIO)
-
看图左侧的绿色方块:SPI、I2C、UART、GPIO、SD、USB、ENET(千兆网口)等等。
-
MIO(Multiplexed I/O):这是芯片的物理引脚。Zynq 把引脚分成了 Bank0(MIO 0-15)和 Bank1(MIO 16-53)。
-
怎么用:这些外设直接连着 MIO。比如你的网线插在板子上,信号直接从引脚进入 ENET 模块。你不需要在 PL 里写以太网 MAC 层,PS 已经自带了。
2. 城市大脑(APU - Application Processor Unit)
-
看图右上方 :里面有两个
ARM Cortex-A9 CPU,还有一个512KB L2 Cache。 -
怎么用:这就是跑你写的 C 代码的地方。它是双核的,可以跑裸机,也可以跑 Linux。它所有的指令都是从内存里取出来,然后在这里执行的。
3. 城市高速公路(Central Interconnect & AXI)
- 看图中间的灰色大方框
Central Interconnect:它连接了 CPU、DDR 内存和各种外设。在软件眼里,这就是 AXI 总线。你在代码里写Xil_Out32(0xE000A000, 1),这个数据就是顺着这条高速公路跑过去的。
4. 最大的仓库(DDR 内存)
-
看图右下角的
DDR2/3, LPDDR2 Controller:它连着芯片外部的那颗内存颗粒。 -
怎么用:这是你跑代码的主战场。你的程序、堆栈、大数组,全部放在这里。
5. 跨城通道(PS-PL Interfaces)
-
看图正下方的几个绿色长条 :
32b GP AXI Master Ports、32b GP AXI Slave Ports、High Performance AXI Ports。 -
怎么用:这是 PS 和 PL(你写的 FPGA 逻辑)唯一的交汇点。CPU 如果想控制你写的 FPGA 模块,或者读取 FPGA 采集的高速数据,就必须通过这几个接口。
🌉 第三幕:为什么是这样布局的?(设计的哲学)
你可能会问,为什么要把这些外设死死地焊在 PS 里,而不像 FPGA 那样让用户自己搭?
-
分工明确:把最基础的、最常用的、对时序和功耗要求极高的通信协议(比如 DDR 控制器、千兆网 MAC、USB 控制器),做成硬核(Silicon)直接固化在芯片里。这样性能最高,还不占用 FPGA 的逻辑资源。
-
软件友好:因为外设位置是固定的,Xilinx 就可以为它们写标准的底层驱动代码(BSP)。你在写 C 代码时,直接调 API 就行,不用管底层引脚是怎么接的。
-
中央调度:所有外设都接到中央互联总线(Central Interconnect)上,CPU(大脑)才能一视同仁地对它们发号施令。
👷 第四幕:作为 PS 端工程师,你是怎么工作的?
好了,主角登场。如果你是 PS 端工程师,你每天在这座城市里干什么?
1. 规划图纸(Vivado 里的 Zynq IP 配置)
在这张图里,你作为工程师,最大的一项权力就是打勾和打叉。
-
你要用网口?你就在 ENET0 那里打个勾。
-
你要用 UART 打印日志?你在 UART1 那里打个勾。
-
你不需要 SPI?你就让它灰着。
你一打勾,Vivado 就会自动分配 MIO 引脚,并告诉你"这个外设的物理地址是哪里"。
2. 疯狂利用外设(写 C 代码)
你拿着 BSP 字典(xparameters.h),发现网口在地址 0xE000B000。你不再去关注底层寄存器怎么翻转,你直接调用 xemac_add(),网口就通了。
3. 跨界指挥(写 PL 驱动)
如果你的项目里,PS 要读取 PL 里一个自己写的"图像处理模块"。你就在 Vivado 里连一个 AXI GP 接口,分配一个地址(比如 0x43C00000)。然后在 C 代码里,你依然用内存映射的方法:value = Xil_In32(0x43C00000);,这样你就把 FPGA 里的数据读到了 ARM 里。
⚙️ 第五幕:PS 端的工作原理是什么样子的?
如果把这张图抽象成软件运行原理,其实就三步:
-
启动:板子上电,CPU(APU)醒来,去外部的 Flash(或者 SD 卡)里找启动代码(FSBL)。
-
找路:FSBL 初始化 DDR 控制器,让内存可用;然后加载你写的 C 程序(ELF)到 DDR 里。
-
执行:
-
CPU 开始执行代码。
-
遇到"读数据"指令,它顺着中央互联总线去 DDR 拿数据。
-
遇到"发数据"指令(比如控制网口发送一个包),它通过中央互联总线,把数据丢进 ENET 的寄存器里。接着,网口的硬件逻辑自动把寄存器里的数据变成网线上的电平。
-
所以你写的代码,本质上就是在"给特定的城市管理部门(外设)写信(写寄存器)"。
💡 老师的总结
同学,看完这张图,你是不是觉得**"PS 端没有那么神秘了"**?
你学 FPGA 时,是在微观世界里搭积木(逻辑门)。现在你学 PS 端,是在宏观世界里当市长(分配资源、发号施令)。
这张图,就是你以后所有工作的"作战地图"。你之前卡在 lwIP 网络通信,其实就是在"ENET0 这个部门"遇到了问题(PHY 芯片不匹配)。
以后每次打开 Vivado,或者遇到看不懂的 PS 代码,就回来看看这张图。想想你的代码,是跑在 APU 里?还是写在 DDR 里?它的数据是顺着哪条总线出去的?想通了这些,你就是真正的 Zynq 系统级工程师了!