2014-09-13 2 views
1

Я реализую сдвиговый регистр, используя четыре 4-1 мультиплексора и четыре D-flip flops, и ему был дан этот модуль для использования в качестве дебютатора (который выводится на часы сдвигового регистра). Я знаю, как работает 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 

Более того, вы должны проверить, если старший бит регистра сдвига 0, так что вы» Получите 1 в качестве выхода только для одного такта.

+0

Почему 8 циклов? и если какое-либо значение q равно нулю для D_out, то он всегда будет выводить ноль? @Qiu –

+0

@RayanAoun: 9 циклов, опечатка. Да, если любое значение q равно нулю - выход тоже будет равен нулю. Но так работает debouncer -> вы ищете ситуацию, где сигнал был стабильным (и высоким) в течение 9 циклов подряд. Но MSB ('q [9]') должен быть '0', или вы можете получить« постоянный »' 1'. – Qiu