一、到底啥是 FPGA?
刚接触硬件的同学可能会疑惑:这货和单片机有啥区别?简单来说,FPGA 就像一张白纸(Field Programmable Gate Array 现场可编程门阵列),你可以用硬件描述语言(比如 Verilog)在上面"画"出任意数字电路。
单片机是现成的芯片(固定架构),而 FPGA 允许你从底层构建电路。举个栗子:单片机是组装好的乐高套装,FPGA 就是一堆零散的积木块,想拼成飞机还是坦克全看你的代码怎么写!
二、开发环境搭建
1. 安装包获取
到 Xilinx 官网下载 Vivado Design Suite(社区版免费)。建议选用 2020.1 或更高版本(对新手更友好)。安装时记得勾选"Vivado HL Design Edition"和对应器件支持(比如 Artix-7 系列)。
2. 硬件准备
推荐先用在线仿真器练手,等基础扎实了再入手硬件:
- Nexys A7(约$200)
- Basys3(入门级首选)
- DE10-Nano(带 ARM 双核)
3. 第一个工程创建
打开 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
核心语法要点:
module/endmodule➔ 电路模块定义input/output➔ 输入输出端口wire/reg➔ 线网与寄存器assign➔ 组合逻辑赋值always➔ 过程块(时序逻辑)posedge/negedge➔ 时钟边沿检测if/else➔ 条件判断case➔ 多路选择parameter➔ 参数定义#➔ 延时控制(仅仿真用)
四、实战:LED 流水灯
1. 代码实现
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


