4. FPGA端开发环境搭建:Vivado工程创建、Block Design设计、IP核封装与集成、硬件导出
好,咱们开始搭建FPGA端的开发环境。这一节,说白了就是让你手里的硬件“活起来”。我见过不少新手,拿到开发板就急着写代码,结果连Vivado的基本操作都没摸透,后面调试起来那叫一个痛苦。所以,咱们一步步来,把地基打牢。
4.1 Vivado工程创建——别小看这一步
打开Vivado,第一件事就是创建工程。我个人习惯用“Quick Start”里的“Create Project”。这里有个坑:工程名和路径不要有中文,空格也最好别用。我曾经有个项目,就因为路径里带了个空格,综合时报了个莫名其妙的错误,查了整整一天。
选芯片型号时,别搞错了。我建议你直接搜具体型号,比如“xc7z020clg400-1”,别只看系列。不同封装的引脚定义差很多,选错了后面改起来很麻烦。
4.2 Block Design设计——图形化搭积木
工程建好后,点“Create Block Design”。这里就是咱们的主战场了。你想想看,用图形化的方式把Zynq的PS(处理器系统)和PL(可编程逻辑)连起来,是不是比写几百行Verilog直观多了?
添加Zynq Processing System IP核时,Vivado会自动弹出配置向导。嗯,这里要注意:默认配置不一定适合你的板子。比如DDR型号、时钟频率、UART引脚分配,这些都得根据你的硬件原理图来改。我习惯先把“Peripheral I/O Pins”里的UART、I2C这些勾上,其他的后面再说。
连线时,Vivado会自动帮你连一些时钟和复位。但别全信它。比如FCLK_CLK0的频率,默认是100MHz,如果你要控制步进电机,可能需要调成50MHz或更低。这个得根据你的电机驱动芯片来定。
4.3 IP核封装与集成——把重复劳动打包
做运动控制,你肯定要写一些自定义的模块,比如PWM发生器、编码器计数器。这些模块如果每次都从头写,太累了。所以,咱们把它们封装成IP核。
在Vivado里,点“Tools”→“Create and Package New IP”。选“Package your current project”,然后选你的RTL文件。这里有个细节:接口类型要选对。如果是简单的控制信号,用“Interface”里的“Simple Bus”就行。如果是高速数据流,建议用AXI4-Stream。
我记得第一次封装IP核时,忘了加中断信号。结果ARM那边轮询读数据,CPU占用率飙到90%。后来加了中断,降到5%不到。所以,如果你的模块需要通知ARM,一定要把中断引脚引出来。
封装好后,在Block Design里右键“Add IP”,搜你的IP名字,就能加进来了。连线时,记得把时钟和复位连上。我见过有人忘了连复位,结果模块一直处于未知状态。
4.4 硬件导出——把设计交给SDK
Block Design画完了,IP核也加好了,接下来就是导出硬件。这一步很简单,但容易出错。
先右键Block Design,选“Generate Output Products”。等它跑完,再点“Create HDL Wrapper”。这里选“Let Vivado manage wrapper and auto-update”,省心。
然后点“Generate Bitstream”。这一步会综合、实现、生成比特流。时间比较长,你可以去喝杯咖啡。但别走太远,万一报错呢?
比特流生成成功后,点“File”→“Export”→“Export Hardware”。记得勾选“Include bitstream”。这样导出的.xsa文件里就包含了FPGA的配置信息。
最后,把.xsa文件拷贝到你的SDK工程目录下。ARM端开发时,就用这个文件来初始化FPGA。
4.5 本章知识体系
下面这张图,帮你理清整个流程的逻辑关系:
这张图把四个步骤串起来了。你跟着箭头走,从创建工程到导出硬件,每一步都有明确的输出。记住,硬件导出不是终点,而是ARM端开发的起点。
4.6 避坑指南
- 版本兼容性: Vivado版本和SDK版本要一致。我曾经用Vivado 2020.2导出硬件,然后用2021.1的SDK打开,结果报了一堆API不兼容的错误。后来老老实实统一版本,问题就没了。
- 比特流生成失败: 如果综合时报“LUT overflow”,说明你的逻辑资源用太多了。要么优化代码,要么换更大规模的芯片。
- Block Design验证: 导出前,点“Validate Design”检查一下。Vivado会告诉你有没有悬空的引脚、没连的时钟。这一步能省掉你后面很多调试时间。
好了,环境搭建就讲到这里。你跟着操作一遍,应该能顺利导出硬件。下一节,咱们就要在ARM端写代码了,到时候会用到这个.xsa文件。