如何用verilog语言实现按键按一次是开始,再按一次是暂停

2019-07-15 21:17发布

按键是按下后自动弹起的 没法根据按键的高低电平判断按键是开始状态还是暂停状态 这个应该怎么实现按键两种状态的判断呢 求解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
无影000
1楼-- · 2019-07-16 00:08
大神赶紧知道我一下呀 如何判断状态
钟哥30
2楼-- · 2019-07-16 04:35
本帖最后由 钟哥30 于 2017-11-8 15:17 编辑

使用边沿检测试试
reg key1,key2;
wire key_pos,key_neg;
always@(posedge clk) begin
  if(!rse_n) begin
    key1 <= 1'b1;    key2 <= 1'b1;
  end
  else begin
    key1 <= key;//key连接按键的IO口
    key2 <= key1;
  end
end
assign key_neg = key2&&(!key1);
assign key_pos = (!key2) && key1;
reallmy
3楼-- · 2019-07-16 10:21
 精彩回答 2  元偷偷看……
无影000
4楼-- · 2019-07-16 14:56
钟哥30 发表于 2017-11-8 15:14
使用边沿检测试试
reg key1,key2;
wire key_pos,key_neg;

这是监测上升沿和下降沿的,按键不是自锁按键,按下后自动弹起,这个解决了,用状态机写的
无影000
5楼-- · 2019-07-16 16:10
module control_cnt(clk_100hz,reset,on_off,pause);
input clk_100hz,reset,on_off;
output reg pause;
reg [1:0] current_state;
reg [1:0] next_state;
parameter [1:0] clear=2'b00;
parameter [1:0] on=2'b01;
parameter [1:0] off=2'b10;
always@(posedge clk_100hz or negedge reset)
begin
   if(!reset)
     current_state<=clear;
   else
     current_state<=next_state;
end
always@(current_state or on_off or reset)
begin
   case(current_state)
           clear:
             begin
                    if(!reset)
                           begin
                                  next_state=clear;
                                  pause=0;
                                end
                         else
                          begin
                           if(on_off)
                            begin
                                  next_state=on;
                                  pause=1;
                                 end
                           else
                            begin
                                  next_state=clear;
                                  pause=0;
                                 end
                    end
                 end
                on:
                  begin
                    if(!reset)
                           begin
                                 next_state=clear;
                                 pause=0;
                                end
                         else
                           begin
                             if(on_off)
                              begin
                                     next_state=off;
                                     pause=0;
                                   end
                                  else
                                   begin
                                          next_state=on;
                                          pause=1;
                                        end
                                end
                  end
                off:
                  begin
                    if(!reset)
                           begin
                                     next_state=clear;
                                     pause=0;
                                end
                    else
                           begin
                            if(on_off)
                                   begin
                                      next_state=on;
                                          pause=1;
                                        end
                                 else
                                   begin
                                           next_state=off;
                                                pause=0;
                                        end
                          end       
                  end
                default:    next_state=off;
         endcase
  end
endmodule

最后用了状态机控制输出pause信号,同一个非自锁开关按键作开始和暂停键,低电平表示开始,高电平表示暂停
qpalzmal
6楼-- · 2019-07-16 17:54
按键按下做一个去抖动后提上升沿,产生一个脉冲信号,当检测到该脉冲给计数器加1。当脉冲到来且计数器最低位为0则产生start信号,当脉冲到来且计数器最低位为1则产生stop信号

一周热门 更多>