完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
module led (
clk,rst_n,key1, led ); input clk; input rst_n; input key1; output[3:0] led; //------------------------键盘消抖程序--------------------------------------------------- reg reg0_key; reg reg1_key; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin reg0_key <= 1'b1; reg1_key <= 1'b1; end else begin reg0_key <= key1; reg1_key <= reg0_key; //根据非阻塞赋值的原理,reg1_key存储的值是reg0_key上一个时钟的值 end end //当寄存器key1由1变为0时,led_an的值变为高,维持一个时钟周期 wire key_an; assign key_an = reg1_key & ( ~reg0_key); //--------------------------------------------------------------------------- reg[19:0] cnt_key; //计数寄存器 always @ (posedge clk or negedge rst_n) begin if (!rst_n) cnt_key <= 20'd0; //异步复位 else if(key_an) cnt_key <=20'd0; else cnt_key <= cnt_key + 1'b1; end reg reg_low; reg reg1_low; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin reg_low <= 1'b1; end else if(cnt_key == 20'hfffff) begin reg_low <= key1; //cnt == 20'hfffff,20ms end end always @(posedge clk or negedge rst_n) begin if (!rst_n) reg1_low <= 1'b1; else reg1_low <= reg_low; end //--------------------------------------------------------------------------- //当寄存器reg_low由1变为0时,key_low的值变为高,维持一个时钟周期 wire key_low = reg1_low & ( ~reg_low); //===============LED控制================================== reg[21:0] cnt; // always @(posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 22'b0; else cnt <= cnt + 1'b1; end reg enable_r; always @(posedge clk or negedge rst_n) begin if(!rst_n) enable_r <= 1'b0; else if (cnt == 22'h3fffff) enable_r <= 1'b1; else enable_r <= 1'b0; end wire enable; assign enable = enable_r; reg[3:0] led_r; always @(posedge clk or negedge rst_n) begin if(!rst_n) led_r <= 4'b0111; else if(key_low) led_r <= 4'b0; else if(enable & !key_low) led_r <= {led_r[0],led_r[3:1]}; else ; end wire[3:0] led; assign led = led_r; endmodule这个程序为什么没起到按键消抖地作用 谁能帮忙看一下谢啦 |
|
相关推荐
6个回答
|
|
|
lz可以说说你说的没有起到按键消抖地作用是什么意思吗?我认为按键消抖的程序没有什么问题啊。
|
|
|
|
|
|
//------------------------键盘消抖程序---------------------------------------------------
reg reg0_key; reg reg1_key; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin reg0_key <= 1'b1; reg1_key <= 1'b1; end else begin reg0_key <= key1; reg1_key <= reg0_key; //根据非阻塞赋值的原理,reg1_key存储的值是reg0_key上一个时钟的值 end end //当寄存器key1由1变为0时,led_an的值变为高,维持一个时钟周期 wire key_an; assign key_an = reg1_key & ( ~reg0_key); //--------------------------------------------------------------------------- reg[19:0] cnt_key; //计数寄存器 always @ (posedge clk or negedge rst_n) begin if (!rst_n) cnt_key <= 20'd0; //异步复位 else if(key_an) cnt_key <=20'd0; else cnt_key <= cnt_key + 1'b1; end reg reg_low; reg reg1_low; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin reg_low <= 1'b1; end else if(cnt_key == 20'hfffff) begin reg_low <= key1; //cnt == 20'hfffff,20ms end end always @(posedge clk or negedge rst_n) begin if (!rst_n) reg1_low <= 1'b1; else reg1_low <= reg_low; end //--------------------------------------------------------------------------- //当寄存器reg_low由1变为0时,key_low的值变为高,维持一个时钟周期 wire key_low = reg1_low & ( ~reg_low); 这段程序应该能够实现你的这个结论的————即在按键下降延到来的20ms后key_low会产生一个持续时间为一个时钟周期的高电平脉冲,并且就散你一直按着按键也不会再产生新的脉冲啦。所以你这个按键消抖程序应该没有什么问题啊 |
|
|
|
|
|
|
|
|
可是结果应该是按了KEY后会出现都亮或者灭的现象,我想问的是为什么没出现呢? |
|
|
|
|
|
如果你不按按键,就让程序跑,出现的是什么现象啊?是不是出现流水灯的效果啊
|
|
|
|
|
|
是啊,为什么按键后不会变,是key_low只有一个周期的原因吗,该怎么改呢 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
NVMe高速传输之摆脱XDMA设计49:主要功能测试结果与分析1
1280 浏览 0 评论
888 浏览 0 评论
842 浏览 0 评论
619 浏览 0 评论
977 浏览 0 评论
4425 浏览 63 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:49 , Processed in 0.634888 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
703