FPGA 基础概念
刚接触硬件的同学常问,FPGA 和单片机有什么区别?简单来说,FPGA(Field Programmable Gate Array)就像一张白纸,你可以用硬件描述语言(如 Verilog)在上面'画'出任意数字电路。单片机是固定架构的芯片,而 FPGA 允许你从底层构建电路逻辑。如果把单片机比作组装好的乐高套装,FPGA 就是一堆零散的积木块,想拼成飞机还是坦克全看你的代码怎么写。
开发环境搭建
工具准备
前往 Xilinx 官网下载 Vivado Design Suite(社区版免费)。建议选用 2020.1 之后的版本,对新手更友好。安装时记得勾选 Vivado HL Design Edition 以及对应器件支持(例如 Artix-7 系列)。
硬件选择
推荐先用在线仿真器练手,等基础扎实了再入手硬件。常见入门开发板包括 Nexys A7、Basys3 或带 ARM 双核的 DE10-Nano。
工程创建
打开 Vivado 后点击 Create Project,选择 RTL Project 并添加新 Verilog 文件。关键一步是选择器件型号,通常选 xc7a35tcsg324-1(对应多数入门开发板)。
Verilog 核心语法
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 流水灯
代码实现
我们需要一个分频器将 100MHz 时钟降至 1Hz,再通过移位逻辑驱动 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


