18761489033 发表于 2015-3-31 09:45:21

有关按键的问题



这个程序时,当检测到有按键按下的时候,产生一个高电平的key_pulse,用key_pilse控制led灯变化一次。
我的仿真波形和我想的都一样,但是下到板子上就是不行。请大家帮忙看一下,谢谢大家了!
(我消抖时间选用了10ms)
module ceshi(
   input wire sclk,
   input wire s_rst_n,
   input wire pi_key,
   
   output reg led
   );
   
regkey_pulse;
regpi_key_reg;
//前消抖变量
reg pre_cnt_10ms;
regpre_flag_10ms;
//后消抖变量
reg pos_cnt_10ms;
regpos_flag_10ms;

parameter CNT = 19'd49_9999;
//打一拍抓下降沿
always@(posedge sclk or negedge s_rst_n)
   pi_key_reg <= pi_key;

//前端 消抖
always@(posedge sclk or negedge s_rst_n)
   if(s_rst_n==1'b0)
    pre_flag_10ms <= 1'b0;
   else if(pi_key==1'b0&&pi_key_reg==1'b1&&pos_flag_10ms==1'b0)
    pre_flag_10ms <= 1'b1;
   else if(pre_cnt_10ms>=CNT)
    pre_flag_10ms <= 1'b0;
   else
    pre_flag_10ms <= pre_flag_10ms;
   
always@(posedge sclk or negedge s_rst_n)
   if(s_rst_n==1'b0)
    pre_cnt_10ms <= 19'd0;
   //else if(pos_flag_10ms==1'b1)
   // pre_cnt_10ms <= 19'd0;
   else if(pre_flag_10ms==1'b1)
    pre_cnt_10ms <= pre_cnt_10ms + 19'd1;
   else
    pre_cnt_10ms <= pre_cnt_10ms;

//后端消抖
always@(posedge sclk or negedge s_rst_n)
   if(s_rst_n==1'b0)
    pos_flag_10ms <= 1'b0;
   else if(pi_key==1'b1&&pi_key_reg==1'b0&&pre_flag_10ms==1'b0)
    pos_flag_10ms <= 1'b1;
   else if(pos_cnt_10ms>=CNT)
    pos_flag_10ms <= 1'b0;
   else
    pos_flag_10ms <= pos_flag_10ms;
   
always@(posedge sclk or negedge s_rst_n)
   if(s_rst_n==1'b0)
    pos_cnt_10ms <= 19'd0;
   //else if(pre_flag_10ms==1'b1)
   // pos_cnt_10ms <= 19'd0;
   else if(pos_flag_10ms==1'b1)
    pos_cnt_10ms <= pos_cnt_10ms + 19'd1;
   else
    pos_cnt_10ms <= pos_cnt_10ms;
   
//前抖消除之后产生一个key_pulse
always@(posedge sclk or negedge s_rst_n)
   if(s_rst_n==1'b0)
    key_pulse <= 1'b0;
   else if(pre_cnt_10ms==CNT)
    key_pulse <= 1'b1;
   else
    key_pulse <= 1'b0;
   
always@(posedge sclk or negedge s_rst_n)
   if(s_rst_n==1'b0)
    led <= 4'b0011;
   else if(key_pulse==1'b1)
    led <= 4'b1100;
   else
    led <= led;
   
endmodule



页: [1]
查看完整版本: 有关按键的问题