FPGA實戰-兩個D觸發器的疑惑

因爲去實習,所以最近都沒有更新,特來更新一發。

最近發現一個問題,就是很多代碼中會特地的新建一個D觸發器用來鎖存信號,讓很多人都比較疑惑,明明一個D觸發器就可以檢測輸入是上升沿和下降沿,爲什麼要用兩個?第二個觸發器的作用是什麼呢?我們舉一個最簡單的例子,按鍵的輸入控制輸出,可以從代碼和RTL圖中看出不同

下面是用一個D觸發器的代碼(接下面的圖是rtl圖)

`timescale 1ns / 1ps
module key_test
(
	input                 clk,      
	input [3:0]           key,      
	output[3:0]           led        
);

reg[3:0] led_r;            
         
always@(posedge clk)
begin
	led_r <= ~key;        
end

assign led = led_r;

endmodule 

下面是用兩個D觸發器的代碼(接下面的圖是rtl圖)差別在於多了一個led_r1寄存器

`timescale 1ns / 1ps
module key_test
(
	input                 clk,      
	input [3:0]           key,       
	output[3:0]           led       
);

reg[3:0] led_r;            
reg[3:0] led_r1;          
always@(posedge clk)
begin
	led_r <= ~key;        
end

always@(posedge clk)
begin
	led_r1 <= led_r;      
end

assign led = led_r1;

endmodule 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

解析:一開始我也覺得第二個寄存器是多餘的,但是通過思考還是想到了比較合理的原因,首先我們要了解一個概念,就是建立時間和保持時間幾乎所有硬件相關筆試文檔裏都有的問答題)。

什麼是 Setup和 Hold 時間?

答:Setup/Hold Time 用於測試芯片對輸入信號和時鐘信號之間的時間要求。建立時間(Setup  Time)是指觸發器的時鐘信號上升沿到來以前,數據能夠保持穩 定不變的時間。輸入數據信號應提前時鐘上升沿(如上升沿有效)T 時間到達芯片,這個T就是建立時間通常所說的 SetupTime。如不滿足 Setup Time,這個數據就不能被這一時鐘打入觸發器,只有在下一個時鐘上升沿到來時,數據才能被打入 觸發器。保持時間(Hold Time)是指觸發器的時鐘信號上升沿到來以後,數據保持穩定不變的時間。如果 Hold Time 不夠,數據同樣不能被打入觸發器。

以上就是用2個觸發器的問題所在,當我們按鍵時,很有可能會正好碰到與時鐘上升沿時間距離很短的時候(也就是建立時間不足),這時候觸發器會進入亞穩態(這會導致在後面組合電路中有時爲低電平有時爲高電平),且在下個上升沿到來之前都不會進入穩態,這就爲後續電路埋下隱患。解決方案就是用多個觸發器,第二個觸發器實際上是在按鍵按下的第二個上升沿接收到的正確信號,這時候第一個觸發器大概率已經進入穩態,所以可以正常輸出,兩者同時出現亞穩態的情況也存在不過概率比較低,日常中一般兩個觸發器就可以滿足要求,這就是爲什麼要用兩個觸發器。

這就是實踐和理論的區別,理論中的D觸發器可是沒有建立和保持實踐的,所以在理論中2個D觸發器可以說是浪費,但是在實踐中是必不可少的。

 

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