3、开发工具链入门:Vivado/Vitis安装、创建第一个LED工程、综合与实现、生成比特流

好,咱们正式开始动手了。前面聊了那么多理论,现在终于要碰一碰真正的工具链。说实话,我第一次装Vivado的时候,光是等那个安装进度条就等了快两个小时——嗯,这玩意儿确实是个庞然大物。但别怕,一旦你摸清了它的脾气,后面就顺了。

3.1 开发环境概览:Vivado与Vitis的分工

先搞清楚这两个工具是干嘛的。很多新手容易混淆,我刚开始也犯过这个错。

工具 职责 我的理解
Vivado 硬件设计:写RTL、综合、布局布线、生成比特流 说白了就是画芯片的“施工图”
Vitis 软件开发:写C代码、编译、调试、烧录 给芯片写“灵魂”的

你想想看,一个FPGA项目,硬件部分用Vivado搞定,软件部分交给Vitis。但咱们这节课只讲硬件部分,也就是Vivado。Vitis后面章节会专门讲。

3.2 Vivado安装避坑指南

安装这事儿,说简单也简单,说坑也多。我踩过的坑,你最好别踩。

⚠️ 重要提醒: 安装路径不要有中文!不要有空格!我见过有人装在“D:\程序\Vivado”下面,结果综合时报一堆莫名其妙的错误,折腾了两天才发现是路径问题。

3.2.1 下载与安装步骤

  1. 去官网下载:Xilinx官网,选择Vivado ML Edition。建议下载WebPACK版本,免费且够用。
  2. 选择安装组件:勾选“Vivado”和“Vitis”即可。如果你硬盘够大,可以把所有器件支持都勾上,省得后面要加装。
  3. 等待...再等待...:安装时间取决于你的网速和硬盘速度。我上次装2023.2版本,用了整整1小时47分钟。
  4. 配置License:申请免费WebPACK license,或者用你们公司的浮动license。
💡 我的小技巧: 安装时把杀毒软件关了,尤其是360。Vivado安装包里有大量脚本文件,杀毒软件会一个一个扫描,拖慢速度不说,还可能误删关键文件。

3.3 创建第一个LED工程

好,工具装好了,咱们来点亮第一个LED。这是硬件工程师的“Hello World”。

3.3.1 新建工程

  1. 打开Vivado,点击 Create Project
  2. 工程名:led_blink,路径选一个干净的文件夹。
  3. 选择 RTL Project,勾选 Do not specify sources at this time
  4. 选择器件:以Xilinx Artix-7 XC7A35T为例(如果你用的是其他板子,选对应的型号)。

嗯,这里要注意:器件型号一定要选对。我有个同事,选了XC7A100T的型号,结果综合出来的资源报告全是错的,因为实际芯片没那么大。

3.3.2 编写LED闪烁代码

点击 Add SourcesAdd or create design sources,新建一个Verilog文件,命名为 led_blink.v

module led_blink (
    input  wire clk,      // 50MHz 板载时钟
    input  wire rst_n,    // 复位,低有效
    output reg  led       // LED输出
);

reg [31:0] counter;

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

endmodule

这段代码的逻辑很简单:用计数器分频,每0.5秒翻转一次LED。为什么是24,999,999?因为50MHz时钟,0.5秒就是25,000,000个周期,从0计数到24,999,999正好是25M个时钟沿。

3.3.3 添加约束文件

代码写好了,但芯片不知道哪个引脚接LED,哪个引脚接时钟。这就需要约束文件。

点击 Add SourcesAdd or create constraints,新建一个XDC文件,命名为 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]
set_property IOSTANDARD LVCMOS33 [get_ports led]

# 创建时钟约束
create_clock -period 20.000 -name sys_clk [get_ports clk]
🔑 关键点: 引脚编号一定要查你的板子原理图!不同板子的LED引脚不一样。我见过有人直接复制网上的约束文件,结果LED死活不亮,查了半天发现引脚号对不上。

3.4 综合与实现

代码和约束都准备好了,接下来就是让Vivado干活了。

3.4.1 综合(Synthesis)

综合,说白了就是把你的Verilog代码翻译成FPGA能理解的底层逻辑单元(LUT、FF、BRAM等)。

在左侧 Flow Navigator 中,点击 SynthesisRun Synthesis

等待几分钟...嗯,这时候可以去泡杯咖啡。综合完成后,会弹出对话框,选择 Open Synthesized Design 可以查看综合后的原理图。

💡 我的经验: 综合完成后,一定要看 Report Utilization。如果LUT使用率超过80%,就要小心了,后面布局布线可能会出问题。我曾经有个项目,综合出来LUT用了85%,结果布线时死活布不通,最后只能重新优化代码。

3.4.2 实现(Implementation)

实现包括三个步骤:布局(Place)布线(Route)时序分析(Timing Analysis)

点击 ImplementationRun Implementation

这一步比综合更耗时。布局布线说白了就是把你的逻辑单元放到FPGA的物理位置上,然后用可编程连线把它们连起来。这就像在棋盘上摆棋子,还要保证所有棋子之间的连线不打架。

实现完成后,一定要看 Report Timing Summary。如果出现时序违例(Timing Violation),说明你的设计跑不到目标频率。我遇到过最离谱的一次,时序违例了-2.3ns,最后发现是时钟约束写错了。

3.5 生成比特流

最后一步,生成比特流(Bitstream)。比特流就是FPGA的“配置文件”,里面包含了所有LUT的查找表内容、FF的初始值、布线开关的状态等。

点击 Program and DebugGenerate Bitstream

Vivado会依次执行综合、实现、生成比特流三个步骤。如果前面都通过了,这一步就是水到渠成。

⚠️ 注意: 生成比特流时,Vivado会再次检查所有约束和时序。如果之前实现时有warning没处理,这里可能会直接报错。我建议养成好习惯:实现完成后,把所有的warning都看一遍,不要直接跳过。

比特流生成成功后,会在工程目录下的 .runs/impl_1/ 文件夹里生成一个 .bit 文件。这个文件就是我们要烧录到FPGA里的。

3.6 知识体系总览

为了让你对整个流程有个直观的认识,我画了一张图:

Vivado开发流程总览 1. 创建工程 选择器件、设置路径 2. 编写RTL代码 Verilog/VHDL 3. 添加约束 引脚、时序约束 4. 综合 RTL→网表 5. 实现 布局 → 布线 → 时序分析 6. 生成比特流 .bit文件 发现问题,返回修改 每一步都可能产生错误,需要返回上一步修改

这张图把整个流程串起来了。你注意看左边的反馈回路——实际开发中,很少能一次走通。综合报错?回去改代码。时序违例?回去改约束或者改设计。这才是常态。

好了,到这里你已经完成了第一个LED工程的完整流程。从安装工具到生成比特流,每一步都走了一遍。虽然只是一个简单的LED闪烁,但整个开发流程——创建工程、编写代码、添加约束、综合、实现、生成比特流——和做复杂项目是完全一样的。

下次你做一个千兆以太网控制器,流程也是这些。只不过代码更复杂,约束更多,综合时间更长而已。


专注资料整理