第四章:FPGA开发环境搭建
说实话,很多初学者把FPGA开发想得太复杂了。其实说白了,开发环境搭建就是三件事:装软件、建工程、跑仿真。我这些年带过不少新人,发现90%的问题都出在环境配置上。今天我就把Vivado和Quartus的安装要点、工程创建流程、还有仿真工具的使用,一次性给你讲透。
4.1 Vivado与Quartus安装:选对版本很重要
先说说Vivado。Xilinx家的工具,我个人习惯用Vivado 2020.1以后的版本。为什么?因为2020.1开始支持Windows和Linux双平台,而且对Python脚本的支持更完善了。我在项目中遇到过用Vivado 2018.2编译一个大型工程,结果综合到一半就崩了——后来升级到2020.1就没事了。
Quartus这边,Intel/Altera的工具。如果你用的是Cyclone IV或更老的器件,Quartus 13.1是经典版本。但如果你用Arria 10或Stratix V,建议上Quartus Prime Pro 20.1以上。嗯,这里要注意:Quartus的Web版和订阅版功能差别很大,Web版不支持部分高级IP核。
| 工具 | 推荐版本 | 适用器件 | 安装大小 |
|---|---|---|---|
| Vivado | 2020.1 ~ 2022.2 | 7系列、UltraScale+ | 约40GB |
| Quartus Prime | 20.1 ~ 22.1 | Cyclone V、Arria 10 | 约25GB |
| ModelSim | 2020.4 | 通用 | 约5GB |
| VCS | 2021.12 | 通用 | 约15GB |
4.2 工程创建流程:从零到第一个LED闪烁
你想想看,FPGA开发的第一步是什么?不是写代码,而是建工程。我见过太多人一上来就写RTL,结果综合时发现器件选错了、约束没加、IP核版本不对——全白干。
Vivado的工程创建流程,我总结成四步:
- 选器件:根据你的开发板型号,在Device Family里找到对应器件。比如Xilinx的XC7Z020-1CLG484C,每个字符都有含义——Z代表Zynq系列,020是型号,1是速度等级,CLG484是封装。
- 加源文件:把写好的.v文件加进去。我个人习惯把设计文件和仿真文件分开目录存放,比如src/和sim/。
- 加约束:.xdc文件里写引脚分配和时序约束。这里有个坑:Vivado的约束文件是顺序执行的,后面的约束会覆盖前面的。
- 跑综合:点Synthesis,等几分钟。如果报错,先看Critical Warning,别被普通Warning吓到。
Quartus的流程类似,但有个区别:Quartus的工程文件是.qpf,而Vivado是.xpr。另外Quartus的Assignment Editor用来分配引脚,比Vivado的I/O Planning更直观一些。
4.3 仿真工具使用:ModelSim与VCS实战
仿真,说白了就是让你的RTL代码先跑一遍,看看逻辑对不对。我刚开始做FPGA时,总觉得仿真浪费时间,直接上板调。结果呢?一个简单的计数器溢出问题,在板子上调了三天。后来学乖了,先仿真再上板,效率翻倍。
4.3.1 ModelSim:最常用的仿真器
ModelSim是Mentor家的产品,也是Vivado和Quartus自带的仿真器。我个人习惯用独立安装的ModelSim,因为自带的版本功能受限,比如不支持SystemVerilog的某些特性。
一个典型的仿真流程:
// 1. 编译设计文件
vlog -work work src/top.v
vlog -work work src/udp_parser.v
// 2. 编译测试平台
vlog -work work sim/tb_top.v
// 3. 启动仿真
vsim -voptargs=+acc work.tb_top
// 4. 添加波形
add wave -r sim:/tb_top/*
// 5. 运行仿真
run 100 us
嗯,这里要注意:-voptargs=+acc这个参数很重要。不加的话,有些内部信号在波形里看不到。我曾经因为这个参数没加,查了半天bug,结果发现信号根本没被记录。
do run.do,省时省力。我现在的项目都标配一个run.do和一个wave.do。
4.3.2 VCS:工业级仿真器
VCS是Synopsys家的,主要用于ASIC设计,但FPGA开发也能用。说实话,VCS的仿真速度比ModelSim快不少,尤其是大型工程。我在项目中用过VCS跑一个包含DDR控制器和PCIe核的工程,ModelSim要跑2小时,VCS只要40分钟。
VCS的使用命令:
// 1. 编译
vcs -full64 -sverilog -debug_access+all \
-f filelist.f \
-l compile.log
// 2. 运行仿真
./simv -l run.log
// 3. 查看波形
dve -vpd vcdplus.vpd &
为什么用VCS?因为它的编译优化做得更好。VCS会把RTL代码编译成C代码,然后生成可执行文件。而ModelSim是解释执行的。你想想看,编译成C代码再运行,速度能不快吗?
4.4 本章知识体系
下面这张图,是我自己画的FPGA开发环境搭建的知识体系。你可以把它当成一张地图,每次遇到问题就回来看看。
4.5 常见问题与避坑指南
最后,我把自己这些年踩过的坑整理一下,你遇到了直接对照着查:
- Vivado综合报错"CRITICAL WARNING":先检查约束文件里的引脚分配是否和原理图一致。我曾经把时钟引脚分配到了普通IO上,综合能过,但实现时报错。
- ModelSim仿真看不到信号:检查是否加了
-voptargs=+acc参数。另外,确认你的testbench里有没有实例化DUT。 - Quartus编译报错"Error (12007)":通常是IP核版本不匹配。把IP核重新生成一遍就好了。
- VCS编译报错"Unknown identifier":检查filelist.f文件里的路径是否正确。VCS对路径大小写敏感。
好了,环境搭建这部分就讲到这里。你把这些内容消化掉,后面写UDP解析引擎的时候,就不会被工具问题绊住脚了。
公众号:蓝海资料掘金营,微信deep3321