主要內容
- 多級延遲觸發器電路
- 同步器
- 邊沿檢測電路
- 與移位寄存器的區別
1、多級延遲觸發器電路
定義:是多個觸發器串聯組合,每進行一次傳輸,數據就延遲一個周期。可以通過增加觸發器的數量來決定延時的拍數。
module DFF_N #(parameter N=3)( input clk, input reset, input [N-1:0] D, output reg [N-1:0] Q ); reg [N-1:0] d0; reg [N-1:0] d1; always @(posedge clk or negedge reset) if(!reset) begin d0 <= 0; d1 <= 0; Q <= 0; end else begin d0 <= D; d1 <= d0; Q <= d1; end endmodule
上述代碼中d0是輸入信號D延遲一級采樣或稱為延遲一拍的信號,以此類推d1是延遲兩拍信號,Q是延遲三拍信號。可以通過修改N來確定信號的位寬,和修改部分代碼決定延遲的拍數。
作用:使用如上延遲觸發器鏈可以對D信號進行延吃操作。
2、同步器
同步器的兩種類型:見https://www.cnblogs.com/lizhiqing/p/12059436.html
3、邊沿檢測電路
定義:待檢測的信號的上升沿或者下降沿到來時,會輸出一個脈沖信號。
檢測方法:
- 上升沿:原始信號與延遲一拍的信號d0的反向信號相與;
- 下降沿:原始信號取反,與延遲一拍的信號d0相與。
如果擔心采樣不穩定,可以使用d1代替d0。

module side_detect #(parameter N=1)( input clk, input reset, input [N-1:0] D, output [N-1:0] D_rising_edge, output [N-1:0] D_falling_edge, output reg [N-1:0] Q ); reg [N-1:0] d0; reg [N-1:0] d1; always @(posedge clk or negedge reset) if(!reset) begin d0 <= 0; d1 <= 0; Q <= 0; end else begin d0 <= D; d1 <= d0; Q <= d1; end assign D_rising_edge = D & ~d0; assign D_falling_edge = ~D & d0; endmodule

module tb_edge_dec #(parameter N=1)(); wire D_rising_edge; wire D_falling_edge; wire Q; reg clk; reg reset; reg D; side_detect inst_edge( .clk (clk), .reset (reset), .D (D), .D_rising_edge (D_rising_edge), .D_falling_edge (D_falling_edge), .Q (Q) ); initial begin #0 reset = 0; clk = 0; #10 reset = 1; end always #10 clk = !clk; initial begin repeat(20) #20 D = {$random} % 2; end endmodule
4、與移位寄存器區別
- 移位寄存器用於實現串轉並的功能,每個觸發器的輸出都可讀;而用於延時的觸發器鏈每個觸發器的輸出僅作為內部信號;
- 移位寄存器能根據控制信號的要求決定移動位數,觸發器鏈則是通過觸發器的數量來決定延遲的時長;