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 下载与安装

  1. 去官网下载:AMD官网 -> 支持 -> Vivado。选WebPack版,免费。
  2. 安装路径:不要有中文!不要有空格!我习惯装到 C:\Xilinx\Vivado\2023.1
  3. 选择组件:勾选Vivado HL WebPACK、Vivado Simulator。如果你有开发板,勾上对应的Board Files。
  4. 安装时间:大概30分钟到1小时。去喝杯咖啡吧。

注意:安装过程中会提示安装Cable Drivers(下载器驱动)。一定要勾上!否则你连不上板子。我曾经有一次忘了勾,折腾了半天才发现驱动没装。

3.2.2 License配置

Vivado的License分两种:Node-locked(绑定电脑)和Floating(浮动)。个人用户用Node-locked就够了。

  1. 申请免费License:去AMD官网注册账号,在License管理页面申请Vivado WebPack License。免费,永久有效。
  2. 下载License文件:会得到一个 .lic 文件。
  3. 加载License:打开Vivado -> Help -> Manage License -> Load License。选择你的 .lic 文件。
  4. 验证:在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 下载与安装

  1. 去Intel官网下载:搜索Quartus Prime Lite Edition,免费。
  2. 安装路径:同样不要中文。我习惯 C:\intelFPGA_lite\23.1
  3. 选择组件:勾选Quartus Prime Lite Edition、ModelSim Intel FPGA Edition。如果你有开发板,勾上对应的Device Support。
  4. 安装时间:比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 创建工程

  1. 打开Vivado -> Quick Start -> Create Project。
  2. 工程名:led_blink,路径不要有中文。
  3. 选择RTL Project,勾上"Do not specify sources at this time"。
  4. 选择芯片:我用的板子是Artix-7(XC7A35T),你也可以选你的板子型号。
  5. 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 综合、实现、生成比特流

  1. 点击 "Run Synthesis"(综合)。等几分钟。
  2. 综合完成后,点击 "Run Implementation"(实现)。
  3. 实现完成后,点击 "Generate Bitstream"(生成比特流)。
  4. 连接开发板,点击 "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 运行仿真

  1. 在Vivado左侧Flow Navigator中,点击 "Run Simulation" -> "Run Behavioral Simulation"。
  2. 等待仿真器启动,你会看到波形窗口。
  3. 在波形窗口里,把 led 信号拖进去,设置显示格式为Hexadecimal。
  4. 点击 "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开发环境搭建知识体系 FPGA开发环境搭建 1. 开发工具选型:Vivado vs Quartus 2. Vivado/Quartus安装与License配置 3. 第一个LED闪烁工程(综合→实现→下载) 4. 硬件描述语言仿真基础 Testbench编写 波形查看与分析 时间缩放法调试 核心原则:先仿真后上板,养成调试好习惯

这张图把本章内容串起来了。从工具选型开始,到安装配置,再到第一个工程,最后是仿真。每一步都是下一步的基础。你按这个顺序走,不会错。

我的建议:别急着上板。先把仿真跑通,理解波形怎么看。做量化交易系统时,仿真就是你的"回测系统"。回测没跑通就实盘?那跟闭着眼睛开车没区别。

好了,环境搭好了,第一个工程也跑通了。接下来你就可以开始写自己的逻辑了。记住,FPGA开发的核心就是"仿真-调试-上板"这个循环。把这个循环跑熟了,后面学什么都快。


公众号:蓝海资料掘金营,微信deep3321