2. 开发环境搭建:Vivado/Quartus安装,仿真工具Modelsim配置,第一个LED灯实验
说实话,很多初学者一上来就急着写代码,结果环境没配好,折腾半天连个灯都点不亮。我当年刚入行时也犯过这毛病——装完Vivado就开干,结果仿真跑不起来,查了半天发现是库没编译。嗯,这节课咱们就把这些坑提前填上。
2.1 开发工具选型:Vivado还是Quartus?
做FPGA开发,你首先得选个趁手的兵器。目前主流就两家:
- Xilinx(现属AMD):对应工具是Vivado,主打高端系列(Virtex、Kintex、Artix)
- Intel(原Altera):对应工具是Quartus Prime,主打Cyclone、Arria、Stratix系列
我个人习惯是:做图像处理项目优先选Xilinx,因为它的IP核生态更丰富,尤其是MIPI、HDMI这些接口IP,用起来顺手。但如果你做工业控制或者成本敏感的项目,Intel的Cyclone系列性价比确实高。
2.2 Vivado安装实战
咱们以Vivado 2023.1为例,讲几个关键点。
安装前准备:
- 硬盘至少留80GB空间(完整安装要60GB+)
- 内存建议16GB以上,8GB也能跑但会卡
- Windows系统路径不要有中文!不要有空格!
安装步骤:
- 从官网下载Vivado HLx Installer
- 运行安装程序,选择「Vivado HL WebPACK」或「Vivado HL Design Edition」
- 勾选组件时,至少选上:
- Vivado Design Suite
- Vivado Simulator(内置仿真器)
- Devices(根据你的芯片型号选,比如Artix-7)
- 安装路径我建议用默认的
C:\Xilinx,别乱改 - 等待...大概1-2小时,可以去喝杯咖啡
2.3 Quartus Prime安装要点
Quartus的安装相对轻量一些。以Quartus Prime 22.1 Lite版为例:
- Lite版免费,功能足够初学者用
- 安装时记得勾选「ModelSim Intel FPGA Edition」——这个就是内置的仿真器
- 设备支持包按需选,别全勾,不然硬盘受不了
安装完成后,我建议你做一件事:打开Tools → Options,把「Default temporary file directory」改到一个空间大的盘。Quartus编译时会产生大量临时文件,默认在C盘容易爆。
2.4 Modelsim配置——仿真环境的核心
Modelsim是FPGA仿真的标配工具。虽然Vivado和Quartus都自带仿真器,但说实话,Modelsim的调试体验更好。我在项目中遇到复杂时序问题时,最后还是靠Modelsim的波形对比功能找到的bug。
Modelsim与Vivado的关联配置:
- 安装Modelsim(推荐Modelsim SE-64 2020.4以上版本)
- 在Vivado中设置:Tools → Settings → Tool Settings → 3rd Party Simulators
- 把Modelsim的安装路径填进去,比如
C:\modeltech64_2020.4\win64 - 编译Xilinx库:在Vivado Tcl Console里运行:
这个过程大概要20分钟,耐心等。compile_simlib -simulator modelsim -family all -language all -dir {C:\modelsim_lib}
vmap 命令映射库路径。不然仿真时会报错「找不到unisim库」。我见过太多新手在这栽跟头了。
Modelsim与Quartus的关联配置:
- Quartus自带Modelsim Intel版,路径一般在
C:\intelFPGA_lite\22.1\modelsim_ase\win32aloem - 在Quartus中:Assignments → Settings → EDA Tool Settings → Simulation
- Tool name选「ModelSim」,Format选「Verilog HDL」
- 勾选「Compile test bench」并指定你的testbench文件
2.5 第一个LED灯实验——点亮你的FPGA
环境搭好了,咱们来点实际的。让FPGA控制一个LED闪烁,这是硬件工程师的「Hello World」。
硬件连接:
以Xilinx Artix-7开发板为例,LED通常接在FPGA的普通GPIO上。比如板子上有个叫「LD0」的LED,对应FPGA引脚 P17。
Verilog代码:
module led_blink (
input wire clk, // 50MHz系统时钟
input wire rst_n, // 复位信号,低有效
output reg led // LED输出
);
// 分频计数器
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) // 50MHz分频到1Hz
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
end
// LED控制
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
led <= 1'b0;
else if (cnt == 25'd24_999_999)
led <= ~led; // 翻转LED状态
else
led <= led;
end
endmodule
约束文件(XDC):
set_property PACKAGE_PIN P17 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property PACKAGE_PIN E3 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN C12 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
仿真测试:
写个简单的testbench验证一下:
module tb_led_blink();
reg clk;
reg rst_n;
wire led;
led_blink uut (
.clk(clk),
.rst_n(rst_n),
.led(led)
);
initial begin
clk = 0;
rst_n = 0;
#100 rst_n = 1;
end
always #10 clk = ~clk; // 50MHz时钟
endmodule
25'd4,这样LED每5个时钟周期翻转一次,波形看起来更直观。等仿真通过后再改回真实值去烧录。
2.6 知识体系总览
下面这张图把本章的核心逻辑串起来了。你想想看,从工具安装到代码编写,再到仿真验证,其实是一条完整的链路:
说白了,整个流程就是:选好工具 → 装好环境 → 配好仿真 → 写代码验证。每一步都有坑,但踩过一次就记住了。
2.7 常见问题与避坑指南
最后分享几个我实际遇到过的问题:
- 问题1:Vivado编译库时报错「Permission denied」
我曾经遇到过,原因是安装路径有权限限制。用管理员身份运行Vivado就解决了。 - 问题2:Modelsim仿真报错「vsim failed to load library」
八成是库没映射对。检查一下modelsim.ini文件里的库路径,手动改一下就行。 - 问题3:LED不亮
先检查约束文件里的引脚号对不对。我有个同事折腾了两天,结果是板子上的LED焊反了...嗯,硬件问题有时候就是这么坑。
好了,环境搭好、第一个LED也点亮了,你已经迈出了FPGA开发的第一步。后面咱们就要开始正经搞图像处理了——从像素点的读写开始。