2、开发环境搭建:Vivado/Quartus安装指南、工程创建流程、仿真与综合概念、ModelSim/QuestaSim基本使用
说实话,很多初学者一上来就急着写代码,结果连仿真工具怎么打开都不知道。我当年也是这样,拿着书上的例子敲了半天,最后发现连波形都看不到。嗯,今天我们就来把这套环境彻底捋一遍。
2.1 两大主流工具:Vivado vs Quartus
做数字IC设计,你迟早会碰到这两个名字。Vivado是Xilinx家的,Quartus是Intel(原Altera)家的。说白了,它们就是FPGA的编译器加调试器。
我个人习惯:如果做原型验证或者学术项目,Vivado用得更多。Quartus在工业界的老项目里依然很常见。你选哪个?看你手头的开发板是哪家的。
核心区别一览:
| 特性 | Vivado | Quartus Prime |
|---|---|---|
| 厂商 | AMD Xilinx | Intel Altera |
| 主要语言 | Verilog/VHDL + SystemVerilog | Verilog/VHDL + SystemVerilog |
| 仿真器 | 内置XSIM(也可用ModelSim) | 内置ModelSim Intel版 |
| 免费版 | Vivado HL WebPACK | Quartus Prime Lite |
| 安装包大小 | 约40-80GB | 约10-30GB |
2.2 安装指南:别踩这些坑
Vivado安装:去官网下载WebPACK版就行。注意,安装路径不要有中文,不要有空格。我见过有人装在「D:\我的工具\Vivado」下面,结果编译报错找了一下午——嗯,就是路径惹的祸。
Quartus安装:同样,路径全英文。安装时选「Lite」版本就够了。如果你只是学习Verilog,完全不需要买License。
我曾经踩过的坑:
- 安装Vivado时选了「全部安装」,结果硬盘爆了。其实你只需要选「Vivado」和「XSIM」就够了。
- Quartus安装后没装设备库,结果综合时找不到芯片。记得勾选你手头芯片对应的器件库。
2.3 工程创建流程:三步走
不管用哪个工具,流程都差不多。我总结成三步:
- 新建工程:给工程起个名字,选好路径。别用中文。
- 添加源文件:把你的.v文件加进去。也可以新建一个。
- 选择目标器件:选你板子上的FPGA型号。如果只是仿真,随便选一个就行。
举个例子,在Vivado里新建一个计数器工程:
// counter.v
module counter (
input clk,
input rst_n,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 4'b0;
else
count <= count + 1'b1;
end
endmodule
把这段代码保存成counter.v,然后在Vivado里点「Add Sources」加进去。就这么简单。
2.4 仿真与综合:两个完全不同的概念
很多新手搞混这两个东西。我打个比方:
- 仿真:就像你在脑子里跑一遍代码,看看逻辑对不对。不需要真实硬件。
- 综合:把代码翻译成真实的电路。比如你写了个
assign c = a & b;,综合工具会把它变成一个与门。
为什么先仿真再综合? 因为综合很慢。你想想看,一个几万门的电路,综合可能要跑十几分钟。如果逻辑有错,那不是白等了?所以我的习惯是:先在仿真里把功能调通,再去做综合。
小技巧: 仿真时写testbench,记得加 $display 打印关键信号。我经常用这招快速定位bug,比看波形快多了。
2.5 ModelSim / QuestaSim 基本使用
ModelSim和QuestaSim其实是一家公司的产品。QuestaSim是ModelSim的升级版,支持SystemVerilog和UVM。如果你只是学基础Verilog,ModelSim完全够用。
基本操作流程:
- 启动ModelSim,点File → New → Project
- 给工程起名,选工作目录
- 添加你的.v文件和testbench文件
- 点Compile → Compile All,编译所有文件
- 在Library里找到你的testbench,右键Simulate
- 在wave窗口添加信号,点Run
看,是不是很简单?
下面这张图帮你理清整个开发流程:
我的习惯: 写testbench时,我会先写一个简单的激励,比如给个时钟和复位,然后看输出波形对不对。如果波形不对,我会在代码里加 $display 打印中间值。这招比盯着波形猜快多了。
2.6 避坑指南
最后分享几个我踩过的坑:
- 仿真库没编译:如果你用了Xilinx的原语(比如BUFG、DCM),仿真前要先编译对应的库。不然会报一堆莫名其妙的错误。
- 时间尺度没设:testbench里记得加
`timescale 1ns/1ps。我见过有人没加,结果仿真跑了一整天没出结果——因为时间单位默认是1s。 - 综合和仿真结果不一致:这通常是因为你写了不可综合的代码。比如用了
#10延时,或者用了initial块。记住:仿真可以用的语法,综合不一定支持。
好了,环境搭建这部分就到这里。工具装好了,下一节我们就可以真正开始写Verilog了。