Verilog去抖动模块

Verilog去抖动模块,verilog,Verilog,我正在使用四个4-1多路复用器和四个D触发器实现一个移位寄存器,并将该模块用作去抖动器(输出到移位寄存器的时钟)。我知道去Bouncer是如何工作的,为什么要使用它们,但是有人能解释一下这个代码是如何工作的吗?谢谢 module debounce( input D_in, input clk_in, input reset, output D_out ); reg q9, q8, q7, q6, q5, q4, q3, q2, q1, q0; al

我正在使用四个4-1多路复用器和四个D触发器实现一个移位寄存器,并将该模块用作去抖动器(输出到移位寄存器的时钟)。我知道去Bouncer是如何工作的,为什么要使用它们,但是有人能解释一下这个代码是如何工作的吗?谢谢

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
模块去盎司(
输入D_in,
输入clk_in,
输入复位,
输出数据输出
);
注册编号q9、q8、q7、q6、q5、q4、q3、q2、q1、q0;
始终@(posedge锁定或posedge重置)
如果(重置==1'b1)

{q9,q8,q7,q6,q5,q4,q3,q2,q1,q0}基本上,您有一个10位移位寄存器(
reg[9:0]q
)。在
clk_in
的每个正边缘上,您将
D_作为该寄存器的LSB放入
,并将其余位向左移位。这样,您就可以检查
D_in
是否在9个周期内处于高位(因此您可以对其进行去抖动),并驱动
D_out
输出:

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

更重要的是,您必须检查移位寄存器的MSB是否为
0
,这样您将得到一个
1
作为一个时钟周期的输出。

为什么是8个周期?如果D_out的q值为零,它不总是输出一个零吗@Qiu@RayanAoun:9个周期,打字错误。是的,如果任何q值为零,输出也将为零。但这就是去抖器的工作原理->您正在寻找一种情况,即信号连续9个周期保持稳定(和高)。但是MSB(
q[9]
)必须是
0
,或者可以得到“常量”
1