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.2V | 150Ω - 220Ω |
| 绿色 | 2.0 - 2.4V | 120Ω - 180Ω |
| 蓝色 | 2.8 - 3.2V | 47Ω - 100Ω |
| 白色 | 2.8 - 3.4V | 33Ω - 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亮。好处是:
- 灌电流能力更强,通常可达24mA
- FPGA上电默认是高阻态,LED不会意外点亮
- 抗干扰能力更好
注意: 别超过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电路,右边是按键电路。你对照着原理图看,每个电阻、每个电容的作用就一目了然了。
本章核心要点:
- LED必须串限流电阻,阻值根据Vcc、V_F和I_LED计算
- 灌电流接法更安全,推荐使用
- 按键必须配上拉/下拉电阻,防止IO口悬空
- 机械按键必须消抖,硬件或软件方式均可
好了,原理图分析就到这儿。下一章咱们开始写代码,让LED真正亮起来。到时候你会发现,理解了电路原理,写代码就是水到渠成的事。
公众号:蓝海资料掘金营,微信deep3321