清霜一梦

开关消抖的讨论

0
阅读(1088)

 今天在EEPW 论坛上看到了一个前辈写的code。说是用10行实现开关消抖。当时我就在想,如果让我写一个开关消抖,我会怎么写呢,先琢磨了一下  

//date : 2013/12/16
//designer :pengxiaoen
// version : QuartusII 13.0  64bit 
//function : 
module key_ON_OFF (
                   clock ,reset,
                         key_in,
                         key_out
                         );
input clock ,reset;
input key_in ;
output key_out ;

reg [7:0]  counter1;
reg        key_reg0,key_reg1,key_reg2;

always @ (posedge clock )
    if(!reset) begin 
             key_reg0  <= 1'd0;
                counter1  <= 8'h00;
                end 
     else if(counter1 == 8'dff)  begin 
             counter1  <= 8'h00;
                key_reg0  <= key_in;
             end 
      
always @ (posedge clock)
    if(!reset)  begin 
            key_reg1 <= 1'd0;
              key_reg2 <= 1'd0;
              end         
     else begin 
             key_reg1 <= key_reg0;
                key_reg2 <= key_reg1;
                end 
                
assign key_out = (key_reg1 == !(key_reg2)) ?  1'd1  : 1'd0; 

endmodule

一不小心 30行就被我花销掉了。看着繁琐的代码后来还是要参考前辈们的了

reg key_reg1,key_reg2,key_out;
always @( posedge clk)//CLK 50M
    begin
    count2<=count2+1;
    if(count2==500000)
    begin
        key_reg1<=key1; 
        count2<=0;
    end
    key_reg2<=key_reg1; 
    key_out<=key_reg2&(!key_reg1); 
end

代码行数只有我的一半。主要是很好看懂,思维很清晰。

 

个人一点私下观点:我自己的代码设计思路是参照特权同学的(没有说人家的思路不好的意思),分模块的思维很强烈,就是将电路分解出来进行设计。  而下面的一种我想到我看黑金的资料,有点像他们的设计思路,有点软件的味道。个人意见,不喜勿喷。