1. FPGA基础与开发环境:从架构到第一个LED灯
各位同学好,我是你们的FPGA讲师。今天咱们开始第一课——FPGA基础与开发环境搭建。说实话,每次带新人入门,我都会想起自己第一次点亮LED灯时的兴奋劲儿。那感觉,就像你亲手给一块芯片注入了生命。
好,废话不多说,直接进入正题。
1.1 FPGA到底是个什么东西?
FPGA,全称Field Programmable Gate Array,现场可编程门阵列。说白了,就是一块你可以反复“烧写”逻辑的芯片。跟CPU不同,CPU是固定指令集,你只能写软件;FPGA呢,你可以自己定义硬件电路。
我经常跟团队里的新人说:CPU是厨师,按菜谱做菜;FPGA是厨房,你可以自己搭灶台、装水管、摆案板。想做什么菜,就搭什么厨房。
核心概念速览:
- 可编程逻辑块(Logic Block)——FPGA的基本单元,用来实现各种逻辑功能
- 可编程互连(Interconnect)——连接各个逻辑块的“高速公路”
- I/O块(I/O Block)——芯片与外界通信的“口岸”
- 嵌入式存储器(Block RAM)——片内存储,速度极快
- DSP切片(DSP Slice)——专门做乘加运算的硬件加速器
嗯,这里要注意:FPGA不是万能的。它擅长的是并行处理和低延迟场景。比如实时图像处理、通信基带、高速数据采集。你要是跑个操作系统,那还是老老实实用CPU吧。
1.2 FPGA内部架构长什么样?
我画了一张图,帮你把FPGA的“五脏六腑”看清楚。
看到没?FPGA的核心就是逻辑块阵列,它们像棋盘一样排列。每个逻辑块都能实现简单的逻辑功能(与或非门、触发器)。通过可编程互连,你可以把这些逻辑块连成复杂的电路。
我个人习惯把FPGA比作乐高积木——每个逻辑块就是一块积木,互连就是积木上的卡扣。你想搭一座桥、一辆车、一个城堡,全看你怎么拼。
1.3 Verilog基础——硬件描述语言入门
好,架构看完了,咱们得学点“编程”。不过注意,Verilog不是编程语言,是硬件描述语言。你写的每一行代码,最终都会变成实实在在的电路。
我见过太多新手把Verilog当C语言写,结果综合出来的电路乱七八糟。记住:你是在画电路,不是在写软件。
1.3.1 模块结构
一个Verilog程序的基本单元是module。看个最简单的例子:
module led_controller(
input wire clk, // 时钟输入
input wire rst_n, // 复位信号(低有效)
output reg led // LED输出
);
// 计数器,用于分频
reg [24:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 25'd0;
led <= 1'b0;
end else begin
cnt <= cnt + 1'b1;
// 每25M个时钟翻转一次(假设50MHz时钟,约0.5秒)
if (cnt == 25'd24_999_999) begin
cnt <= 25'd0;
led <= ~led;
end
end
end
endmodule
小提示:注意看代码里的 always @(posedge clk or negedge rst_n)。这叫敏感列表,告诉综合工具:这个always块在时钟上升沿或复位下降沿触发。这是时序逻辑的标准写法,千万别漏了。
1.3.2 数据类型速查表
| 类型 | 关键字 | 默认值 | 典型用途 |
|---|---|---|---|
| 线网型 | wire |
高阻z | 模块间连线、assign赋值 |
| 寄存器型 | reg |
不定x | always块内赋值、存储状态 |
| 向量 | [7:0] data |
— | 多比特数据总线 |
| 整型 | integer |
— | 循环变量、仿真用 |
| 参数 | parameter |
— | 常量定义、模块参数化 |
嗯,这里要特别提醒:wire和reg的区别,是很多新手栽跟头的地方。简单说:assign左边必须是wire,always块内赋值必须是reg。别问为什么,这是语法规定。
1.4 Vivado安装与使用——开发环境搭建
接下来咱们搭开发环境。我用的是Xilinx的Vivado,目前业界主流的FPGA开发工具之一。
1.4.1 安装步骤
- 下载Vivado:去Xilinx官网(现在叫AMD)下载Vivado HLx版本。建议选Vivado HL WebPACK,免费版够用了。
- 安装:一路Next,注意选对器件支持。咱们课程用Artix-7系列,勾上就行。
- 许可证:WebPACK版不需要额外license,安装完就能用。
- 启动:双击Vivado 202x.x图标,等它加载。
避坑指南:我曾经在安装Vivado时选了全部器件支持,结果硬盘直接爆了——Vivado完整安装要80GB以上!建议只勾选你需要的器件系列。另外,安装路径不要有中文,否则编译会报一些莫名其妙的错误。
1.4.2 创建第一个工程
启动Vivado后,按以下步骤操作:
- 点击Create Project → Next
- 输入工程名(比如
led_test),选好路径 → Next - 选择RTL Project → 勾选Do not specify sources at this time → Next
- 选择器件:以Nexys4开发板为例,选xc7a100tcsg324-1 → Finish
工程建好后,左侧Project Manager面板里,右键Design Sources → Add Sources → Add or create design sources → 创建一个新文件,命名为 led_controller.v。把刚才的Verilog代码复制进去,保存。
1.5 第一个LED灯程序——从代码到硬件
代码写好了,怎么让它跑起来?需要经过综合(Synthesis)、实现(Implementation)、生成比特流(Generate Bitstream)三步。
1.5.1 综合与实现流程
| 步骤 | 操作 | 耗时 | 说明 |
|---|---|---|---|
| 综合 | 点击Run Synthesis | 1-3分钟 | 将Verilog代码转换成门级网表 |
| 实现 | 综合完成后点击Run Implementation | 3-10分钟 | 布局布线,将网表映射到实际器件 |
| 生成比特流 | 实现完成后点击Generate Bitstream | 1-2分钟 | 生成可烧写的.bit文件 |
每一步完成后,Vivado会弹出对话框问你要不要下一步。你也可以在Flow Navigator面板里手动点击。
1.5.2 烧写与验证
比特流生成后,连接开发板:
- 用USB线连接开发板和电脑
- 点击Open Hardware Manager → Auto Connect
- Vivado识别到开发板后,点击Program Device
- 选择刚才生成的
led_test.bit文件 → Program
如果一切顺利,开发板上的LED应该开始闪烁了!
常见问题排查:
- LED不亮?检查管脚约束文件(XDC)是否正确。右键Constraints → Add Sources → 创建XDC文件,写入类似
set_property PACKAGE_PIN T18 [get_ports led]的约束。 - 编译报错?看Messages面板,红色是错误,黄色是警告。双击错误信息会跳转到代码位置。
- 烧写失败?检查USB驱动是否安装,或者换一根数据线(有些线只能充电不能传数据)。
我记得第一次带学生做这个实验,有个同学折腾了一下午LED都不亮。最后发现是XDC文件里管脚号写错了——他把T18写成了R18。你看,细节决定成败。
1.6 本章小结
好,第一课的内容就这些。咱们回顾一下:
- FPGA是可编程硬件,核心是逻辑块+互连网络
- Verilog是硬件描述语言,不是软件语言
- Vivado开发流程:创建工程 → 写代码 → 综合 → 实现 → 生成比特流 → 烧写
- 第一个LED程序,让你亲手感受到了“硬件可编程”的魅力
说实话,点亮第一个LED只是万里长征第一步。但这一步走扎实了,后面的路就好走了。下节课咱们会深入Verilog语法,讲组合逻辑和时序逻辑的区别——这可是FPGA设计的核心思想。
各位回去把Vivado装上,把LED灯跑通。有问题随时在群里问。咱们下节课见。