5、按键防抖控制LED
(这个只是个实例,效果不是很好,改进的请进http://forum.eepw.com.cn/thread/221172/15#147)
按键S1、S2、S3、S4,控制电平翻转进而控制LED1、LED2、LED3、LED4的亮灭,按键S8为复位键。
module key_debounce(rst_n,clk,keyin,ledout);
input rst_n;
input clk;
input[3:0] keyin;
output[3:0] ledout;
reg[19:0] cnt;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt <= 20'd0;
else
cnt <= cnt + 1'b1;
end
wire sample_pulse = cnt == 20'hF4240;
wire led0_out;
key0 U1
(
.en(sample_pulse),
.rst_n(rst_n),
.clk(clk),
.key(keyin[0]),
.ledout(led0_out)
);
wire led1_out;
key1 U2
(
.en(sample_pulse),
.rst_n(rst_n),
.clk(clk),
.key(keyin[1]),
.ledout(led1_out)
);
wire led2_out;
key2 U3
(
.en(sample_pulse),
.rst_n(rst_n),
.clk(clk),
.key(keyin[2]),
.ledout(led2_out)
);
wire led3_out;
key3 U4
(
.en(sample_pulse),
.rst_n(rst_n),
.clk(clk),
.key(keyin[3]),
.ledout(led3_out)
);
assign ledout = {led3_out,led2_out,led1_out,led0_out};
endmodule
//-----------------------key0-----------------------
module key0(en,rst_n,clk,key,ledout);
input clk;
input rst_n;
input en;
input key;
output ledout;
reg low_sw;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
low_sw <= 1'b1;
else if(en)
low_sw <= key;
end
reg low_sw_r;
always @(posedge clk )
low_sw_r <= low_sw;
wire led_ctrl = low_sw_r & (!low_sw);
reg ledout_r;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
ledout_r <= 1'b0;
else if(led_ctrl)
ledout_r <= ~ledout_r;
end
assign ledout = ledout_r;
endmodule
//-----------------------key1-----------------------
module key1(en,rst_n,clk,key,ledout);
input clk;
input rst_n;
input en;
input key;
output ledout;
reg low_sw;
always @(posedge clk )
begin
if (!rst_n)
low_sw <= 1'b1;
else if(en)
low_sw <= key;
end
reg low_sw_r;
always @(posedge clk )
low_sw_r <= low_sw;
wire led_ctrl = low_sw_r & (!low_sw);
reg ledout_r;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
ledout_r <= 1'b0;
else if(led_ctrl)
ledout_r <= ~ledout_r;
end
assign ledout = ledout_r;
endmodule
//-----------------------key2-----------------------
module key2(en,rst_n,clk,key,ledout);
input clk;
input rst_n;
input en;
input key;
output ledout;
reg low_sw;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
low_sw <= 1'b1;
else if(en)
low_sw <= key;
end
reg low_sw_r;
always @(posedge clk )
low_sw_r <= low_sw;
wire led_ctrl = low_sw_r & (!low_sw);
reg ledout_r;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
ledout_r <= 1'b0;
else if(led_ctrl)
ledout_r <= ~ledout_r;
end
assign ledout = ledout_r;
endmodule
//-----------------------key3-----------------------
module key3(en,rst_n,clk,key,ledout);
input clk;
input rst_n;
input en;
input key;
output ledout;
reg low_sw;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
low_sw <= 1'b1;
else if(en)
low_sw <= key;
end
reg low_sw_r;
always @(posedge clk )
low_sw_r <= low_sw;
wire led_ctrl = low_sw_r & (!low_sw);
reg ledout_r;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
ledout_r <= 1'b0;
else if(led_ctrl)
ledout_r <= ~ledout_r;
end
assign ledout = ledout_r;
endmodule
回复
| 有奖活动 | |
|---|---|
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
我要赚赏金打赏帖 |
|
|---|---|
| 以启明云端ESP32P4开发板实现TF卡读写功能被打赏¥28元 | |
| 【分享开发笔记,赚取电动螺丝刀】树莓派5串口UART0配置被打赏¥25元 | |
| 【STM32F103ZET6】17:分享在Rtos项目中断管理的使用经验被打赏¥23元 | |
| 【STM32F103ZET6】16:分享在中断中恢复串口任务,遇到的问题被打赏¥31元 | |
| 在FireBeetle2ESP32-C5上实现温度大气压检测及显示被打赏¥21元 | |
| 【分享开发笔记,赚取电动螺丝刀】SAME51双串口收发配置被打赏¥27元 | |
| Chaos-nano操作系统在手持式VOC检测设备上的应用被打赏¥37元 | |
| 【分享开发笔记,赚取电动螺丝刀】关于在导入第三方库lib时,wchart类型冲突的原因及解决方案被打赏¥30元 | |
| 在FireBeetle2ESP32-C5上实现温湿度检测和显示被打赏¥20元 | |
| 在FireBeetle2ESP32-C5上实现光照强度检测及显示被打赏¥21元 | |
,下回泡妞的时候下手也得快啦
我要赚赏金
