2. 开发环境搭建:Vivado + Vitis 统一开发平台安装、许可证配置、硬件描述语言(Verilog/VHDL)与C/C++混合工程创建

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上好几个小时。我当年第一次装Vivado时,光许可证就折腾了一整天。嗯,这节课咱们就把这事彻底捋清楚。

2.1 统一开发平台:Vivado + Vitis 到底是什么关系?

先搞清楚一个概念。Vivado和Vitis,其实是同一套工具链的两个面孔。

  • Vivado:负责硬件端。写Verilog/VHDL、做综合、布局布线、生成比特流。说白了,就是管FPGA那部分。
  • Vitis:负责软件端。写C/C++、编译、调试ARM核上的程序。它取代了老版的SDK。

这两者怎么配合?我画个图你就明白了。

Vivado 硬件开发环境 Verilog / VHDL 编写 综合 + 布局布线 生成 .bit 比特流 导出硬件描述 Vitis 软件开发环境 C / C++ 代码编写 ARM 核编译 + 链接 生成 .elf 可执行文件 最终:.bit + .elf → 下载到开发板

你看,左边Vivado管硬件,右边Vitis管软件。中间通过导出的硬件描述文件(.xsa)连接起来。我个人习惯是先跑通硬件,再写软件,这样调试时心里有底。

2.2 安装流程:别踩这些坑

安装其实不复杂,但有几个地方容易翻车。我一个个说。

2.2.1 下载与安装

  1. 去官网下载:Xilinx官网,找Vivado ML Edition。建议下载WebPACK版本,免费且够用。
  2. 选择组件:安装时勾选“Vivado”和“Vitis”。别漏了Vitis,不然你后面没法写C代码。
  3. 磁盘空间:这个要重点说。完整安装大概需要100GB以上。我建议至少留150GB。曾经有个学员装到一半磁盘满了,结果重装了一下午。
  4. 安装路径:不要有中文!不要有空格!老老实实用 C:\Xilinx/opt/Xilinx

⚠️ 注意:安装过程中会提示安装驱动。务必选择“是”。否则你的开发板插上电脑后,系统认不出来。

2.2.2 许可证配置

许可证这事,我当年被坑过。这里直接给标准流程:

步骤 操作 说明
1 打开Vivado → Help → Obtain License 会跳转到Xilinx官网
2 注册账号,申请免费WebPACK License 用公司或学校邮箱,个人邮箱也行
3 下载 .lic 文件 会发到你邮箱,或者直接在页面下载
4 Vivado → Help → Manage License → Load License 选择刚才下载的 .lic 文件
5 确认状态显示“WebPACK” 绿色勾就对了

💡 小技巧:如果你在公司内网,可能无法直接访问官网。可以先用手机热点下载 .lic 文件,再拷到电脑上加载。我出差时经常这么干。

2.3 创建第一个混合工程:Verilog + C

好,环境装好了,许可证也配好了。咱们来创建一个真正的混合工程。说白了,就是让FPGA上的逻辑和ARM上的程序能互相通信。

2.3.1 在Vivado中创建硬件工程

  1. 打开Vivado → Create Project → 选“RTL Project”
  2. 选择芯片:比如 xc7z020clg400-1(Zynq-7020)
  3. 添加一个Verilog文件:led_blink.v

写一段最简单的LED闪烁代码:

// led_blink.v
module led_blink (
    input  wire        clk,      // 50MHz 时钟
    input  wire        rst_n,    // 复位,低有效
    output reg  [3:0]  led       // 4个LED
);

    reg [31:0] cnt;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 32'd0;
            led <= 4'b0000;
        end else begin
            cnt <= cnt + 1;
            // 每 50M 个时钟翻转一次(约1秒)
            if (cnt == 32'd49_999_999) begin
                cnt <= 32'd0;
                led <= ~led;
            end
        end
    end

endmodule

这段代码很简单。但我要提醒你:实际项目中,计数器宽度和时钟频率一定要算清楚。我见过有人把50MHz算成50,000,000,结果少了个0,LED闪得跟频闪灯似的。

2.3.2 综合、实现、生成比特流

在Vivado里点“Generate Bitstream”。等几分钟。如果报错,多半是时序问题。嗯,这个后面章节会细讲。

2.3.3 导出硬件到Vitis

  1. File → Export → Export Hardware → 勾选“Include bitstream”
  2. 生成 .xsa 文件(比如 design_1_wrapper.xsa
  3. Launch Vitis

2.3.4 在Vitis中创建软件工程

  1. Vitis中:Create Application Project
  2. 选择刚才导出的 .xsa 文件
  3. 选择模板:Hello World(或者Empty Application)
  4. 写C代码控制LED:
// main.c
#include <stdio.h>
#include "xparameters.h"
#include "xgpio.h"

XGpio Gpio; // GPIO 实例

int main() {
    int status;
    u32 led_value = 0;

    // 初始化GPIO
    status = XGpio_Initialize(&Gpio, XPAR_GPIO_0_DEVICE_ID);
    if (status != XST_SUCCESS) {
        printf("GPIO初始化失败!\n");
        return XST_FAILURE;
    }

    // 设置方向:输出
    XGpio_SetDataDirection(&Gpio, 1, 0x00);

    printf("LED测试开始...\n");

    while (1) {
        led_value = ~led_value;  // 翻转
        XGpio_DiscreteWrite(&Gpio, 1, led_value);
        sleep(1);  // 延时1秒
    }

    return 0;
}

🔑 关键点:硬件(Verilog)和软件(C)通过AXI总线通信。Vivado里把GPIO模块挂到AXI总线上,Vitis里通过API读写。这就是“协同设计”的核心。

2.4 避坑指南:我踩过的雷

  • 版本匹配问题:Vivado和Vitis必须是同一版本。2023.1的Vivado配2023.1的Vitis。混搭会报莫名其妙错。我曾经用2022.2的Vivado配2023.1的Vitis,折腾了两天才发现是版本问题。
  • 路径不要有中文:工程路径、用户名、文件夹名,统统用英文。Vivado对中文支持很差。
  • 防火墙拦截:第一次加载许可证时,防火墙可能会拦截。关掉防火墙再试。
  • JTAG驱动:如果开发板连不上,去设备管理器看看驱动。Xilinx的USB驱动有时需要手动安装。

2.5 验证:下载到开发板

最后一步,把硬件和软件一起下载到板子上。

  1. 在Vivado里:Open Hardware Manager → Auto Connect → Program Device
  2. 选择 .bit 文件,下载
  3. 在Vitis里:Run As → Launch on Hardware
  4. 看到LED闪烁了吗?如果闪了,恭喜你,环境搭建成功!

💡 如果LED不亮:先检查复位引脚。很多开发板的复位是低有效,代码里要对应。另外,检查一下板子的跳线,确保时钟源正确。

好了,环境搭建就到这里。这套流程你走一遍,后面所有章节的实验都能跑起来。记住:硬件是骨架,软件是灵魂,两者缺一不可。


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