我正在使用4个4-1多路复用器和4个D触发器来实现移位寄存器,并且该模块被用作去抖动器(其输出到移位寄存器的时钟)。我知道debouncer是如何工作的以及为什么使用它们但有人可以解释这段代码的工作原理吗?感谢。
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
答案 0 :(得分: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
作为输出。