3、FPGA开发环境搭建:Vivado/Quartus安装、License配置、第一个LED闪烁工程、仿真环境(ModelSim/VCS)配置

好,咱们正式开始动手了。这一章,说白了就是“磨刀”。

很多初学者一上来就急着写代码,结果环境没配好,折腾半天连个灯都点不亮。我见过太多人卡在License上,一卡就是一下午。所以,咱们先把刀磨利索。

我个人习惯,不管用哪家的芯片,先把开发环境装好,再配个顺手的仿真器。这样后面写代码、调bug,心里才踏实。

3.1 Vivado与Quartus的安装

这两大工具,你至少得会一个。Xilinx用Vivado,Intel用Quartus。我两边都折腾过,说实话,安装流程大同小异。

3.4.1 Vivado安装要点

Vivado现在版本更新很快,我个人建议装最新的LTS版本,稳定。别追新,追新容易踩坑。

  • 下载:去Xilinx官网,注册个账号,下载Vivado HLx。文件很大,几十个G,找个好点的网络环境。
  • 安装:一路Next就行。但注意,安装路径不要有中文,不要有空格。我习惯装到D盘根目录,比如 D:\Xilinx\Vivado\2024.1
  • 组件选择:如果你是做电子对抗,建议把“Vivado HL System Edition”勾上,里面包含了System Generator,后面做算法验证有用。
注意: 安装过程中会提示安装驱动,一定要装。否则后面下载器连不上板子,你哭都来不及。

3.1.2 Quartus安装要点

Quartus相对轻量一些,但License管理比Vivado麻烦。我用Quartus做项目时,最头疼的就是License过期。

  • 下载:Intel官网,下载Quartus Prime。Lite版是免费的,但功能受限。标准版和Pro版需要License。
  • 安装:同样,路径不要中文。我习惯装 D:\Intel\Quartus\24.1
  • 设备支持:安装时记得勾选你用的FPGA型号。比如Cyclone V、Arria 10这些。别全选,全选太占空间。
小技巧: 装Quartus时,可以顺便把ModelSim装上,它俩是打包的。省得后面再单独配。

3.2 License配置——避坑指南

License配置,是新手最容易翻车的地方。我曾经因为License没配好,折腾了一整天,最后发现是MAC地址填错了。

3.2.1 Vivado License配置

Vivado的License分两种:Node-Locked(锁定节点)和Floating(浮动)。咱们个人学习,用Node-Locked就够了。

  1. 获取License文件:去Xilinx官网申请。需要提供你的网卡MAC地址。
  2. 查看MAC地址:打开命令行,输入 ipconfig /all,找到“物理地址”。注意,不要有横杠,比如 00-1A-2B-3C-4D-5E 要写成 001A2B3C4D5E
  3. 配置:打开Vivado,点击 Help → Manage License,加载你的 .lic 文件。

我曾经踩过的坑: 笔记本有无线网卡和有线网卡,两个MAC地址不一样。Xilinx认的是有线网卡的MAC。如果你用无线网卡申请,License会失效。

3.2.2 Quartus License配置

Quartus的License更“矫情”。它需要设置环境变量。

  1. 获取License:同样,去Intel官网申请。需要提供网卡MAC。
  2. 设置环境变量:右键“此电脑” → 属性 → 高级系统设置 → 环境变量。新建一个变量,变量名 LM_LICENSE_FILE,变量值填你的License文件路径,比如 D:\Intel\Quartus\license.dat
  3. 验证:打开Quartus,如果右上角没有红色警告,说明配好了。
注意: 环境变量设置完后,必须重启Quartus。有时候甚至需要重启电脑。别问我怎么知道的。

3.3 第一个LED闪烁工程

好了,环境配好了,咱们来点个灯。这是FPGA界的“Hello World”。

我习惯用Vivado演示,Quartus流程几乎一样,只是界面不同。

3.3.1 创建工程

  1. 打开Vivado,点击 Create Project
  2. 输入工程名,比如 led_blink。路径不要有中文。
  3. 选择RTL Project,勾选 Do not specify sources at this time
  4. 选择芯片型号。我用的是Xilinx Artix-7,型号 xc7a35tcsg324-1

3.3.2 写代码

新建一个Verilog文件,命名为 led_blink.v。代码如下:

module led_blink(
    input   clk,      // 50MHz 时钟
    input   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
        cnt <= cnt + 1'b1;
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        led <= 1'b0;
    else if (cnt == 25'd24_999_999)  // 0.5秒翻转一次
        led <= ~led;
    else
        led <= led;
end

endmodule

这段代码很简单。计数器从0数到2500万,然后LED翻转。50MHz时钟下,正好0.5秒闪一次。

3.3.3 添加约束

新建一个XDC文件,命名为 led_blink.xdc。把时钟和LED绑定到具体的管脚上。

set_property PACKAGE_PIN R4 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

set_property PACKAGE_PIN U16 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]

set_property PACKAGE_PIN U18 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

管脚分配要根据你的板子来。我用的这块板子,时钟在R4,LED在U16。

3.3.4 综合、实现、下载

  1. 点击 Run Synthesis,等它跑完。
  2. 点击 Run Implementation,等它跑完。
  3. 点击 Generate Bitstream,生成比特流文件。
  4. 连接下载器,点击 Open Hardware Manager,选择 Program Device

如果一切顺利,板子上的LED应该开始闪烁了。嗯,0.5秒一次,很有节奏感。

小提示: 如果LED不亮,先检查约束文件里的管脚号对不对。我经常犯这种低级错误。

3.4 仿真环境配置(ModelSim / VCS)

写FPGA不仿真,等于裸奔。我见过太多人直接下板子调,结果烧坏了好几个芯片。仿真,是保护你板子的最好方式。

3.4.1 ModelSim配置

ModelSim是Mentor的工具,现在叫Siemens EDA。Vivado自带了一个精简版,叫Vivado Simulator。但说实话,我用不惯,还是ModelSim顺手。

  • 安装:如果你装了Quartus,里面自带ModelSim。单独装的话,去官网下载。
  • 关联Vivado:在Vivado里,点击 Tools → Settings → Tool Settings → 3rd Party Simulators,把ModelSim的路径填进去。比如 C:\modeltech64_2024.1\win64
  • 编译库:第一次用ModelSim仿真Xilinx的IP,需要先编译库。在Vivado里点击 Tools → Compile Simulation Libraries,选择ModelSim,指定输出路径。这个过程有点慢,喝杯咖啡等一等。
注意: 编译库时,一定要选择正确的器件家族。如果你用的是Artix-7,就只编译Artix-7的库。全编译的话,不仅慢,而且容易出错。

3.4.2 VCS配置

VCS是Synopsys的工具,主要用于ASIC验证。做FPGA的人用得少,但如果你做大型电子对抗系统,VCS的仿真速度比ModelSim快很多。

  • 安装:VCS安装比较麻烦,需要配置环境变量。我建议用CentOS或者Ubuntu系统。
  • 环境变量:在 .bashrc 里添加:
export VCS_HOME=/opt/synopsys/vcs/R-2024.12
export PATH=$VCS_HOME/bin:$PATH
export LM_LICENSE_FILE=27000@license_server_ip
  • 编译Xilinx库:VCS也需要编译Xilinx的仿真库。Vivado里同样有 Compile Simulation Libraries 选项,选择VCS即可。

我个人建议,初学者先用ModelSim。等后面做复杂系统了,再考虑VCS。别一上来就搞VCS,容易劝退。

3.4.3 写个简单的Testbench

咱们给LED闪烁工程写个Testbench,验证一下功能。

`timescale 1ns / 1ps

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时钟,周期20ns

initial begin
    #50000000;  // 仿真50ms
    $stop;
end

endmodule

在Vivado里,把Testbench设为顶层,然后点击 Run Simulation。你会看到LED信号在0.5秒后开始翻转。嗯,完美。

我的经验: 仿真时,时间尺度别设太大。先跑个几毫秒,看看波形对不对。确认无误后,再跑长时间仿真。否则,仿真器会卡死。

好了,环境搭好了,灯也亮了,仿真也跑了。你可以正式开始FPGA之旅了。下一章,咱们聊聊Verilog语法,那些你真正用得上的东西。