[size=+0]建立2個寄存器,形成二級寄存器。在時鐘觸發中,首先把被測數據送入第一個寄存器中,然后在下一個時鐘上沿到來時,將第一個寄存器中的數據存入第二個寄存器,也就是說第二個寄存器中的數據始終比第一個寄存器晚一個周期,即晚一個數據,然后再將第一個寄存器中的數據取反與第二個寄存器的數據相與,產生的數存入一個新的寄存器里,這樣產生的結果是當第一個寄存器中的數據(注意:不是被測數據)由1變為0時(即下降沿),就會在新的寄存器里產生一個高電平,并維持一個周期;如果是檢測上升沿,則是將第二個寄存器取反,然后與第一個寄存器值相與,結果存入新的寄存器中,這樣將會在被測數據的上升沿時,新的寄存器里產生一個高電平。
[size=+0]例子:
[size=+0]reg[2:0] key_rst;
[size=+0]always @(posedge clk or negedge rst_n)
if (!rst_n) key_rst <= 3'b111;
else key_rst <= {sw3_n,sw2_n,sw1_n};
[size=+0]reg[2:0] key_rst_r; //每個時鐘周期的上升沿將low_sw信號鎖存到low_sw_r中
[size=+0]always @ ( posedge clk or negedge rst_n )
if (!rst_n) key_rst_r <= 3'b111;
else key_rst_r <= key_rst;
//當寄存器key_rst由1變為0時,led_an的值變為高,維持一個時鐘周期
wire[2:0] key_an = key_rst_r & ( ~key_rst);
[size=+0]
|