fpga如何約束走線 FPGA四大設計要點

2021-10-13 21:51:30 字數 4414 閱讀 7230

fpga的用處比我們平時想象的用處更廣泛,原因在於其中整合的模組種類更多,而不僅僅是原來的簡單邏輯單元(le)。

早期的fpga相對比較簡單,所有的功能單元僅僅由管腳、內部buffer、le、ram構建而成,le由lut(查詢表)和d觸發器構成,ram也往往容量非常小。

dsp:實際上就是乘加器,fpga內部可以整合多個乘加器,而一般的dsp晶元往往每個core只有乙個。換言之,fpga可以更容易實現多個dsp core功能。在某些需要大量乘加計算的場合,往往多個乘加器並行工作的速度可以遠遠超過乙個高速乘加器。

serdes:高速序列介面。將來pci-e、xaui、ht、s-ata等高速序列介面會越來越多。有了serdes模組,fpga可以很容易將這些高速序列介面整合進來,無需再購買專門的介面晶元。

cpu core:分為2種,軟core和硬core.軟core是用邏輯**寫的cpu模組,可以在任何資源足夠的fpga中實現,使用非常靈活。而且在大容量的fpga中還可以整合多個軟core,實現多核並行處理。硬core是在特定的fpga內部做好的cpu core,優點是速度快、效能好,缺點是不夠靈活。

不過,fpga還是有缺點。對於某些高主頻的應用,fpga就無能為力了。現在雖然理論上fpga可以支援的500mhz,但在實際設計中,往往200mhz以上工作頻率就很難實現了。

fpga設計要點之一:時鐘樹

對於fpga來說,要盡可能避免非同步設計,盡可能採用同步設計。

同步設計的第乙個關鍵,也是關鍵中的關鍵,就是時鐘樹。

乙個糟糕的時鐘樹,對fpga設計來說,是一場無法彌補的災難,是乙個沒有打好地基的大樓,崩潰是必然的。

具體一些的設計細則:

1)盡可能採用單一時鐘;

2)如果有多個時鐘域,一定要仔細劃分,千萬小心;  

3)跨時鐘域的訊號一定要做同步處理。對於控制訊號,可以採用雙取樣;對於資料訊號,可以採用非同步fifo.需要注意的是,非同步fifo不是萬能的,乙個非同步fifo也只能解決一定範圍內的頻差問題。4)盡可能將fpga內部的pll、dll利用起來,這會給你的設計帶來大量的好處。

5)對於特殊的io介面,需要仔細計算tsu、tco、th,並利用pll、dll、ddio、管腳可設定的delay等多種工具來實現。簡單對管腳進行tsu、tco、th的約束往往是不行的。

可能說的不是很確切。這裡的時鐘樹實際上泛指時鐘方案,主要是時鐘域和pll等的規劃,一般情況下不牽扯到走線時延的詳細計算(一般都走全域性時鐘網路和區域性時鐘網路,時延固定),和asic中的時鐘樹不一樣。對於asic,就必須對時鐘網路的設計、佈線、時延計算進行仔細的分析計算才行。

fpga設計要點之二:fsm

fsm:有限狀態機。這個可以說是邏輯設計的基礎。幾乎稍微大一點的邏輯設計,幾乎都能看得到fsm.

fsm分為moore型和merly型,moore型的狀態遷移和變數無關,merly型則有關。實際使用中大部分都採用merly型。

fsm通常有2種寫法:單程序、雙程序。

初學者往往喜歡單程序寫法,格式如下:

always @( posedge clk or posedge rst )  begin  if ( rst == 1'b1 )  fsm_status <= ……;  else  case( fsm_status )  ……;  endcase  end
簡單的說,單程序fsm就是把所有的同步、非同步處理都放入乙個always中。

優點:1)看起來比較簡單明瞭,寫起來也不用在每個case分支或者if分支中寫全對各個訊號和狀態訊號的處理。也可以簡單在其中加入一些計數器進行計數處理。

2)所有的輸出訊號都已經是經過d觸發器鎖存了。

缺點:1)優化效果不佳。由於同步、非同步放在一起,編譯器一般對非同步邏輯的優化效果最好。單程序fsm把同步、非同步混雜在一起的結果就是導致編譯器優化效果差,往往導致邏輯速度慢、資源消耗多。

2)某些時候需要更快的訊號輸出,不必經過d觸發器鎖存,這時單程序fsm的處理就比較麻煩了。

雙程序fsm,格式如下:

always @( posedge clk or posedge rst )  begin  if ( rst == 1'b1 )  fsm_status_current <= …;else  fsm_status_current <= fsm_status_next;  always @(*)  begin  case ( fsm_status_current )  fsm_status_next = ……;  endcase  end
從上面可以看到,同步處理和非同步處理分別放到2個always中。其中fsm狀態變數也採用2個來進行控制。雙程序fsm的原理我這裡就不多說了,在很多邏輯設計書中都有介紹。這裡描述起來太費勁。

優點:1)編譯器優化效果明顯,可以得到很理想的速度和資源佔用率。

2)所有的輸出訊號(除了fsm_status_current)都是組合輸出的,比單程序fsm快。

缺點:1)所有的輸出訊號(除了fsm_status_current)都是組合輸出的,在某些場合需要額外寫**來進行鎖存。

2)在非同步處理的always中,所有的if、case分支必須把所有的輸出訊號都賦值,而且不能出現在fsm中的輸出訊號回送賦值給本fsm中的其他訊號的情況,否則會出現 latch。

latch會導致如下問題:

1)功能**結果和後仿不符;

2)出現無法測試的邏輯;

3)邏輯工作不穩定,特別是latch部分對毛刺異常敏感;

4)某些及其特殊的情況下,如果出現正反饋,可能會導致災難性的後果。

這不是恐嚇也不是開玩笑,我就親眼見過乙個小伙把他做的邏輯載入上去後,整個fpga給炸飛了。後來懷疑可能是出現正反饋導致高頻振盪,最後導致晶元過熱炸掉(這個fpga晶元沒有安裝散熱片)。

fpga設計要點之三:latch

首先回答一下:

1)statecad沒有用過,不過我感覺用這個東東在構建大的系統的時候似乎不是很方便。也許用systemc或者system verilog更好一些。

2)同步、非同步的叫法是我所在公司的習慣叫法,不太對,不過已經習慣了,呵呵。

這次講一下latch.

latch的危害已經說過了,這裡不再多說,關鍵講一下如何避免。

1)在組合邏輯程序中,if語句一定要有else!並且所有的訊號都要在if的所有分支中被賦值。

always @( * ) beginif ( sig_a == 1'b1 ) sig_b = sig_c;end這個是絕對會產生latch的。正確的應該是  always @( * ) beginif ( sig_a == 1'b1 ) sig_b = sig_c;else sig_b = sig_d;end
另外需要注意,下面也會產生latch.也就是說在組合邏輯程序中不能出現自己賦值給自己或者間接出現自己賦值給自己的情況。

always @( * ) begin  if ( rst == 1'b1 ) counter = 32'h00000000;  else counter = counter + 1;end
但如果是時序邏輯程序,則不存在該問題。

2)case語句的default一定不能少!

原因和if語句相同,這裡不再多說了。

需要提醒的是,在時序邏輯程序中,default語句也一定要加上,這是乙個很好的習慣。

3)組合邏輯程序敏感變數不能少也不能多。

這個問題倒不是太大,verilog2001語法中可以直接用 * 搞定了。

順便提一句,latch有弊就一定有利。在fpga的le中,總存在乙個latch和乙個d觸發器,在支援ddr的ioe(iob)中也存在著乙個latch來實現ddio.不過在我們平時的設計中,對latch還是要盡可能的敬而遠之。

fpga設計要點之四:邏輯**

**是fpga設計中必不可少的一步。沒有**,就沒有一切。

**是乙個單調而繁瑣的工作,很容易讓人產生放棄或者偷工減料的念頭。這時一定要挺住!

**分為單元**、整合**、系統**。

單元**:針對每乙個最小基本模組的**。單元**要求**行覆蓋率、條件分支覆蓋率、表示式覆蓋率必須達到100%!這三種覆蓋率都可以通過modelsim來檢視,不過需要在編譯該模組時要在compile option中設定好。

整合**:將多個大模組合在一起進行**。覆蓋率要求盡量高。

系統**:將整個硬體系統合在一起進行**。此時整個**平台包含了邏輯周邊晶元介面的**模型,以及bfm、testbench等。系統**需要根據被**邏輯的功能、效能需求仔細設計**測試例和**測試平台。系統**是邏輯設計的乙個大分支,是一門需要專門學習的學科。

文章整理自網路,侵刪!

fpga如何約束走線 FPGA時序約束的幾種方法

對自己的設計的實現方式越了解,對自己的設計的時序要求越了解,對目標器件的資源分布和結構越了解,對eda工具執行約束的效果越了解,那麼對設計的時序約束目標就會越清晰,相應地,設計的時序收斂過程就會更可控。從最近一段時間工作和學習的成果中,我總結了如下幾種進行時序約束的方法。按照從易到難的順序排列如下 ...

fpga如何約束走線 FPGA時序約束的6種方法

fpga 時序約束的 種方法對自己的設計的實現方式越了解,對自己的設計的時序要求越了解,對目標器件的資源分布和結構越了解,對 eda工具執行約束的效果越了解,那麼對設計的時序約束目標就會越清晰,相應地,設計的時序收斂過程就會更 可控。下文總結了幾種進行時序約束的方法。按照從易到難的順序排列如下 0....

fpga如何約束走線 FPGA時序約束的幾種方法

對自己的設計的實現方式越了解,對自己的設計的時序要求越了解,對目標器件的資源分布和結構越了解,對eda工具執行約束的效果越了解,那麼對設計的時序約束目標就會越清晰,相應地,設計的時序收斂過程就會更可控。從最近一段時間工作和學習的成果中,我總結了如下幾種進行時序約束的方法。按照從易到難的順序排列如下 ...