如何實現一個帶雙邊沿檢測的觸發器

這是一道 HDLBits 上面的題目(Probelm 97 Dual-edge triggered flip-flop)。

目的是實現一個帶雙邊沿檢測的觸發器。我們知道,FPGA上是沒有帶雙邊沿檢測的觸發器的,即不存在這樣的寫法:

always @(posedge clk or negedge clk)

哪怕寫了,沒有這樣的資源也實現不了,無法綜合。那麼我們怎麼通過硬件電路設計去實現下面的時序圖呢?
在這裏插入圖片描述
題目也給出了相應的提示:我們可以同時實現對時鐘上升沿和下降沿的檢測,然後通過某種方式進行組合。

下面給出一種通過多路複用選擇器實現的方法。

`timescale 1ns / 1ps
module test(
    input clk,
    input d,
    output out
//    output cout

    );
    
    reg q1, q2;
    assign out = clk ? q1 : q2;
    
    always@(posedge clk)
    begin
        q1 <= d;
    end
    
    always@(negedge clk)
    begin
        q2 <= d;
    end
    
endmodule

電路如下:
在這裏插入圖片描述
即通過分別實現對上升沿和下降沿的檢測,並用 Mux 根據 clk 進行選擇從而得到既可以檢測上升沿也可以檢測下降沿的觸發器功能。

還有一種基於異或運算進行。我們知道任何一個數異或一個數再異或同一個數,將得到本身。這就是最簡單的加密與解密原理。

module top_module(
    input clk,
    input d,
    output q);

    reg p, n;

    // clk的上升沿
    always @(posedge clk)
        p <= d ^ n;

    // clk的下降沿
    always @(negedge clk)
        n <= d ^ p;

    //在上升沿時候,p=d^n, 則q=d^n^n=d;
    //在下降沿時候,n=d^p, 則q=p^d^p=d;
    //加載一個新值時會取消舊值。
    assign q = p ^ n;

endmodule

電路如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章