在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6235|回复: 11

[求助] 按键消抖控制LED灯亮灭

[复制链接]
发表于 2014-8-28 09:08:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
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

结果应该是按了KEY后会出现都亮或者灭的现象,我想问的是为什么没出现呢?按键消抖程序应该没问

题啊
发表于 2014-8-28 09:12:32 | 显示全部楼层
能不能说明下。你主要想实现什么功能。
 楼主| 发表于 2014-8-28 09:56:49 | 显示全部楼层
回复 2# sonson2008

当按下按键开关LEY后LED灯全亮,按rst_n后复位则为流水灯。(低电平LED灯亮)
发表于 2014-8-28 14:27:47 | 显示全部楼层
你这里的按下按键是指按住不放还是按一下就松开?
发表于 2014-8-28 15:42:45 | 显示全部楼层
你自己代码都写了“key_low的值变为高,维持一个时钟周期” 当然灯全亮就一个周期啊 然后就又走马灯了 一个周期全亮你能看出来?
 楼主| 发表于 2014-8-28 20:57:34 | 显示全部楼层
回复 5# layueliu那应该怎么写呢你能帮我改改吗
 楼主| 发表于 2014-8-28 20:58:32 | 显示全部楼层
回复 4# sonson2008


   这有区别吗,这两种分别应该是什么啊?我都试了,不行啊
发表于 2014-8-29 09:16:27 | 显示全部楼层
module led_test(
   input             clk,
   input             rst_n,
   input             key1,
   output reg [3:0]  led
    );
   
//-----------------
// reg declaration
//-----------------
   reg[4:0] key1_reg    = 5'd0;
   reg      switch      = 1'b1;
//----------------
// main code
//----------------
   always @(posedge clk or negedge rst_n) begin
      if(!rst_n)
         key1_reg    <= 5'd0;
      else  
         key1_reg    <= {key1_reg[3:0],key1};
   end
   
   always @(posedge clk or negedge rst_n) begin
      if(!rst_n)
         switch <= 1'b1;
      else if(key1_reg == 5'd1)
         switch <= 1'b0;
   end  

   always @(posedge clk or negedge rst_n) begin
      if(!rst_n)
         led <= 4'd1;
      else if(switch)
         led <= {led[2:0],led[3]};
      else
         led <= 4'hf;
   end

endmodule
发表于 2014-8-29 09:24:33 | 显示全部楼层
//else if(key_low)
//led_r <= 4'b0;
//else if(enable & !key_low)
//led_r <= {led_r[0],led_r[3:1]};

key_low改为reg1_low试试
 楼主| 发表于 2014-8-29 10:10:22 | 显示全部楼层
回复 8# sonson2008


   这是什么功能?好像没出现想要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-7-13 17:33 , Processed in 0.038711 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表