3. FPGA开发环境搭建:Vivado/Quartus安装、License配置、第一个LED闪烁工程、硬件描述语言仿真基础
好,咱们正式开始动手了。这一章我带你搭环境、跑第一个工程、做仿真。说白了,就是让你把FPGA开发的基础工具链跑通。我见过太多新手卡在安装和License上,一卡就是半天。别急,咱们一步步来。
本章核心目标:装好Vivado或Quartus,配好License,跑通LED闪烁,学会仿真。做完这些,你就有了一个能用的FPGA开发环境。
3.1 开发工具选型:Vivado vs Quartus
做FPGA开发,你绕不开两个大厂:Xilinx(现在叫AMD)和Intel(原Altera)。对应的工具就是Vivado和Quartus。我个人习惯两个都装,但如果你刚入门,选一个就行。
| 对比项 | Vivado(Xilinx/AMD) | Quartus(Intel) |
|---|---|---|
| 适用芯片 | Artix、Kintex、Virtex、Zynq等 | Cyclone、Arria、Stratix、MAX等 |
| 安装包大小 | 约30-50GB(WebPack版小一些) | 约15-25GB(Lite版) |
| License | 免费WebPack版够用,Node-locked需申请 | 免费Lite版够用,Pro版需购买 |
| 仿真器 | 内置Vivado Simulator(XSim) | 内置ModelSim Intel版 |
| 上手难度 | 稍复杂,但功能强大 | 相对友好,文档清晰 |
怎么选?如果你学校或公司用Xilinx的板子,那就装Vivado。如果是Intel的板子,装Quartus。我当年在学校用的是Xilinx Spartan-6,所以第一个接触的是ISE(Vivado的前身)。嗯,暴露年龄了。
3.2 Vivado安装与License配置
咱们以Vivado 2023.1为例。安装过程其实不复杂,但有几个坑要注意。
3.2.1 下载与安装
- 去官网下载:AMD官网 -> 支持 -> Vivado。选WebPack版,免费。
- 安装路径:不要有中文!不要有空格!我习惯装到
C:\Xilinx\Vivado\2023.1。 - 选择组件:勾选Vivado HL WebPACK、Vivado Simulator。如果你有开发板,勾上对应的Board Files。
- 安装时间:大概30分钟到1小时。去喝杯咖啡吧。
注意:安装过程中会提示安装Cable Drivers(下载器驱动)。一定要勾上!否则你连不上板子。我曾经有一次忘了勾,折腾了半天才发现驱动没装。
3.2.2 License配置
Vivado的License分两种:Node-locked(绑定电脑)和Floating(浮动)。个人用户用Node-locked就够了。
- 申请免费License:去AMD官网注册账号,在License管理页面申请Vivado WebPack License。免费,永久有效。
- 下载License文件:会得到一个
.lic文件。 - 加载License:打开Vivado -> Help -> Manage License -> Load License。选择你的
.lic文件。 - 验证:在License管理界面看到 "Vivado WebPACK" 状态为 "Valid" 就OK了。
小技巧:如果你在公司内网,可能要用Floating License。这时候需要配置LM_LICENSE_FILE环境变量。我建议把License文件放到 C:\Xilinx\license.lic,然后在系统环境变量里加上 LM_LICENSE_FILE=C:\Xilinx\license.lic。这样Vivado和Vitis都能识别。
3.3 Quartus安装与License配置
Quartus的安装相对简单。以Quartus Prime Lite 23.1为例。
3.3.1 下载与安装
- 去Intel官网下载:搜索Quartus Prime Lite Edition,免费。
- 安装路径:同样不要中文。我习惯
C:\intelFPGA_lite\23.1。 - 选择组件:勾选Quartus Prime Lite Edition、ModelSim Intel FPGA Edition。如果你有开发板,勾上对应的Device Support。
- 安装时间:比Vivado快一些,大概20-40分钟。
3.3.2 License配置
Quartus Lite版不需要License!直接就能用。但如果你用Pro版,需要购买License。
重要:Quartus Lite版虽然免费,但支持的芯片有限(主要是Cyclone系列和MAX系列)。如果你用Arria或Stratix,必须用Pro版。我建议初学者先用Lite版,配一块Cyclone IV或Cyclone V的开发板,性价比很高。
3.4 第一个LED闪烁工程
好了,环境搭好了。咱们来跑第一个工程。这是FPGA界的"Hello World"——LED闪烁。我用Vivado演示,Quartus流程类似。
3.4.1 创建工程
- 打开Vivado -> Quick Start -> Create Project。
- 工程名:
led_blink,路径不要有中文。 - 选择RTL Project,勾上"Do not specify sources at this time"。
- 选择芯片:我用的板子是Artix-7(XC7A35T),你也可以选你的板子型号。
- Finish。
3.4.2 编写Verilog代码
在工程里新建一个设计源文件:led_blink.v。代码如下:
module led_blink (
input wire clk, // 50MHz 时钟
input wire rst_n, // 复位,低有效
output reg [3:0] led // 4个LED
);
// 计数器:50MHz时钟,计到25_000_000就是0.5秒
reg [24:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 25'd0;
else if (cnt == 25'd24_999_999)
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
end
// LED翻转
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
led <= 4'b0001; // 初始只有LED0亮
else if (cnt == 25'd24_999_999)
led <= {led[2:0], led[3]}; // 循环左移
end
endmodule
这段代码很简单:每0.5秒,LED状态循环左移一次。你想想看,4个LED就会像跑马灯一样轮流亮。
3.4.3 添加约束文件
新建一个约束文件 led_blink.xdc:
# 时钟引脚
set_property PACKAGE_PIN R4 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
# 复位引脚
set_property PACKAGE_PIN U1 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
# LED引脚
set_property PACKAGE_PIN T1 [get_ports {led[0]}]
set_property PACKAGE_PIN T2 [get_ports {led[1]}]
set_property PACKAGE_PIN T3 [get_ports {led[2]}]
set_property PACKAGE_PIN T4 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]
引脚分配要根据你的开发板原理图来。我这里的引脚是随便写的,你千万别照抄。
3.4.4 综合、实现、生成比特流
- 点击 "Run Synthesis"(综合)。等几分钟。
- 综合完成后,点击 "Run Implementation"(实现)。
- 实现完成后,点击 "Generate Bitstream"(生成比特流)。
- 连接开发板,点击 "Open Hardware Manager" -> "Auto Connect" -> "Program Device"。
看到LED闪烁了吗?如果没亮,检查一下引脚分配和复位信号。我遇到过最坑的一次是复位引脚焊错了,折腾了一下午。
避坑指南:如果你用的是开发板,记得检查板上的时钟频率。很多板子用50MHz,但也有用100MHz或12MHz的。计数器上限要对应调整。我曾经帮一个学生调工程,他板子是12MHz,代码里写的50MHz,LED闪得飞快,根本看不清。
3.5 硬件描述语言仿真基础
仿真,说白了就是不用板子也能看波形。我建议你养成"先仿真后上板"的习惯。为什么?因为上板调试太慢了,改一次代码要综合实现十几分钟。仿真几秒钟就能看到结果。
3.5.1 编写Testbench
在Vivado里新建一个仿真源文件 tb_led_blink.v:
`timescale 1ns / 1ps
module tb_led_blink;
reg clk;
reg rst_n;
wire [3:0] led;
// 实例化待测模块
led_blink uut (
.clk (clk),
.rst_n (rst_n),
.led (led)
);
// 生成时钟:50MHz -> 周期20ns
initial begin
clk = 0;
forever #10 clk = ~clk; // 每10ns翻转一次
end
// 生成复位信号
initial begin
rst_n = 0;
#100;
rst_n = 1; // 100ns后释放复位
end
// 仿真结束
initial begin
#2000; // 仿真2us
$finish;
end
endmodule
3.5.2 运行仿真
- 在Vivado左侧Flow Navigator中,点击 "Run Simulation" -> "Run Behavioral Simulation"。
- 等待仿真器启动,你会看到波形窗口。
- 在波形窗口里,把
led信号拖进去,设置显示格式为Hexadecimal。 - 点击 "Run All" 运行2us,然后点 "Zoom Fit"。
你会看到 led 信号每500ms变化一次(因为计数器计到25_000_000需要500ms)。嗯,仿真里500ms太长了,你可以把计数器上限改小一点,比如改成25,这样每1us就能看到LED变化。
仿真技巧:调试时,我习惯把计数器上限改小1000倍,这样仿真时间从毫秒级降到微秒级。等逻辑验证通过了,再改回真实值去上板。这叫"时间缩放法",做量化交易系统时也常用——把微秒级的交易信号放大到毫秒级来调试。
3.5.3 常见仿真错误
- 波形全是X或Z:说明复位没处理好。检查rst_n信号。
- 波形不变:时钟没生成。检查forever语句。
- 仿真卡死:死循环了。检查always块里的敏感列表。
我刚开始学仿真时,有一次波形全是红色的X,查了半天发现是Testbench里模块实例化的端口名写错了。嗯,这种低级错误谁都犯过。
3.6 本章知识体系
下面这张图帮你理清本章的核心逻辑:
这张图把本章内容串起来了。从工具选型开始,到安装配置,再到第一个工程,最后是仿真。每一步都是下一步的基础。你按这个顺序走,不会错。
我的建议:别急着上板。先把仿真跑通,理解波形怎么看。做量化交易系统时,仿真就是你的"回测系统"。回测没跑通就实盘?那跟闭着眼睛开车没区别。
好了,环境搭好了,第一个工程也跑通了。接下来你就可以开始写自己的逻辑了。记住,FPGA开发的核心就是"仿真-调试-上板"这个循环。把这个循环跑熟了,后面学什么都快。
公众号:蓝海资料掘金营,微信deep3321