3、开发工具链入门:Vivado/Vitis安装、创建第一个LED工程、综合与实现、生成比特流
好,咱们正式开始动手了。前面聊了那么多理论,现在终于要碰一碰真正的工具链。说实话,我第一次装Vivado的时候,光是等那个安装进度条就等了快两个小时——嗯,这玩意儿确实是个庞然大物。但别怕,一旦你摸清了它的脾气,后面就顺了。
3.1 开发环境概览:Vivado与Vitis的分工
先搞清楚这两个工具是干嘛的。很多新手容易混淆,我刚开始也犯过这个错。
| 工具 | 职责 | 我的理解 |
|---|---|---|
| Vivado | 硬件设计:写RTL、综合、布局布线、生成比特流 | 说白了就是画芯片的“施工图” |
| Vitis | 软件开发:写C代码、编译、调试、烧录 | 给芯片写“灵魂”的 |
你想想看,一个FPGA项目,硬件部分用Vivado搞定,软件部分交给Vitis。但咱们这节课只讲硬件部分,也就是Vivado。Vitis后面章节会专门讲。
3.2 Vivado安装避坑指南
安装这事儿,说简单也简单,说坑也多。我踩过的坑,你最好别踩。
3.2.1 下载与安装步骤
- 去官网下载:Xilinx官网,选择Vivado ML Edition。建议下载WebPACK版本,免费且够用。
- 选择安装组件:勾选“Vivado”和“Vitis”即可。如果你硬盘够大,可以把所有器件支持都勾上,省得后面要加装。
- 等待...再等待...:安装时间取决于你的网速和硬盘速度。我上次装2023.2版本,用了整整1小时47分钟。
- 配置License:申请免费WebPACK license,或者用你们公司的浮动license。
3.3 创建第一个LED工程
好,工具装好了,咱们来点亮第一个LED。这是硬件工程师的“Hello World”。
3.3.1 新建工程
- 打开Vivado,点击 Create Project。
- 工程名:
led_blink,路径选一个干净的文件夹。 - 选择 RTL Project,勾选 Do not specify sources at this time。
- 选择器件:以Xilinx Artix-7 XC7A35T为例(如果你用的是其他板子,选对应的型号)。
嗯,这里要注意:器件型号一定要选对。我有个同事,选了XC7A100T的型号,结果综合出来的资源报告全是错的,因为实际芯片没那么大。
3.3.2 编写LED闪烁代码
点击 Add Sources → Add 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 Sources → Add 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]
3.4 综合与实现
代码和约束都准备好了,接下来就是让Vivado干活了。
3.4.1 综合(Synthesis)
综合,说白了就是把你的Verilog代码翻译成FPGA能理解的底层逻辑单元(LUT、FF、BRAM等)。
在左侧 Flow Navigator 中,点击 Synthesis → Run Synthesis。
等待几分钟...嗯,这时候可以去泡杯咖啡。综合完成后,会弹出对话框,选择 Open Synthesized Design 可以查看综合后的原理图。
3.4.2 实现(Implementation)
实现包括三个步骤:布局(Place)、布线(Route)、时序分析(Timing Analysis)。
点击 Implementation → Run Implementation。
这一步比综合更耗时。布局布线说白了就是把你的逻辑单元放到FPGA的物理位置上,然后用可编程连线把它们连起来。这就像在棋盘上摆棋子,还要保证所有棋子之间的连线不打架。
实现完成后,一定要看 Report Timing Summary。如果出现时序违例(Timing Violation),说明你的设计跑不到目标频率。我遇到过最离谱的一次,时序违例了-2.3ns,最后发现是时钟约束写错了。
3.5 生成比特流
最后一步,生成比特流(Bitstream)。比特流就是FPGA的“配置文件”,里面包含了所有LUT的查找表内容、FF的初始值、布线开关的状态等。
点击 Program and Debug → Generate Bitstream。
Vivado会依次执行综合、实现、生成比特流三个步骤。如果前面都通过了,这一步就是水到渠成。
比特流生成成功后,会在工程目录下的 .runs/impl_1/ 文件夹里生成一个 .bit 文件。这个文件就是我们要烧录到FPGA里的。
3.6 知识体系总览
为了让你对整个流程有个直观的认识,我画了一张图:
这张图把整个流程串起来了。你注意看左边的反馈回路——实际开发中,很少能一次走通。综合报错?回去改代码。时序违例?回去改约束或者改设计。这才是常态。
好了,到这里你已经完成了第一个LED工程的完整流程。从安装工具到生成比特流,每一步都走了一遍。虽然只是一个简单的LED闪烁,但整个开发流程——创建工程、编写代码、添加约束、综合、实现、生成比特流——和做复杂项目是完全一样的。
下次你做一个千兆以太网控制器,流程也是这些。只不过代码更复杂,约束更多,综合时间更长而已。