感谢发烧友爱好者和小眼睛科技公司提供的FPGA测试机会。在上一次的测试中实现了开发环境建立和8个LED的流水灯效果,今天来完成第2个测试。这次的目的是设计 8 种彩灯效果,选择一个按键作为控制输入,按下一次换一种显示效果。在《MES2KG开发板实验指导》中提供了相应的说明,这次我们还是参考相关介绍来介绍demo的工作原理,并做一些补充和修改。
一、键盘防抖
机械式弹片按键,在按下或松开时会有机械抖动,导致在按下或松开时按键的状态不稳定,在使用按键输入信号时如果采集了抖动时的状态,会导致工程运行出现不可控的变化,故而我们需要将这段时间的抖动信号给滤除掉,也就是按键消抖。
前后抖动时间约为 5~10ms,以最大 20ms 做设计,使用计数到 N 归零的计数器来做时间刻度计时;以 20ms 的间歇对按键输入信号进行采集,从而避开按键的抖动引起的信号快速变化。下面就是防抖的代码。
`define UD #1
module btn_deb#(
parameter BTN_WIDTH = 4'd8,
parameter MS_20 = 20'd240000
)
(
input clk,//27MHz
input [BTN_WIDTH-1:0] btn_in,
output reg [BTN_WIDTH-1:0] btn_deb
);
//==================================================================================
reg [19:0] time_cnt= 20'd0;
always@(posedge clk)
begin
if(time_cnt == MS_20 - 1'b1)
time_cnt <= `UD 20'd0;
else
time_cnt <= `UD time_cnt + 1'd1;
end
always @(posedge clk)
begin
if(time_cnt == MS_20 - 1'b1)
btn_deb <= `UD btn_in;
end
endmodule
二、彩灯控制
小眼睛开发板上使用的彩灯是0603灯珠,每个灯珠有RGB三个脚进行控制,可以显示出不同的颜色。开发板上共有4个灯珠,所以使用12位数据就可以实现灯珠的切换。下面是设置灯珠的代码:
`define UD #1
module led_rgb(
input clk,//40MHz
input [2:0] ctrl,
output reg [11:0] led_rgb
);
// led_rgb status change
always @(posedge clk)
begin
case(ctrl)
3'd0 : //R
led_rgb<=`UD 12'b0000_1111_1111;
3'd1 : //G
led_rgb<=`UD 12'b1111_0000_1111;
3'd2 : //B
led_rgb<=`UD 12'b1111_1111_0000;
3'd3 : //RG
led_rgb<=`UD 12'b0000_0000_1111;
3'd4 : //RB
led_rgb<=`UD 12'b0000_1111_0000;
3'd5 : //GB
led_rgb<=`UD 12'b1111_0000_0000;
3'd6 : //RGB
led_rgb<=`UD 12'b0000_0000_0000;
default:led_rgb<=`UD 12'b1111_1111_1111;
endcase
end
endmodule
这段代码是每次4个灯同时变色,如果只想改变2个灯的颜色,也可以使用类似下面的代码:
led_rgb<=
UD 12'b0101_1111_1111;`
三、更换按键
厂商提供的demo示例是用K1控制显示,我们把它改为K3按键。根据原理图,我们可以看到KEY3所对应的FPGA管脚是60。
打开UCE之后,修改key信号对应的管脚为60即可。FPGA程序一个好处就是修改按键只需要调整管脚的分配而无需修改程序。
然后重新编译、下载程序即可。
下面的视频就是K3键控制彩灯的效果。