3、LED灯控制实战:从原理图到上板

各位同学,今天咱们来点真格的。

前面讲了那么多理论,说实话,不亲手跑一遍流程,你永远觉得 Vivado 是个黑盒子。这一章,我们就拿最经典的 LED 灯控制来开刀。别小看这个例子,它涵盖了 FPGA 开发的完整闭环:原理图分析、代码编写、约束、综合实现、生成比特流、下载上板。走完这一遍,你对整个流程就有底了。

核心目标:让开发板上的 LED 灯按我们设定的频率闪烁。

3.1 LED原理图分析

拿到一块开发板,第一件事是什么?我个人习惯,先看原理图。别急着写代码,先搞清楚灯接在哪个引脚上,是高电平点亮还是低电平点亮。

以最常见的 Xilinx 开发板为例,LED 通常通过一个三极管或直接由 FPGA 的 GPIO 驱动。我见过不少新手,上来就写代码,结果灯死活不亮,最后发现是极性搞反了。

看原理图时,重点关注三点:

  • 引脚编号:比如 LED 接在 FPGA 的 J15 引脚上。
  • 电平逻辑:是高电平亮(1 亮 0 灭),还是低电平亮(0 亮 1 灭)。
  • 限流电阻:确认外部电路是否已经配好,避免烧坏 LED。

举个例子,某块板子的原理图上写着:

LED0 —— R100 —— FPGA_J15

这意味着 FPGA 的 J15 引脚通过一个 100 欧姆电阻连接到 LED0。如果 J15 输出高电平,LED 就会亮。嗯,这里要注意,不同板子的设计可能完全相反,一定要以你的原理图为准。

我的经验:我曾经在一个项目中,因为没仔细看原理图,默认以为 LED 是高电平亮,结果板子回来怎么调都不对。后来发现那款板子的 LED 是共阳极接法,低电平才亮。白白浪费了半天时间。所以,拿到板子先看原理图,别偷懒。

3.2 LED驱动代码编写

原理图看完了,咱们开始写代码。这里我写一个最简单的计数器,让 LED 每 0.5 秒翻转一次状态。

为什么是 0.5 秒?因为人眼能分辨的闪烁频率大概在 30Hz 以下,0.5 秒翻转一次,看起来就是一亮一灭,效果很明显。

先确定时钟频率。假设板子上用的是 50MHz 晶振,那么一个时钟周期是 20ns。要产生 0.5 秒的延时,需要计数多少次?

0.5s / 20ns = 25,000,000 次

所以我们需要一个 25 位的计数器(2^25 ≈ 33,554,432,够用了)。

代码很简单,直接上 Verilog:

module led_ctrl (
    input  wire       clk,      // 50MHz 系统时钟
    input  wire       rst_n,    // 低电平复位
    output reg        led       // LED 输出
);

    // 计数器最大值:25_000_000 - 1
    parameter  MAX_CNT = 25_000_000 - 1;
    reg [24:0] cnt;

    // 计数器逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= 25'd0;
        else if (cnt == MAX_CNT)
            cnt <= 25'd0;
        else
            cnt <= cnt + 1'b1;
    end

    // LED 翻转逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led <= 1'b0;
        else if (cnt == MAX_CNT)
            led <= ~led;
        else
            led <= led;
    end

endmodule

这段代码的逻辑很直白:计数器从 0 数到 24,999,999,然后归零,同时 LED 翻转一次。这样 LED 就会以 1Hz 的频率闪烁(0.5 秒亮,0.5 秒灭)。

注意:复位信号 rst_n 是低电平有效。很多开发板的复位按键默认是高电平,按下时拉低。如果你的板子相反,记得在约束文件里做调整,或者在代码里取反。

3.3 约束文件编写

代码写完了,但 FPGA 不知道你的 clk 对应哪个引脚,也不知道 led 对应哪个引脚。这时候就需要约束文件(XDC)来告诉工具。

约束文件说白了就是一张映射表。我习惯先写引脚约束,再写时序约束。对于 LED 控制这种简单设计,时序约束可以暂时不写,但引脚约束必须写。

假设原理图上:

  • clk 接在 E3 引脚上
  • rst_n 接在 C12 引脚上
  • led 接在 J15 引脚上

那么 XDC 文件内容如下:

# 时钟引脚约束
set_property PACKAGE_PIN E3   [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

# 复位引脚约束
set_property PACKAGE_PIN C12  [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

# LED 引脚约束
set_property PACKAGE_PIN J15  [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]

这里我用了 LVCMOS33 电平标准,因为大多数开发板的 GPIO 电压是 3.3V。如果你的板子是 1.8V 或 2.5V,记得改过来。

避坑指南:我曾经遇到过一个问题,约束文件里引脚号写对了,但电平标准写错了,结果下载后 LED 微亮但不正常闪烁。查了半天才发现是 IOSTANDARD 设成了 LVCMOS18,而板子实际是 3.3V 的。电平不匹配会导致驱动能力不足,信号质量变差。

3.4 综合与实现

约束写好了,接下来就是 Vivado 的拿手好戏——综合与实现。

综合(Synthesis)是把你的 Verilog 代码翻译成 FPGA 底层能识别的网表文件。说白了,就是把逻辑门、触发器等基本单元组合起来。

实现(Implementation)则是在综合的基础上,把网表映射到具体的 FPGA 资源上,包括布局(Place)和布线(Route)。

操作步骤很简单:

  1. 在 Vivado 左侧的 Flow Navigator 中,点击 Run Synthesis。
  2. 综合完成后,查看综合报告,确认没有严重警告或错误。
  3. 点击 Run Implementation,等待布局布线完成。

这个过程可能需要几分钟。我建议你利用这个时间,检查一下综合报告里的资源使用情况。比如:

资源类型 使用量 可用量 使用率
Slice LUTs 16 53,200 <1%
Slice Registers 26 106,400 <1%
IO 3 200 1.5%

你看,一个简单的 LED 控制只用了不到 1% 的资源。这就是 FPGA 的魅力——资源多得很,随便用。

3.5 生成比特流

实现完成后,下一步就是生成比特流(Bitstream)。比特流是 FPGA 的配置文件,包含了所有逻辑和布线信息。

点击 Generate Bitstream,Vivado 会进行最后的处理,生成 .bit 文件。这个过程一般很快,几十秒到几分钟不等。

生成成功后,你可以在项目目录下的 .runs/impl_1/ 文件夹里找到 led_ctrl.bit 文件。这就是我们要下载到板子上的文件。

重要:如果生成比特流时出现时序错误(Timing Violation),不要慌。对于 LED 控制这种低速设计,通常可以忽略。但如果是高速设计,就必须回头优化代码或约束了。

3.6 下载到FPGA开发板

最后一步,也是最激动人心的一步——下载。

连接好 JTAG 下载器(比如 Digilent 的 JTAG-HS3 或板载的 USB-JTAG),给开发板上电。然后在 Vivado 中点击 Open Hardware Manager,再点击 Auto Connect。

Vivado 会自动识别你的开发板。识别成功后,右键点击 FPGA 器件,选择 Program Device,在弹出的对话框中选择刚才生成的 .bit 文件,点击 Program。

几秒钟后,下载完成。如果一切顺利,你会看到板子上的 LED 开始以 1Hz 的频率闪烁。

嗯,那种感觉,我第一次成功时还挺激动的。虽然只是点亮一个灯,但这是你亲手写代码、亲手约束、亲手下载的成果。从设计到上板,整个流程走通了。

常见问题:

  • 下载失败:检查 JTAG 连接是否松动,开发板是否上电。
  • 灯不亮:检查原理图,确认引脚号和电平极性是否正确。
  • 灯常亮不闪:检查计数器参数,确认时钟频率和计数最大值是否匹配。

本章小结

这一章我们走完了 FPGA 开发的完整流程:

  • 原理图分析:搞清楚引脚和电平
  • 代码编写:用计数器实现 LED 闪烁
  • 约束文件:告诉工具引脚位置和电平标准
  • 综合与实现:把代码变成网表并布局布线
  • 生成比特流:生成最终的配置文件
  • 下载上板:让 LED 亮起来

这个流程,以后你做任何 FPGA 项目,都绕不开。所以这一章一定要亲手做一遍,别只看不练。

好了,去点亮你的第一个 LED 吧。

可可精品资料库