2014-09-13 61 views
1

我正在使用4个4-1多路复用器和4个D触发器来实现移位寄存器,并且该模块被用作去抖器(输出到移位寄存器的时钟)。我知道一个debouncer是如何工作的,以及为什么他们被使用,但有人可以解释这个代码是如何工作的?谢谢。Verilog Debouncing Module

module debounce(
    input D_in, 
    input clk_in, 
    input reset, 
    output D_out 
    ); 



reg q9, q8, q7, q6, q5, q4, q3, q2, q1, q0; 

always @ (posedge clk_in or posedge reset) 

if (reset == 1'b1) 

     {q9, q8, q7, q6, q5, q4, q3, q2, q1, q0} <= 10'b0; 
    else begin 
     q9 <= q8; q8 <= q7; q7 <= q6; q6 <= q5; q5 <= q4; 
     q4 <= q3; q3 <= q2; q2 <= q1; q1 <= q0; q0 <= D_in; 
    end 

assign D_out = !q9 & q8 & q7 & q6 & q5 & 
       q4 & q3 & q2 & q1 & q0; 

endmodule 

回答

2

基本上,你有一个10位的移位寄存器(reg [9:0] q)。在clk_in的每个正沿上,您都将D_in作为该寄存器的LSB,并将剩下的位左移。这样,你可以检查是否D_in较高的9个周期(这样你就抖吧)和驱动D_out输出:

assign D_out = !q9 & q8 & q7 & q6 & q5 & q4 & q3 & q2 & q1 & q0 

更重要的是,你必须检查,如果移位寄存器的MSB是0,所以你”我会得到一个1作为输出只有一个时钟周期。

+0

为什么8个周期?如果D_out的任何q值为零,它会不会总是输出一个零? @ Qiu – 2014-09-13 07:24:13

+0

@RayanAoun:9个周期,错字。是的,如果任何q值为零 - 输出也将为零。但这就是去抖动的工作原理 - >您正在寻找一种情况,信号在连续9个周期内稳定(高)。但MSB('q [9]')需要为'0'或者你可以得到'常量''1'。 – Qiu 2014-09-13 07:56:19