什么是 FPGA
初学者常困惑 FPGA 与单片机的区别。简单来说,FPGA(Field Programmable Gate Array,现场可编程门阵列)允许从底层构建电路,而单片机是固定架构的芯片。例如,单片机像组装好的乐高套装,FPGA 则像零散积木块,可通过硬件描述语言(如 Verilog)定义任意数字电路。
Vivado 环境搭建
安装包获取
访问 Xilinx 官网下载 Vivado Design Suite(社区版免费)。建议选择 2020.1 之后的版本,安装时勾选 Vivado HL Design Edition 及对应器件支持(如 Artix-7 系列)。
硬件准备
建议先用在线仿真器练习,基础扎实后再入手开发板,如 Nexys A7、Basys3 或 DE10-Nano。
第一个工程创建
打开 Vivado,点击 Create Project,选择 RTL Project 并添加新 Verilog 文件。器件型号通常选 xc7a35tcsg324-1(对应多数入门开发板)。
Verilog 核心语法
// 基础结构模板
module my_module(
input wire clk, // 时钟信号
input wire rst_n, // 复位信号(低有效)
output reg led // LED 输出
);
// 组合逻辑用 assign
assign a = b & c;
// 时序逻辑用 always 块
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
led <= 1'b0; // 复位时 LED 灭
end else begin
led <= ~led; // 翻转 LED 状态
end
end
endmodule
必须掌握的 10 个核心语法:
module/endmodule:电路模块定义input/output:输入输出端口wire/reg:线网与寄存器assign:组合逻辑赋值always:过程块(时序逻辑)posedge/negedge:时钟边沿检测if/else:条件判断case:多路选择parameter:参数定义#:延时控制(仅仿真用)
LED 流水灯实战
代码实现
module led_run(
input clk_100MHz, // 开发板上的 100MHz 时钟
input rst_n, // 复位按键(低电平有效)
output reg [3:0] leds // 4 位 LED 输出
);
// 分频器:100MHz -> 1Hz
reg [26:0] counter;
always @(posedge clk_100MHz or negedge rst_n) begin
if(!rst_n) begin
counter <= 0;
end else begin
counter <= (counter == 27'd99_999_999) ? 0 : counter + 1;
end
end
// LED 流水效果
always @(posedge clk_100MHz or negedge rst_n) begin
if(!rst_n) begin
leds <= 4'b0001; // 初始状态
end else if(counter == 27'd99_999_999) begin
leds <= {leds[2:0], leds[3]}; // 循环左移
end
end
endmodule
Modelsim 仿真
创建 testbench 文件进行验证:
`timescale 1ns / 1ps
module tb_led_run();
reg clk, rst_n;
wire [3:0] leds;
led_run uut(.clk_100MHz(clk), .rst_n(rst_n), .leds(leds));
initial begin
clk = 0;
forever #5 clk = ~clk; // 100MHz 周期=10ns
end
initial begin
rst_n = 0;
#100;
rst_n = 1;
#200000000; // 等待 2 秒(仿真时间)
$stop;
end
endmodule
上板验证
- 生成 bit 流文件:点击 Generate Bitstream。
- 连接开发板:通过 USB-JTAG 接口。
- 烧录程序:Open Hardware Manager → Auto Connect → Program Device。
- 观察 LED 状态是否循环流动。
学习路线
阶段一:数字电路基础
掌握二进制/十六进制转换,理解组合逻辑与时序逻辑。
阶段二:Verilog 进阶
学习状态机设计、FIFO/存储器接口及跨时钟域处理(CDC)。
阶段三:实战项目
尝试电子时钟、VGA 图像显示或简单 CPU 设计。
参考资源
- 《Verilog 数字系统设计教程》夏宇闻
- Xilinx 官方文档 UG901
- FPGA4FUN 项目网站
常见问题
- 阻塞与非阻塞赋值:
=(阻塞)用于组合逻辑,<=(非阻塞)用于时序逻辑,混用会导致故障。 - 未初始化寄存器:FPGA 上电时寄存器值随机,务必通过复位信号初始化。
- 时钟域混乱:不同频率时钟需隔离处理,避免亚稳态。
- 仿真与实机差异:仿真通过不代表能上板,需注意时序约束(.xdc 文件)。
遇到诡异问题时,检查输出驱动、锁存器情况及时钟使能信号。FPGA 的核心在于并行思维,学会用硬件方式思考问题,可拓展至神经网络加速、视频处理等领域。

