觸發器鏈的應用——同步器與邊沿檢測電路


 

主要內容

  • 多級延遲觸發器電路
  • 同步器
  • 邊沿檢測電路
  • 與移位寄存器的區別

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
邊沿檢測_testbench

 

4、與移位寄存器區別

  • 移位寄存器用於實現串轉並的功能,每個觸發器的輸出都可讀;而用於延時的觸發器鏈每個觸發器的輸出僅作為內部信號;
  • 移位寄存器能根據控制信號的要求決定移動位數,觸發器鏈則是通過觸發器的數量來決定延遲的時長;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM