开关消抖的讨论
今天在EEPW 论坛上看到了一个前辈写的code。说是用10行实现开关消抖。当时我就在想,如果让我写一个开关消抖,我会怎么写呢,先琢磨了一下
1 //date : 2013/12/16 2 //designer :pengxiaoen 3 // version : QuartusII 13.0 64bit 4 //function : 5 module key_ON_OFF ( 6 clock ,reset, 7 key_in, 8 key_out 9 ); 10 input clock ,reset; 11 input key_in ; 12 output key_out ; 13 14 reg [7:0] counter1; 15 reg key_reg0,key_reg1,key_reg2; 16 17 always @ (posedge clock ) 18 if(!reset) begin 19 key_reg0 <= 1'd0; 20 counter1 <= 8'h00; 21 end 22 else if(counter1 == 8'dff) begin 23 counter1 <= 8'h00; 24 key_reg0 <= key_in; 25 end 26 27 always @ (posedge clock) 28 if(!reset) begin 29 key_reg1 <= 1'd0; 30 key_reg2 <= 1'd0; 31 end 32 else begin 33 key_reg1 <= key_reg0; 34 key_reg2 <= key_reg1; 35 end 36 37 assign key_out = (key_reg1 == !(key_reg2)) ? 1'd1 : 1'd0; 38 39 endmodule
一不小心 30行就被我花销掉了。看着繁琐的代码后来还是要参考前辈们的了
1 reg key_reg1,key_reg2,key_out; 2 always @( posedge clk)//CLK 50M 3 begin 4 count2<=count2+1; 5 if(count2==500000) 6 begin 7 key_reg1<=key1; 8 count2<=0; 9 end 10 key_reg2<=key_reg1; 11 key_out<=key_reg2&(!key_reg1); 12 end
代码行数只有我的一半。主要是很好看懂,思维很清晰。
个人一点私下观点:我自己的代码设计思路是参照特权同学的(没有说人家的思路不好的意思),分模块的思维很强烈,就是将电路分解出来进行设计。 而下面的一种我想到我看黑金的资料,有点像他们的设计思路,有点软件的味道。个人意见,不喜勿喷。