搬運自:
孤獨的單刀;
大佬後面的是付費專案,所以涉及付費專案的我不會公開,
本部落格純方便自己看做筆記。
輸出延時時間Tco
由 clk 觸發到輸出資料有效之間最大延 遲時間,對應圖1的Tco(clock output delay)
組合邏輯與時序邏輯
組合邏輯電路
數位電路根據邏輯功能的不同特點,可以分成兩大類:組合邏輯電路與時序邏輯電路。
組合邏輯電路的最大特點是輸出是實時跟隨輸入變化的,
如下面的組合邏輯,如果兩個輸入之間到達的路徑延時不一致的話,則很容易產生毛刺。
(個人見解:純組合邏輯一定會有不符合需要的輸出的時刻,但是透過時序邏輯去獲取,也可以得到正確的結果)
(位寬過大的時候會有難以估計的問題)
偏偏FPGA又不是理想器件,在資源被大量使用的情況下,要做到不同的路徑達到閘電路的延時一致幾乎是不可能的,
所以可以說純組合邏輯電路的毛刺現象幾乎是不可避免的。
毛刺的產生很多時候都是個災難,因為它並不是你預期設計的一部分,這相當於你的設計遇上了沒有預料到的輸入情況,所以輸出在很大程度上也會變得不可控。
時序邏輯電路
時序邏輯電路的最大特點是輸出不是實時跟隨輸入變化的,而是在時鐘的上升沿(或下降沿,一般以上升沿為主流)統一發生變化
(誠然這個變化也不是瞬時的,還需要一定的Tco時間)。
在時鐘的上升沿之前,只要輸入滿足建立時間和保持時間的要求,則任你如何有毛刺也不會對輸出造成影響,
這很容易理解,因為在非上升沿不會發生取樣,自然也不會有輸出。
時序邏輯電路解決了組合邏輯電路無法解決的毛刺問題,將電路的行動全部置於統一的行動之下----時鐘。
在時鐘訊號的控制下,整個電路可以有條不紊的執行。
當然,組合邏輯電路並不是被替代,因為我們仍然需要其實現邏輯功能。
所以組合邏輯與時序邏輯可以說是共生,你中有我我中有你----組合邏輯實現邏輯功能,而時序邏輯則將電路的執行置於統一的管理之下。
同步電路和非同步電路
基於FPGA的設計幾乎都是時序邏輯電路,極少會有設計純組合邏輯電路的情況。
因此,時序邏輯電路在FPGA的設計中佔有非常重要的地位。
對於時序邏輯,按訊號間關係來看,又可分為同步時序邏輯和非同步時序邏輯,簡稱同步邏輯和非同步邏輯。
簡單來講,FPGA 設計中暫存器全部使用一個時鐘的設計是同步設計電路,FPGA 設計暫存器使用多個時鐘的設計是非同步設計電路。
我們說的所有時序分析都是建立在同步電路的基礎上的,非同步電路不能做時序分析(或者說只能做偽路徑約束)。
非同步電路由於使用的時鐘不同,導致上游暫存器的輸出資料進入下游暫存器的時間是任意的,這非常可能導致不滿足下游暫存器的建立時間要求和保持時間要求,從而導致亞穩態。
同樣的原因,由於兩者時鐘不同,所以也不法建立對應的模型來分析非同步電路是否能滿足時序要求。
所以,對FPGA的時序分析其實主要就是對同步時序邏輯電路進行分析,然後再做約束。那麼到底要約束些什麼?
建立時間與保持時間
時序邏輯電路的基礎是觸發器FF,對FF的使用有兩個要求是必須滿足的----建立時間與保持時間。
- 建立時間:Setup Time,縮寫是 Tsu,即在時鐘上升沿之前資料必須穩定的最短時間
- 保持時間:Hold Time,縮寫是 Th,即在時鐘上升沿之後資料必須穩定的最短時間
通俗來講:建立時間和保持時間就是在暫存器取樣視窗中輸入資料必須保持不變,以免暫存器無法穩定取樣。也就是說,在我暫存器的取樣視窗之前你輸入資料就必須要保持穩定,即輸入資料不能來的太晚(建立時間);同樣的,你暫存器的輸入資料也必須在我暫存器的取樣視窗結束後才變化,在此之前必須保持問題,即輸入資料不能走的太早(保持時間)。
建立時間和保持時間的示意圖如下:
建立時間和保持時間是觸發器的固定屬性,也就是說同一FPGA型號其所有的FF的建立時間和保持時間都是相同的,
而不同的FPGA型號之間,其建立時間與保持時間則不同。
關於FPGA對應的建立時間和保持時間可以透過手冊來查詢,也可以用vivado做時序分析時查詢。
高階的FPGA晶片其建立時間和保持時間會比低階的FPGA晶片較小,這也是其能執行頻率更高的原因。
瞭解FPGA的建立時間和保持時間非常重要,它是我們進行時序分析的基礎,
甚至可以說,時序分析就是要分析所有的FF是不是都滿足建立時間與保持時間的要求。
如果建立時間或者保持時間的要求無法被滿足,那麼就會發生亞穩態現象。
亞穩態 (Metastability)和決斷時間Tmet(resolution time):
如果資料傳輸中不滿足觸發器的Tsu和Th不滿足,就可能產生亞穩態,
此時觸發器輸出端Q在有效時鐘沿之後比較長的一段時間處於不確定的狀態,在這段時間裡Q端在0和1之間處於振盪狀態,
而不是等於資料輸入端D的值。
這段時間稱為決斷時間Tmet(resolution time)。
經過resolution time之後Q端將穩定到0或1上,
但是穩定到0或者1,是隨機的,與輸入沒有必然的關係。
恢復時間與去除時間
非同步訊號距離下一個時鐘沿的時間和上一個時鐘沿的時間。
恢復時間(Recovery Time)是指非同步控制訊號(如暫存器的非同步清除和置位控制訊號)在“下個時鐘沿”來臨之前變無效的最小時間長度。
這個時間的意義是,如果保證不了這個最小恢復時間,也就是說這個非同步控制訊號的解除與“下個時鐘沿”離得太近(但在這個時鐘沿之前),沒有給暫存器留有足夠時間來恢復至正常狀態,
(不能讓非同步控制的掛起時間離同步時鐘沿太近)
那麼就不能保證“下個時鐘沿”能正常作用,也就是說這個“時鐘沿”可能會失效。
去除時間(Removal)是指非同步控制訊號(如暫存器的非同步清除和置位控制訊號)在“有效時鐘沿”之後變無效的最小時間長度。
這個時間的意義是,如果保證不了這個去除時間,也就是說這個非同步控制訊號的解除與“有效時鐘沿”離得太近(但在這個時鐘沿之後),
那麼就不能保證有效地遮蔽這個“時鐘沿”,也就是說這個“時鐘沿”可能會起作用。
換句話來說,
如果你想讓某個時鐘沿起作用,那麼你就應該在“恢復時間”之前是非同步控制訊號變無效,
如果你想讓某個時鐘沿不起作用,那麼你就應該在“去除時間”過後使控制訊號變無效。
如果你的控制訊號在這兩種情況之間,那麼就沒法確定時鐘沿是否起作用或不起作用了,也就是說可能會造成暫存器處於不確定的狀態。
而這些情況是應該避免的。所以恢復時間和去除時間是應該遵守的。
比如下圖中:
復位訊號rst_n作為一個非同步控制型號,
需要在下一個時鐘有效沿之前就變無效(拉高),以保證Recovery恢復時間,這樣暫存器才有足夠的時間恢復到正常狀態(這有點類似建立時間);
同樣的,復位訊號rst_n的移除不能與上一個時鐘有效沿間隔太近,以保證其無法影響上一個時鐘有效沿(這有點類似保持時間)。
4種基本的時序路徑
下圖是一張典型的FPGA與上游、下游器件通訊的示意圖。
其可以劃分為基本的四條資料路徑,這四條路徑也是需要進行時序約束的最基本的路徑。
- 路徑1,上游器件透過FPGA管腳到FPGA的暫存器的時序路徑,即pin2reg(管腳到暫存器),需要對其進行約束,以滿足FPGA端暫存器的建立時間和保持時間要求;
- 路徑2,FPGA內部的暫存器到另一個暫存器, 即reg2reg(暫存器到暫存器),需要對其進行約束,以滿足FPGA端暫存器的建立時間和保持時間要求;
- 路徑3,FPGA管腳到下游器件的暫存器的時序路徑,即reg2pin(暫存器到管腳),需要對其進行約束,以滿足下游器件的暫存器的建立時間和保持時間要求;
- 路徑4,FPGA管腳到FPGA管腳的時序路徑(不透過任何暫存器),其本質上是純組合邏輯電路,僅僅需要約束其值在一個指定範圍,不需要滿足建立時間和保持時間要求。