3. 硬件平台设计:Block Design基础、AXI总线简介、添加Zynq/MPSoC处理器系统
好,咱们进入第三章。这一章是整个平台工程的基石——硬件平台设计。说白了,就是你要在Vivado里把芯片的“骨架”搭起来。
我个人习惯把这一步叫做“画板子”。不是画PCB,而是画FPGA内部的逻辑连接图。你想想看,一个嵌入式系统,CPU、内存、外设,它们之间怎么通信?靠的就是总线。而在Xilinx的世界里,这个总线叫AXI。
3.1 Block Design 是什么?
Block Design,简称BD。它是Vivado里一个图形化的设计工具。你不需要写一行Verilog,就能把处理器、DMA、GPIO这些IP核拖出来,连上线,配置好参数。
我第一次用BD的时候,心里还犯嘀咕:“这玩意儿靠谱吗?”后来发现,它生成的代码质量,比我手写的强多了。尤其是对于Zynq这种异构芯片,手动例化PS(处理系统)和PL(可编程逻辑)的接口,那叫一个痛苦。BD把这些全封装了。
核心思想:BD是“搭积木”式的设计。你只需要关心IP核之间的连接关系,剩下的时序、地址映射、复位同步,工具帮你搞定。
BD的设计流程大致分三步:
- 创建Block Design:在Vivado里新建一个BD文件。
- 添加IP核:把Zynq PS、AXI GPIO、AXI BRAM Controller等拖进来。
- 自动连线:用“Run Block Automation”和“Run Connection Automation”让工具自动帮你连好。
嗯,这里要注意:自动连线不是万能的。有些特殊接口,比如自定义的AXI Full Master,还是得手动连。但大部分标准外设,自动连线足够了。
3.2 AXI总线简介
AXI,全称Advanced eXtensible Interface。它是ARM公司提出的AMBA总线协议的一部分。Xilinx从7系列开始,全面拥抱AXI。现在你看到的几乎所有IP核,接口都是AXI。
AXI有几种变体,我列个表给你看:
| 类型 | 特点 | 典型用途 |
|---|---|---|
| AXI4 (Full) | 支持突发传输,地址/数据通道分离 | DMA、DDR控制器、高带宽外设 |
| AXI4-Lite | 简化版,不支持突发,单次传输 | 寄存器配置、GPIO、中断控制器 |
| AXI4-Stream | 无地址,纯数据流 | 视频流、FIFO、高速数据采集 |
我在项目中遇到过一个问题:用AXI-Lite去读一个高速ADC的数据,结果发现带宽根本不够。后来换成AXI-Stream,配合DMA,才把数据搬走。所以,选对总线类型很重要。
我的建议:配置寄存器用AXI-Lite,搬数据用AXI-Stream,需要随机访问大容量内存用AXI-Full。别混着用,也别大材小用。
AXI总线的握手信号很简单:VALID和READY。发送方拉高VALID表示数据有效,接收方拉高READY表示可以接收。两者同时为高,一个数据传输完成。这就是所谓的“双向握手机制”。
为什么会这样设计?说白了,就是为了解耦。发送方和接收方可以工作在完全不同的时钟域,只要握手信号满足时序要求就行。
3.3 添加Zynq/MPSoC处理器系统
这是BD设计的核心。Zynq-7000系列和Zynq UltraScale+ MPSoC,它们的PS部分是一个完整的ARM处理器系统。你需要把它“拖”进BD里,然后配置它。
双击Zynq PS IP核,会弹出一个配置界面。这里我重点说几个关键配置:
- PS-PL Configuration:这里决定PS和PL之间有多少个AXI接口、时钟、复位。我一般至少开一个AXI HP(高性能)口和一个AXI GP(通用)口。
- Clock Configuration:PS可以输出多个时钟给PL。比如CPU主频、DDR时钟、外设时钟。记得把PL Fabric Clock勾上,默认是100MHz。
- DDR Configuration:选你的DDR颗粒型号。选错了,板子起不来。我曾经因为DDR型号选错,折腾了两天才发现。
- MIO Configuration:MIO是PS的专用引脚。UART、I2C、SPI、SD卡这些外设,可以分配到MIO上,不占用PL资源。
避坑指南:我曾经在MPSoC上犯过一个低级错误——忘了使能PS的FPD(全功耗域)时钟。结果PL侧的AXI接口死活不工作。后来查手册才发现,FPD时钟是AXI接口的参考时钟。所以,配置完PS后,一定要检查时钟输出是否都使能了。
配置完成后,点击“Run Block Automation”。工具会自动帮你把PS的固定接口(比如DDR、MIO)连到顶层端口上。然后,你再添加一个AXI GPIO或者AXI UART,点击“Run Connection Automation”,工具会自动帮你连到PS的AXI总线上。
最后一步,右键点击BD文件,选择“Create HDL Wrapper”。这会生成一个顶层Verilog文件,把整个BD例化进去。然后你就可以综合、实现、生成比特流了。
3.4 本章知识体系
为了让你更直观地理解本章的逻辑,我画了一张图:
这张图把本章的三个核心模块串起来了。Block Design是工具,AXI是通信协议,Zynq/MPSoC是核心处理器。三者缺一不可。
好了,这一章的内容就到这里。硬件平台搭好了,下一章我们就要开始写软件了。到时候,Vitis会登场,咱们在PS上跑个“Hello World”试试。
课后练习:打开Vivado,创建一个Zynq-7020的BD工程。添加一个AXI GPIO IP核,配置成输出模式。然后生成比特流。看看能不能在板上点亮一个LED。