当前位置:首页 > 新闻资讯 > FPGA之家动态 >

极简控制的案例(新手入门,利用FPGA实现的 4 路 LED 流水灯实例)

时间:2026-02-04      来源:FPGA_UCY 关于我们 0

虽然这是一个极简、可快速上手、结果直观的 FPGA 实例,但行文仍然很长,请耐心看完,一定就学会了,多练几次就掌握了。我选择最经典的「4 路 LED 流水灯」项目(无复杂算法、无高端 IP 核、直观可见结果),全程基于 Xilinx Vivado 2020.2,清晰讲解工具使用逻辑顺序、软硬件对应关系、提前配置的条件 / 边界 / 协议,所有步骤,新手均可复现,且能覆盖 FPGA 开发的核心流程(与复杂 的DFT(离散傅里叶变换) 项目的工具流程完全一致,只是功能简化)。

先明确核心目标

通过 FPGA 控制开发板上的 4 个 LED 灯,实现「依次点亮、循环往复」的流水灯效果,从而掌握:

Vivado 工具的完整线性使用流程(从工程创建到烧录验证)软件代码(Verilog)与硬件(LED、FPGA 引脚)的对应关系提前配置的核心项(芯片型号、引脚、电平、通信协议)JTAG/SPI 烧录的简化实操(暂不涉及复杂文件转换)前置准备(极简版,新手易获取)1. 硬件准备(核心是「FPGA 开发板 + LED」,无复杂外设)

硬件名称

选型 / 要求

核心作用

新手注意事项

FPGA 开发板

Xilinx Artix-7 XC7A35T(入门级,性价比高,带 4 个 LED)

核心硬件载体,运行流水灯逻辑

开发板自带 LED(已焊接好,无需手动接线),自带 JTAG 接口,无需额外仿真器

电源线

开发板配套 DC 5V 电源线

为开发板供电

避免使用非标电源,防止烧坏 FPGA

USB 线

Micro USB/Type-C(连接开发板 JTAG 与电脑)

实现电脑与 FPGA 的 JTAG 通信(烧录 + 调试)

用原装 USB 线,减少接触不良问题

2. 软件准备(仅需 1 个工具,无需额外配置)第一部分:极简项目实操(LED 流水灯)整体工具使用逻辑顺序(线性流程,无跳步,新手可照做)

创建工程(绑定芯片型号)→ 编写Verilog软件代码(定义LED逻辑)→ 编写引脚约束文件(软硬件映射)→ 综合/布局布线(生成比特流)→ JTAG烧录(调试验证)→ SPI烧录(固化量产)

核心操作步序:软件定义功能→约束绑定硬件→编译生成配置文件→烧录到 FPGA/Flash,这是所有 FPGA 项目的通用流程,复杂 DFT 项目只是功能模块不同,流程完全一致。

步骤 1:创建 Vivado 工程(提前绑定芯片型号,核心配置)

这一步是「给项目定硬件载体」,提前配置好芯片型号,避免后续编译出错。

打开 Vivado 2020.2,点击「Create Project」(创建工程),点击「Next」;工程名称填写「LED_Flow」,保存路径选择无中文、无空格的文件夹(如D:\FPGA_Project\LED_Flow),取消「Create project subdirectory」,点击「Next」;选择「RTL Project」(Verilog 代码开发),取消「Add existing files」,点击「Next」;点击「Add Source」,选择「Create File」,文件名填写「led_flow」,文件类型选择「Verilog」,点击「OK」,再点击「Next」;点击「Add Constraint」,选择「Create File」,文件名填写「led_constraint」,文件类型选择「XDC」(引脚约束文件),点击「OK」,再点击「Next」;核心配置:选择芯片型号(提前配置的硬件核心): 搜索框输入「xc7a35t」,依次展开「xc7a35t」→「1cpG236」→「xc7a35t-1cpg236c」,选中后点击「Next」;核对工程信息,点击「Finish」,等待工程创建完成(自动进入 Vivado 主界面)。步骤 2:编写 Verilog 软件代码(定义流水灯逻辑,无复杂算法)

这一步是「软件定义功能」,实现 4 个 LED 依次点亮,循环往复,代码极简,注释详细,新手可直接复制。

在左侧「Project Manager」中,展开「Sources」→「Design Sources」,双击「led_flow.v」,打开代码编辑窗口;删除默认代码,粘贴以下极简 Verilog 代码:

这部分如果不熟悉,直接跳过,看后面代码的详细解释

verilog

// LED流水灯:4个LED依次点亮,每个LED点亮500ms,循环往复
// 核心:计数器延时(基于50MHz系统时钟)+ LED输出逻辑
module led_flow(
    input clk,          // 开发板自带50MHz系统时钟(FPGA核心时钟)
    input rst_n,        // 低电平复位(开发板自带复位按键,低电平有效)
    output reg [3:0] led // 4路LED输出(对应LED0~LED3)
);
// 步骤1:定义计数器(实现500ms延时,50MHz时钟=每周期20ns)
// 500ms = 500_000_000ns / 20ns = 25_000_000个时钟周期
reg [24:0] cnt; // 25位计数器,最大值可覆盖25_000_000
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt <= 25'd0; // 复位时计数器清零
    end else if(cnt == 25'd24_999_999) begin
        cnt <= 25'd0; // 计数器达到最大值,清零重新计数
    end else begin
        cnt <= cnt + 1'd1; // 计数器自增
    end
end
// 步骤2:流水灯逻辑(计数器每满500ms,切换下一个LED点亮)
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        led <= 4'b0001; // 复位时,仅LED0点亮
    end else if(cnt == 25'd24_999_999) begin
        // 循环移位:每次将点亮的LED右移一位,最后一位回到第一位
        led <= {led[2:0], led[3]};
    end else begin
        led <= led; // 计数器未到最大值,保持当前LED状态
    end
end
endmodule

3.保存代码(快捷键「Ctrl+S」),无红色报错即语法正确(新手重点:避免中文标点、括号不匹配)。

步骤 3:编写 XDC 引脚约束文件(软硬件对应,核心桥梁)

这一步是「把软件信号绑定到硬件引脚」,是新手最容易忽略的核心步骤,没有约束文件,FPGA 不知道哪个软件信号对应哪个硬件 LED。

在左侧「Project Manager」中,展开「Sources」→「Constraints」,双击「led_constraint.xdc」,打开约束编辑窗口;删除默认代码,粘贴以下约束代码(引脚需与你的开发板手册一致,此处以 XC7A35T 开发板为例):

xdc

// 1. 绑定系统时钟(50MHz,开发板自带晶振引脚)
set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
// 2. 绑定复位按键(低电平复位,开发板自带复位引脚)
set_property PACKAGE_PIN U7 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
// 3. 绑定4路LED引脚(软硬件对应核心,提前从开发板手册查询)
set_property PACKAGE_PIN T14 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN R14 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property PACKAGE_PIN N15 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property PACKAGE_PIN M15 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]

核心约束解释(新手必懂): set_property PACKAGE_PIN XXX

get_ports XXX

:将软件信号(如clk)绑定到 FPGA 硬件引脚(如W5); set_property IOSTANDARD LVCMOS33

get_ports XXX

:设置引脚电平标准为 3.3V(提前配置的硬件边界,不可修改);保存约束文件(快捷键「Ctrl+S」),无红色报错即约束格式正确。步骤 4:生成比特流文件(编译工程,连接组态与烧录)

这一步是「Vivado 将软件代码 + 约束文件转换为 FPGA 可识别的配置文件(.bit)」,无需手动配置复杂参数,默认即可,新手只需点击按钮等待。

点击 Vivado 顶部菜单栏「Flow」→「Generate Bitstream」(生成比特流);弹出提示窗口,点击「Yes」(自动执行综合、布局布线、生成比特流,全程无需干预);等待编译完成(进度条走完,底部提示「Bitstream Generation Completed Successfully」),无报错即成功;此时工程目录下会生成「led_flow.bit」文件(烧录的核心载体,与复杂 DFT 项目的.bit 文件本质一致)。第二部分:简化版 JTAG/SPI 烧录(直观验证,新手易成功)核心逻辑:JTAG 用于「调试」(掉电丢失,快速验证),SPI 用于「量产」(固化到 Flash,上电自动运行),硬件连接完全一致。步骤 1:JTAG 烧录(调试阶段,极简操作,直观验证)硬件连接(提前配置,无复杂接线): 用 USB 线连接开发板的「JTAG 接口」与电脑; 给开发板插上 DC 5V 电源线,打开电源开关(开发板指示灯亮,说明供电正常);软件操作(Vivado 极简步骤): 点击 Vivado 顶部菜单栏「Open Hardware Manager」(硬件管理界面); 点击左侧「Open Target」→「Auto Connect」(自动连接 JTAG 设备,Vivado 默认适配 JTAG 协议,无需手动配置速率); 连接成功后,界面显示 FPGA 芯片型号(「xc7a35t_1」),右键点击该芯片,选择「Program Device」; 弹出配置窗口,「Bitstream File」已自动匹配生成的「led_flow.bit」,勾选「Verify」(烧录后自动验证),点击「Program」; 等待进度条走完(约 10 秒),提示「Program Succeeded」即烧录成功;直观验证结果: 观察开发板上的 4 个 LED,是否实现「依次点亮、循环往复」(每个 LED 亮 500ms); 若流水灯正常运行,说明「软件代码→约束文件→烧录」全流程正确;若异常,优先检查引脚约束是否与开发板手册一致。步骤 2:SPI 烧录(量产阶段,简化版,避开复杂 mcs 文件手动生成)

新手无需手动转换 mcs 文件,Vivado 可直接将.bit 文件烧录到 SPI Flash,简化操作:

硬件连接:与 JTAG 烧录完全一致,无需重新接线;软件操作(极简步骤): 保持 Hardware Manager 界面,右键点击 FPGA 芯片,选择「Program Flash」; 弹出配置窗口,提前配置「Flash Device」(选择开发板外接 Flash 型号,如「Winbond W25Q32JV」); 「Bitstream File」选择「led_flow.bit」,勾选「Erase Flash Before Programming」(烧录前擦除 Flash),点击「Program」; 等待进度条走完(约 1 分钟,比 JTAG 慢,因为要写入 Flash),提示「Flash Program Succeeded」即烧录成功;验证结果: 断开 USB 线(JTAG)和电源线,关闭开发板电源; 重新给开发板插上电源线,打开电源开关; 观察 LED 是否自动开始流水灯运行(无需连接电脑,FPGA 从 SPI Flash 自动读取配置文件); 若正常运行,说明 SPI Flash 烧录成功,实现「上电自动启动」,满足量产需求。关键知识点讲解(新手必懂,覆盖工具 / 软硬件 / 协议)1. 工具使用的逻辑关系(线性流程,可迁移到所有 FPGA 项目)

工具步骤

核心作用

与前后步骤的关系

新手注意事项

创建工程(绑定芯片)

定硬件载体

后续所有步骤的基础,芯片型号错误会导致后续编译 / 烧录失败

必须与开发板芯片型号完全一致,不可随意选择

编写 Verilog 代码

定软件功能

定义 FPGA 要实现的逻辑,是项目的核心

新手优先写极简逻辑,先保证功能正确,再优化

编写 XDC 约束

软硬件桥梁

把软件信号绑定到硬件引脚,无约束则硬件无响应

引脚必须与开发板手册一致,电平标准不可超出 FPGA 承受范围

生成比特流

转换配置文件

将「软件代码 + 约束」转换为 FPGA 可识别的二进制文件

编译无报错不代表功能正确,需烧录后硬件验证

JTAG 烧录

调试验证

快速验证功能,掉电丢失,适合调试阶段

无需固化,操作简单,优先用 JTAG 验证功能,再用 SPI 固化

SPI 烧录

量产固化

固化到 Flash,上电自动运行,适合量产

需匹配 Flash 型号,烧录后无需连接电脑,可独立运行

2. 软硬件对应关系(核心总结,新手可记牢)

电脑(Vivado)→ 软件代码(Verilog,定义流水灯逻辑)→ 约束文件(XDC,绑定引脚)→ 比特流文件(.bit)→ JTAG/SPI协议 → FPGA(内部IOB引脚)→ 硬件(LED灯)

3. 提前配置的核心边界 / 条件 / 协议(新手避坑总结)

类别

核心提前配置项

不可突破的边界

协议默认配置(无需手动修改)

硬件

1. FPGA 芯片型号

2. LED / 时钟 / 复位引脚

3. IO 电平标准(LVCMOS33)

1. 芯片型号不可与开发板不符

2. 引脚不可绑定未焊接外设

3. 电平不可超过 3.3V(Artix-7)

JTAG 协议:4 线制,1MHz 低速,自动适配

SPI 协议:主从模式,自动匹配 Flash 型号

软件

1. 工程与芯片型号绑定

2. Verilog 代码时序同步于时钟

3. XDC 约束格式正确

1. 代码不可有中文标点 / 语法错误

2. 约束不可遗漏核心信号(时钟 / 复位 / LED)

3. 计数器位数不可不足以覆盖延时需求

无协议配置,仅需保证代码 / 约束格式正确

附:代码详细解释

下面就流水灯的 Verilog 代码,进行逐句语法解析,并详细推导延时计算的转换过程(新手最困惑的 50MHz 时钟→500ms 延时),同时点明新手易踩的语法坑,让你不仅能复制代码,还能理解背后的逻辑,后续可自行修改延时时间或扩展 LED 数量。

先明确代码整体框架


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言