這是一道 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
電路如下: