【问题标题】:Verilog Debouncing ModuleVerilog 去抖模块
【发布时间】:2014-09-13 15:56:38
【问题描述】:

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

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

【问题讨论】:

    标签: verilog


    【解决方案1】:

    基本上,您有一个 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 作为仅一个时钟周期的输出。

    【讨论】:

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