3. 硬件原理图分析:LED与按键电路

好,咱们开始啃原理图。说实话,很多初学者拿到开发板第一件事就是写代码,结果灯不亮、按键没反应,回头一查——原来是电路接错了。我当年也干过这种事,焊完板子发现LED正负极搞反了,那叫一个尴尬。

所以这一章,咱们把LED和按键的电路原理彻底讲透。你以后设计自己的板子,也能直接套用。

3.1 LED电路原理

3.1.1 限流电阻计算

LED不能直接接电源,否则会烧掉。为什么?因为LED是电流型器件,它的正向压降(VF)通常是固定的,比如红色LED约1.8V,蓝色/白色约3.0V。如果3.3V直接加在LED两端,电流会大到离谱。

所以必须串一个电阻,把电流限制在安全范围内。计算公式很简单:

R = (Vcc - V_F) / I_LED

举个例子:

  • Vcc = 3.3V(FPGA的IO电压)
  • V_F = 2.0V(红色LED)
  • I_LED = 10mA(一般LED的典型电流)

算一下:R = (3.3 - 2.0) / 0.01 = 130Ω。实际选型时,我习惯取标称值150Ω或220Ω。电流小一点,LED寿命更长。

经验值参考表:

LED颜色正向压降 V_F推荐电阻(3.3V供电)
红色1.8 - 2.2V150Ω - 220Ω
绿色2.0 - 2.4V120Ω - 180Ω
蓝色2.8 - 3.2V47Ω - 100Ω
白色2.8 - 3.4V33Ω - 68Ω

我的习惯: 如果板子上空间允许,我会用330Ω。虽然亮度低一点,但IO口电流小,FPGA更安全。你想想看,开发板又不是手电筒,能看清状态就行了。

3.1.2 灌电流 vs 拉电流

这两个概念,我见过太多人搞混了。说白了:

  • 拉电流(Sourcing Current): 电流从FPGA的IO口流出,经过LED到GND。IO口输出高电平时,LED亮。
  • 灌电流(Sinking Current): 电流从Vcc经过LED,流入FPGA的IO口。IO口输出低电平时,LED亮。

ECP5的IO口,拉电流能力一般比灌电流弱。我个人习惯用灌电流接法——LED正极接Vcc,负极通过电阻接IO口。这样IO口输出低电平时,LED亮。好处是:

  1. 灌电流能力更强,通常可达24mA
  2. FPGA上电默认是高阻态,LED不会意外点亮
  3. 抗干扰能力更好

注意: 别超过IO口的最大电流!ECP5每个IO口最大电流通常为24mA,整片FPGA的总电流也有上限。我曾经见过有人把8个LED并联在一个IO口上,结果IO口烧了。嗯,那哥们后来改行做销售了。

3.2 按键电路原理

3.2.1 上拉电阻 vs 下拉电阻

按键电路的核心问题:按键没按下时,IO口是什么电平?

答案:不能悬空。悬空的IO口会像天线一样接收噪声,导致FPGA误判。

解决方案:

  • 上拉电阻: 按键一端接GND,另一端接IO口,IO口通过电阻接到Vcc。没按下时,IO口被拉到高电平;按下时,IO口被拉到低电平。
  • 下拉电阻: 按键一端接Vcc,另一端接IO口,IO口通过电阻接到GND。没按下时,IO口被拉到低电平;按下时,IO口被拉到高电平。

我个人偏好上拉接法。为什么?因为大多数开发板默认用高电平表示“空闲”,低电平表示“触发”。而且ECP5内部有可编程的上拉电阻,可以省掉外部电阻。

电阻值怎么选?

  • 4.7kΩ - 10kΩ:标准值,功耗和抗干扰平衡
  • 1kΩ以下:功耗大,但抗干扰强(不推荐)
  • 100kΩ以上:省电,但容易受干扰

我一般用10kΩ,够用又省心。

3.2.2 消抖电路

按键按下时,你以为是一次干净的接触?实际上,机械触点会在几毫秒内弹跳多次。FPGA速度很快,可能把一次按键误判成几十次。

这就是抖动。必须消抖。

消抖有两种方式:

硬件消抖

在按键两端并联一个电容(通常0.1μF),利用电容的充放电特性滤除毛刺。简单粗暴,但需要额外元件。

// 硬件消抖电路示意
// 按键 + 10kΩ上拉电阻 + 0.1μF电容到GND
软件消抖

在FPGA里写一个延时计数器。检测到电平变化后,等10-20ms再读一次。如果电平稳定,才认为是有效按键。

// 简单的Verilog消抖代码
reg [19:0] cnt;
reg key_reg;

always @(posedge clk) begin
    if (key_in != key_reg) begin
        cnt <= 20'd0;
        key_reg <= key_in;
    end else if (cnt < 20'd1000000) begin
        cnt <= cnt + 1'b1;
    end else begin
        key_out <= key_reg;
    end
end

我的经验: 20ms的延时足够消除大部分机械按键的抖动。如果你用的是那种便宜的轻触开关,建议加到30ms。我曾经在一个项目里用了50ms,虽然手感有点迟钝,但再也没出现过误触发。

3.3 本章知识体系

下面这张图,把LED和按键电路的核心逻辑串起来了。你一看就明白:

LED与按键电路知识体系 LED电路 限流电阻计算 R = (Vcc - V_F) / I_LED 灌电流 vs 拉电流 灌电流:IO低电平 → LED亮 关键参数 V_F:1.8V~3.4V(依颜色而定) I_LED:5mA~20mA(典型10mA) 按键电路 上拉电阻 vs 下拉电阻 上拉:空闲高电平,按下低电平 消抖电路 硬件消抖:并联电容 关键参数 上拉电阻:4.7kΩ~10kΩ 消抖延时:10ms~30ms 核心原则:电流限制 + 电平稳定 + 抖动消除

这张图把LED和按键的知识点分成了两大块。左边是LED电路,右边是按键电路。你对照着原理图看,每个电阻、每个电容的作用就一目了然了。

本章核心要点:

  • LED必须串限流电阻,阻值根据Vcc、V_F和I_LED计算
  • 灌电流接法更安全,推荐使用
  • 按键必须配上拉/下拉电阻,防止IO口悬空
  • 机械按键必须消抖,硬件或软件方式均可

好了,原理图分析就到这儿。下一章咱们开始写代码,让LED真正亮起来。到时候你会发现,理解了电路原理,写代码就是水到渠成的事。


公众号:蓝海资料掘金营,微信deep3321