第1章:Vivado开发环境搭建
做FPGA开发,第一步就是把家伙事儿备齐了。Vivado这个工具,说大不大说小不小,装好了能陪你干三年五年,装不好能让你折腾一整天。我这些年换了好几台电脑,每次装Vivado都有新坑踩,今天就把这些经验一股脑倒给你。
1.1 Vivado安装与许可配置
先说说版本选择。Vivado现在更新得挺快,但我个人建议别追最新版。为什么呢?我在项目里吃过亏——新版本刚出来,第三方IP核还没适配好,你辛辛苦苦搭的工程可能就编译不过。
我常用的版本是Vivado 2018.3和2020.2。前者稳定,后者功能全。如果你做K7系列,2018.3完全够用;做Zynq的话,2020.2对AXI总线的支持更好一些。
安装步骤
- 下载安装包:去Xilinx官网下载WebPACK版本就行,免费的。别一上来就下Vivado HLx,那个20多个G,你硬盘受得了吗?
- 运行安装程序:Windows下右键管理员运行,Linux下记得加执行权限。嗯,这里要注意——路径不要有中文,不要有空格。
- 选择组件:勾选Vivado和Vitis(如果你做Zynq)。SDK可以后面再装,别一股脑全选上。
- 等待:去泡杯咖啡,大概30分钟到1小时。看你的网速和硬盘速度。
我曾经在Windows上装Vivado 2021.1,结果死活打不开。查了两天才发现是杀毒软件把license文件给隔离了。装之前先把杀毒软件关了,省得闹心。
许可配置
Vivado的许可分两种:Node-Locked(绑定电脑)和Floating(浮动许可)。个人学习用Node-Locked就够了。
配置方法很简单:
- 打开Vivado,点击 Help → Manage License
- 选择 Load License
- 找到你的.lic文件,加载进去
如果你用的是虚拟机,记得把MAC地址固定下来。我有个同事换了网卡,许可就失效了,折腾半天才搞定。
许可文件最好放在Vivado安装目录下的license文件夹里,别放桌面。万一重装系统,桌面文件全没了,你还得找Xilinx重新申请。
1.2 开发板选型
选开发板这事儿,说白了就是看你的钱包和需求。市面上主流的Xilinx板子就两类:K7系列和Zynq系列。
| 特性 | K7系列(如KC705) | Zynq系列(如ZedBoard) |
|---|---|---|
| 核心架构 | 纯FPGA | FPGA + ARM Cortex-A9 |
| 适合场景 | 纯硬件加速、高速接口 | 嵌入式系统、SoC设计 |
| 开发难度 | 中等 | 较高(需懂ARM) |
| 价格 | 约2000-5000元 | 约1000-3000元 |
| 学习曲线 | 平缓 | 陡峭 |
我个人建议:如果你是纯做卷积加速器,选K7系列。为什么呢?因为加速器主要用FPGA的逻辑资源,ARM核反而用不上。我见过有人拿Zynq做加速器,结果ARM核闲置着,白白多花了钱。
但如果你以后想做嵌入式AI,比如在摄像头前端做实时处理,那Zynq更合适。ARM核可以跑Linux,管理外设方便得很。
具体板卡推荐
- 入门级:Nexys Video(Artix-7,约1500元)——便宜,适合学生党
- 进阶级:KC705(Kintex-7,约5000元)——资源多,适合做复杂加速器
- 全能型:ZedBoard(Zynq-7020,约2000元)——性价比高,ARM+FPGA都能玩
做卷积加速器,至少需要20万以上的逻辑单元(LUT)。Nexys Video只有15万,跑小模型还行,大模型就吃力了。KC705有40万LUT,绰绰有余。
1.3 工程模板创建
每次新建工程都从头配置?太浪费时间了。我习惯做一个模板工程,以后直接复制改改就能用。
创建步骤
- 打开Vivado,点击 Create New Project
- 输入工程名,比如
conv_accelerator_template - 选择RTL Project,勾选 Do not specify sources at this time
- 选择开发板型号(以KC705为例)
- 点击Finish
模板工程里,我一般会预置这些东西:
- 时钟模块:用Clocking Wizard生成200MHz和100MHz时钟
- 复位模块:异步复位同步释放,避免亚稳态
- 约束文件:把板子的时钟引脚、LED、按键都约束好
- 顶层模块:一个空的top.v,带好时钟和复位端口
模板代码示例
// top.v - 卷积加速器顶层模板
module conv_accelerator_top (
input wire sys_clk_p, // 差分时钟输入(正)
input wire sys_clk_n, // 差分时钟输入(负)
input wire sys_rst_n, // 复位按键(低有效)
output wire [3:0] led // 板载LED
);
// 时钟和复位信号
wire clk_200m;
wire clk_100m;
wire rst_n;
// 实例化时钟模块
clk_wiz_0 u_clk_gen (
.clk_in1_p (sys_clk_p),
.clk_in1_n (sys_clk_n),
.clk_out1 (clk_200m),
.clk_out2 (clk_100m),
.resetn (sys_rst_n),
.locked (locked)
);
// 复位同步器
reg [1:0] rst_sync;
always @(posedge clk_100m or negedge sys_rst_n) begin
if (!sys_rst_n)
rst_sync <= 2'b0;
else if (locked)
rst_sync <= {rst_sync[0], 1'b1};
end
assign rst_n = rst_sync[1];
// LED闪烁测试
reg [31:0] counter;
always @(posedge clk_100m or negedge rst_n) begin
if (!rst_n)
counter <= 32'd0;
else
counter <= counter + 1'b1;
end
assign led = counter[25:22];
endmodule
我把模板工程放在
D:/vivado_templates/ 目录下。每次新项目就复制一份,改个名字。这样时钟配置、约束文件都不用重新写,省下至少半小时。
1.4 知识体系总览
这一章的内容,说白了就是三件事:装工具、选板子、建模板。下面这张图帮你理清思路:
你看,从安装工具到选板子,再到建模板,每一步都是为后面的加速器开发打基础。我当年第一次做加速器,就是跳过了模板这一步,结果每次改工程都要重新配时钟,烦得很。
好了,环境搭好了,板子选好了,模板也建好了。接下来你就可以放心大胆地写代码了。记住,好的开始是成功的一半——嗯,这话虽然老套,但在FPGA开发上真不假。