完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
module sw_debounce(
clk,rst_n, sw1_n,sw2_n,sw3_n, led_d1,led_d2,led_d3 ); input clk; //主时钟信号,50MHz input rst_n; //复位信号,低有效 input sw1_n,sw2_n,sw3_n; //三个独立按键,低表示按下 output led_d1,led_d2,led_d3; //发光二极管,分别由按键控制 //--------------------------------------------------------------------------- reg[2:0] key_rst; always @(posedge clk or negedge rst_n) if (!rst_n) key_rst <= 3'b111; else key_rst <= {sw3_n,sw2_n,sw1_n}; reg[2:0] key_rst_r; //每个时钟周期的上升沿将low_sw 信号锁存到low_sw_r 中 always @ ( posedge clk or negedge rst_n ) if (!rst_n) key_rst_r <= 3'b111; else key_rst_r <= key_rst; //当寄存器key_rst 由1 变为0 时,led_an 的值变为高,维持一个时钟周期 wire[2:0] key_an = key_rst_r & ( ~key_rst); //--------------------------------------------------------------------------- reg[19:0] cnt; //计数寄存器 always @ (posedge clk or negedge rst_n) if (!rst_n) cnt <= 20'd0; //异步复位 else if(key_an) cnt <=20'd0; else cnt <= cnt + 1'b1; reg[2:0] low_sw; always @(posedge clk or negedge rst_n) if (!rst_n) low_sw <= 3'b111; else if (cnt == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw 中 cnt == 20'hfffff low_sw <= {sw3_n,sw2_n,sw1_n}; //--------------------------------------------------------------------------- reg [2:0] low_sw_r; //每个时钟周期的上升沿将low_sw 信号锁存到low_sw_r 中 always @ ( posedge clk or negedge rst_n ) if (!rst_n) low_sw_r <= 3'b111; else low_sw_r <= low_sw; //当寄存器low_sw 由1 变为0 时,led_ctrl 的值变为高,维持一个时钟周期 wire[2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]); reg d1; reg d2; reg d3; always @ (posedge clk or negedge rst_n) if (!rst_n) begin d1 <= 1'b0; d2 <= 1'b0; d3 <= 1'b0; end else begin //某个按键值变化时,LED 将做亮灭翻转 if ( led_ctrl[0] ) d1 <= ~d1; if ( led_ctrl[1] ) d2 <= ~d2; if ( led_ctrl[2] ) d3 <= ~d3; end assign led_d3 = d1 ? 1'b1 : 1'b0; //LED 翻转输出 assign led_d2 = d2 ? 1'b1 : 1'b0; assign led_d1 = d3 ? 1'b1 : 1'b0; endmodule 关于这个实验有两个疑问: 1.第一个连续赋值语句的功能应该是当检测到按键按下的动作时key_an为高脉冲,此时计数寄存器清零。然而后面的解释却解释成"一旦发现按键出现从0到1的释放抖动,就对计数器寄存清零",这里不太理解? 2.第二个连续赋值诗句的注释是“当寄存器low_sw 由1 变为0 时,led_ctrl 的值变为高,维持一个时钟周期 ”,然而后面的解释是“当键值由0跳变到1时,(按键释放时)才可能把led_ctrl拉高“,如果是第二个解释,那么语句是不是应该改成 wire[2:0] led_ctrl = (~low_sw_r[2:0]) & low_sw[2:0]; 才对呢?
|
|
相关推荐
5个回答
|
|
|
|
|
|
先谢谢特权同学的回复,我看的是您出版的深入浅出玩转FPGA的书,其实看不懂的主要是上述代码中的两个连续赋值语句,可不可以解释下这两个语句功能上的异同,还有就是这段代码我已了许多遍,想了也挺久了,还是不懂,所以才发贴的。 |
|
|
|
这里的按键消抖程序也是看了很久还不懂。。。不过前不久看过一个利用四个寄存器设置的消抖程序。。。。
|
|
|
|
答案呢
|
|
|
|
很好 正看按键消抖呢 各种郁闷 终于找到了资料 谢谢分享
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1634 浏览 1 评论
1396 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1608 浏览 0 评论
937 浏览 0 评论
2404 浏览 0 评论
1491 浏览 37 评论
5692 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 08:29 , Processed in 0.785544 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号