3. Vivado IP Integrator 实战:搭建 Zynq 最小系统
好,我们正式开始动手。这一章,我会带你走一遍 Vivado 里 IP Integrator 的完整流程。说白了,就是把你脑子里的硬件架构,用图形化的方式搭出来。我个人觉得,这是从“看代码”到“做系统”最关键的一步。
咱们的目标很明确:添加一个 Zynq Processing System 的 IP 核,配好它必须的 DDR 内存和 UART 串口,最后生成比特流,把硬件信息导出来给 SDK 用。你想想看,这其实就是给 Zynq 芯片“装系统”的第一步。
3.1 创建 Block Design:画布准备好了
打开 Vivado,创建或打开你的工程。在左侧 Flow Navigator 里,找到 IP Integrator,点击 Create Block Design。
给它起个名字,比如 system 或者 zynq_base。嗯,这里要注意,名字里最好不要有中文和空格,不然 Vivado 有时候会闹脾气。我在项目里吃过这个亏,后来就老实了。
点击 OK,你会看到一个空白的画布。这就是我们的“战场”。
3.2 添加 Zynq Processing System IP
在画布上右键,选择 Add IP。在搜索框里输入 Zynq,你会看到 Zynq7 Processing System 这个 IP。双击它,或者拖到画布上。
这时候,画布上会出现一个巨大的方块,上面密密麻麻全是引脚。别慌,这很正常。Zynq PS 内部集成了 ARM 核、内存控制器、各种外设,所以接口自然多。
双击这个 IP 块,进入配置界面。这才是今天的重头戏。
3.3 配置 DDR 内存:给系统安个家
配置界面打开后,默认在 Page Navigator 的 PS-PL Configuration 页面。我们先不看那些花里胡哨的,直接点 DDR Configuration。
这里要选你板子上的 DDR 型号。我用的开发板是 DDR3,具体型号是 MT41J256M16 RE-125。Vivado 里内置了常见型号的库,你直接搜就行。
| 参数项 | 我的配置值 | 说明 |
|---|---|---|
| Memory Type | DDR3 | 选对类型,不然点不亮 |
| Memory Part | MT41J256M16 RE-125 | 根据板子实际型号选 |
| Data Width | 16 Bit | 我板子是 16 位宽 |
| Speed Grade | 800 MHz | DDR 运行频率 |
配置完 DDR,Vivado 会自动帮你算好时序参数。你基本不用动,除非你是内存控制器专家。
3.4 配置 UART 外设:让板子开口说话
接下来,点 I/O Peripherals。这里列出了 PS 端所有可用的外设。我们要找的是 UART。
在 I/O Peripherals 表格里,找到 UART 1(有些板子是 UART 0,看原理图)。把它的 Interface 从 MIO 改成 MIO 10..11 或者你板子对应的引脚。
为什么要改?因为默认的 UART 引脚可能被其他外设占用了。我建议你直接查原理图,找到 UART 的 TX 和 RX 连到了哪个 MIO 引脚上。
- MIO 10:通常作为 UART1_TX
- MIO 11:通常作为 UART1_RX
配置好之后,在 Clock Configuration 里,确保 UART 的时钟是使能的。默认是 50 MHz,够用了。
3.5 自动连线与验证:让 Vivado 帮我们干活
配置完 IP,回到画布。你会看到 Zynq PS 块上还有几个红色的接口没连。别急,Vivado 有个好用的功能。
在顶部工具栏,点击 Run Block Automation。Vivado 会自动帮我们连好 FCLK_CLK0、FCLK_RESET0_N 这些基础信号。
连完之后,再点 Run Connection Automation。它会自动把 S_AXI_HP0 等高速接口连到 PS 上。嗯,这一步很关键,它决定了 PS 和 PL 之间的数据通路。
验证一下:右键点击画布空白处,选择 Validate Design。如果没报错,恭喜你,硬件架构搭好了。
3.6 生成顶层 HDL 与约束
在 Sources 面板里,右键点击你的 Block Design,选择 Create HDL Wrapper。选 Let Vivado manage wrapper and auto-update。这样 Vivado 会帮你生成一个顶层 Verilog 文件,把 IP 核例化好。
然后,我们需要一个约束文件。虽然 Zynq PS 的 MIO 引脚是固定的,但 PL 端的引脚(比如 LED、按键)需要我们自己约束。
创建一个 .xdc 文件,写上你的引脚分配。比如:
set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
这里只是举个例子,具体引脚看你的原理图。
3.7 Generate Bitstream:烧录前的最后一步
在 Flow Navigator 里,点击 Generate Bitstream。Vivado 会开始综合、实现、生成比特流。这个过程根据工程大小,可能需要几分钟到半小时不等。
等进度条跑完,会弹出一个对话框。选 Open Implemented Design,可以看看布局布线的情况。不过我们暂时不需要,直接点 OK 就行。
3.8 导出硬件描述:给 SDK 的“地图”
比特流生成成功后,我们需要把硬件信息导出来,给 Vitis(或者老的 SDK)用。
点击菜单栏 File -> Export -> Export Hardware。勾选 Include bitstream。然后选择一个目录,比如 ./sdk。
Vivado 会生成一个 .xsa 文件(Xilinx Support Archive)。这个文件包含了硬件配置、内存映射、外设地址等信息。说白了,它就是给软件工程师看的地图。
system_wrapper.xsa。这个文件是硬件和软件之间的桥梁,一定要保存好。
3.9 本章知识体系
为了让你更直观地理解整个流程,我画了一张图。你可以看到,从创建 Block Design 到导出 .xsa,每一步都有明确的输入和输出。
这张图清晰地展示了我们今天的操作路径。每一步都环环相扣,缺一不可。
3.10 避坑指南
最后,分享几个我踩过的坑,希望能帮你省点时间。
- DDR 配置错误: 板子点不亮,串口没输出。检查 DDR 型号、位宽、速度等级是否和板子一致。
- UART 引脚冲突: 串口打印乱码或没反应。确认 MIO 引脚没有被其他外设占用。
- 自动连线漏连: 系统跑不起来。手动检查 FCLK_CLK0 和 FCLK_RESET0_N 是否连接。
- 导出时忘记勾选 bitstream: SDK 无法下载程序。导出时一定记得勾选 Include bitstream。