FPGA設計的五大高級進階點

FPGA設計的五大高級進階點

博主微信:flm13724054952,不懂的有疑惑的也可以加微信諮詢,歡迎大家前來投稿,謝謝!

引言

隨着FPGA在大規模系統級的開發設計應用裏,FPGA設計裏面往往經常會涉及到五大技術點,乒乓操作設計,流水線設計,跨時域處理設計,亞穩態的產生跟毛刺的消除設計以及狀態機的設計。本文將介紹這五大技術點的設計應用優勢,介紹FPGA設計的基本思想跟技巧原則。具體的電路設計示範在後續的博客中再做介紹。

乒乓設計

在大數據交互的工程裏,常常需要用到乒乓操作設計來達到在保證數據交互穩定性的同時,也可以節約FPGA工程緩存內存。 乒乓操作是一個主要用於數據流控制的處理技巧,典型的乒乓操作如下圖所示,外部輸入數據流通過“輸入數據流選擇單元”的選擇模塊,將輸入數據送入兩個數據緩衝模塊中,再通過“輸出數據選擇單元”的選擇模塊,輸出緩存模塊的數據給數據流運算處理模塊進行數據處理。
數據緩存模塊一般採用:雙口RAM(Dual RAM),SRAM,SDRAM,FIFO等。
輸入/輸出數據流選擇單元一般通過狀態機來加以實現。
在這裏插入圖片描述

乒乓操作的設計原理

在第1個緩衝週期中,將輸入的數據流緩存到“數據緩衝模塊1”;在第2個緩衝週期裏,“輸入數據流選擇單元”模塊將輸入的數據流緩存到“數據緩衝模塊2”模塊的同時,“輸出數據流選擇控制單元”模塊將“數據緩衝模塊1”第一個週期緩存的數據流送到後續的運算處理。在第三個緩衝週期,“輸入數據流選擇單元模塊”再次切換,將輸入的數據流緩存到“數據緩衝模塊1”,與此同時,“輸出數據流選擇單元”模塊也做出切換,將“數據緩衝模塊2”緩存的第二個週期的數據送到後續的運算處理,如此循環。
  這裏通過利用了乒乓操作完成數據的無縫緩衝與處理,乒乓操作可以通過“輸入數據流選擇單元”和“輸出數據流選擇單元”按節拍,相互配合地進行來回切換,將經過緩衝的數據流沒有停頓的送到“後續的運算處理模塊”。

多級RAM的乒乓結構

根據上面乒乓操作的設計原理,可以敲定多級RAM的乒乓結構數據通道如下圖所示,通過乒乓操作將ram1跟ram2的依次緩存數據進行並行處理,以此提高系統的運行速度。而通過FIFO由此可以實現跨時域的數據流穩定交互,最後經過運算處理存儲到PC Memory。
下圖的多級RAM的乒乓結構有四個優點:
1:以定長的數據流爲單位進行大數據處理;
2:提高FPGA系統數據流的並行處理速度;
3:大大提高FPGA系統的數據處理運輸速度;
4:可以保證跨時域數據交互的穩定性;
在這裏插入圖片描述

流水線設計

流水線(Pipeline)設計可以說是FPGA系統提高速度最常用最強有力的手段,也是一種典型的“面積換速度”的設計思想。
假設在電路中,每個時鐘週期執行N個操作,而且時鐘的工作頻率爲F;那麼電路的吞吐量=NF ops/sec。而Pipeline的設計原則主要有提高時鐘週期F或者增加執行操作N(增加了面積)。
流水線設計原則1:通過增加時鐘頻率F來提高吞吐量,達到時序延遲(latency)和電路面積(area)的折中平衡(tradeoff)。
流水線設計原則2:通過增加執行操作N(增加了面積),從而增加電路的吞吐量=N
F,提高電路數據處理速度。

流水線設計原則1

流水線設計原則1:通過增加時鐘頻率F來提高吞吐量,達到時序延遲(latency)和電路面積(area)的折中平衡(tradeoff)。
回顧一下之前博文裏介紹的靜態時序分析設計,什麼決定了電路的最高工作頻率呢?
對於電路來說,時鐘週期1/F=T>Tsu - Tun + Tco + Tdata;Tsu,Tun,Tco一般來說都是工藝器件決定的,所以要想提高時鐘頻率F(時鐘週期減小),那麼爲了保持電路時序正常電路餘量爲正,必須使Tdata減小,也就是說要減小組合邏輯的工作延遲。
總而言之,組合電路之間的延時決定了電路的最大工作頻率,故不能過於複雜。
在這裏插入圖片描述
通過上面的介紹,例如下圖所示,在基於流水線設計原則1下,可以將較大的組合邏輯Algorithm combinatory logic進行拆分爲兩個部分或者多個部分的Algorithm combinatory logic。通過插進寄存器來實現對電路時鐘頻率的提高。注意的是每增加寄存器電路的面積相應也就會增加,也就是常說的“面積換取速度”的說話。如下圖所示,假設原路徑延時爲t,加入1級流水線並且假設路徑切割均勻,則路徑延時可以減少到約t/2,從而系統速率可以提高到原來的2倍左右。注意的是輸出同時會往後推遲2個時鐘週期。所以採用流水線技術時,要記得在後面進行時序調整。
在這裏插入圖片描述

流水線設計原則2

流水線設計原則2:通過增加執行操作N(增加了面積),從而增加電路的吞吐量=N*F,提高電路數據處理速度。
例如下圖所示,在本來的設計裏面輸入信號通過每個時鐘週期的節拍1,節拍2,節拍3再輸出信號。也就是三個時鐘週期只能輸出一個信號,但是如果將輸入信號通過下圖的三條數據通路,再由輸出選擇器來選擇輸出信號。這樣子三個時鐘週期就可以輸出三個信號。輸出信號的速度比原本的設計快了三倍。注意的是這裏增加了兩條數據通路就會增加了電路寄存器,從而也增加了電路的面積,也就是前面所說的“面積換速度”設計原則。
在這裏插入圖片描述

跨時域設計

在許多的FPGA系統電路里面常常會採用多時鐘設計,最常見的例子是兩個異步微處理器之間的接口,或微處理器和異步通信通道的接口。 由於兩個時鐘信號之間要求一定的建立和保持時間, 所以在進行跨時域電路設計的時候,一定要對異步信號進行同步化,在做SDC時序約束的時候,對一些無關的異時鐘進行set_flase等。
在這裏插入圖片描述

亞穩態產生跟消除

如果在一個FPGA系統電路里面存在多個獨立(異步)時鐘,並且存在多時鐘跨時域(clock domain)之間的信號傳輸,那麼電路會出現亞穩態。出現亞穩態的平均時間間隔常用“平均無故障時間” (MTBF, Mean Time Between Failure)來表示。單個觸發器的MTBF爲溫度、電壓、輻射等因素都對MTBF有影響。
在這裏插入圖片描述
對於跨時域的數據交流,如果只做一個寄存器就直接輸出去運算處理,此時的輸出數據是帶有亞穩態的,對電路設計有危險,所以對跨時域的電路設計在傳輸數據給外面去運算處理的時候,要再“多打一拍寄存器”再輸出去給外面運算處理。這樣子的優點可以消除電路因爲跨時域而產生的亞穩態,實現成本也低,不過並不能完全消滅亞穩態,並對電路造成了延遲,所以在後面的電路設計,要考慮電路數據的延遲進行時序調整。
在這裏插入圖片描述

多時鐘系統設計

在許多的FPGA應用設計中只將異步信號同步化還是不夠的,當系統中有多個非同源時鐘的時候,數據的建立和保持時間很難得到保證,設計人員將面臨複雜的時間分析問題。最好的方法是將所有非同源時鐘同步化,不過工作量與寄存器隨着增加。對於多時鐘系統的設計有以下幾個建議:
建議1:對於多時鐘系統的設計,信號命名和模塊劃分要有科學合理的區分;
如下圖所示的劃分有以下好處:
• 有利於檢查信號所通過的時鐘域;
• 有利於各模塊進行單獨的靜態時序分析;
• 有利於在靜態時序分析中快速地設定falsepath;
在這裏插入圖片描述
建議2:異步信號穿越時鐘域時,這些信號與異步時鐘之間的相位關係數是無窮的,所以在整個系統靜態時序分析時必須set_flase_path忽略這些信號路徑;
建議3:對於常用的緩存單元是DPRAM和FIFO,在輸入端口使用上級時鐘寫數據,在輸出端口使用本級時鐘讀數據。
建議4:時鐘的產生要純淨,時鐘最好不要通過任何組合電路,或者不要用組合電路產生時鐘;
建議5:注意使用同步化電路來對異步信號進行同步;
建議6:採用FIFO方式是解決問題的最好的方法,但需要注意FIFO的深度的設定以及FIFO門限的控制;
建議7:儘量減少握手控制信號的數目,以避免同步化造成的信號拉伸而破壞控制信號之間的相位關係;
建議8:快時鐘域信號進入慢時鐘域時,要注意信號丟失的避免和檢測。

毛刺消除設計

信號在FPGA器件內部通過連線和邏輯單元時, 都有一定的延時。延時的大小與連線的長短和邏輯單元的數目有關,同時還受器件的製造工藝、工作電壓、溫度等條件的影響。信號的高低電平轉換也需要一定的過渡時間。由於存在這兩方面因素,多路信號的電平值發生變化時,在信號變化的瞬間, 組合邏輯的輸出狀態不確定, 往往會出現一些不正確的尖峯信號, 這些尖峯信號稱爲“毛刺”。

組合邏輯的毛刺消除

如下圖所示,由於受到單元連線的長短和邏輯單元的數目的影響而導致延遲的不一樣,從而在信號變化的瞬間, 組合邏輯的輸出狀態不確定, 往往會出現一些不正確的尖峯信號–“毛刺”。
在這裏插入圖片描述
實際上我們在做FPGA電路設計的時候可以認爲,不管是否出現競爭冒險,只要是純組合譯碼輸出的電路,就可能會產生毛刺。 採用格雷碼計數器、 同步電路等, 可以大大減少毛刺,但它並不能完全消除毛刺。因此我們最常用的毛刺消除方法是“寄存器消除法”
• 因爲寄存器的數據輸入端D和時鐘使能端EN對毛刺不敏感,因此可以利用D和EN來吸收毛刺信號。
在這裏插入圖片描述

輸入端的毛刺消除

時序電路中,異步復位、時鐘等輸入端出現毛刺時,都會引起系統的誤動作。
我們常常的復位端設計都是異步復位,這樣子往往會產生毛刺,讓系統存在冒險的可能。
always@(posedge clk or negedge rst_n)
begin
if(rst_n)
*******
end
改進後的設計–‘異步復位,同步釋放’。
reg rst_n_reg;
always@(posedge clk)
begin
rst_n_reg <= rst_n;
end
always@(posedge clk or negedge rst_n_reg)
begin
if(rst_n_reg)
*******
end

狀態機設計

有限狀態機(Finite State Machine, FSM),根據狀態機的輸出是否與輸入有關可分爲Moore型狀態機和Mealy型狀態機。Moore型狀態機:輸出僅與當前狀態有關;
Mealy型狀態機:輸出與當前狀態和輸入信號都有關;
不過因爲Mealy狀態機的輸出與當前狀態和輸入信號都有關,所以會受到輸入的干擾,可能會產生毛刺(Glith)的現象,所以我們通常使用的是Moore型狀態機。
在FPGA的應用設計中用Verilog實現狀態機:
• 一般用case語句來建立狀態機模型,可方便地實現狀態轉換;
• 一般在case語句最後,要有最後一個分支default項;
• 設計的狀態機應該有一個異步或同步復位端,以便在通電時,將其復位到有效狀態;
• 狀態機的狀態賦值在狀態機前面可通過parameter或`define來進行。
如下圖所示,Moore型狀態機由兩個block組成,輸出out只有當前狀態決定,不與輸入信號有關:
(1)always block:下一狀態的組合邏輯;
(2)always block:更新狀態的時序邏輯。
在這裏插入圖片描述
如下圖所示,Mealy型狀態機由兩個block組成,輸出output不僅與當前狀態state_present還與輸入信號input_signal有關:
(1)always block:下一狀態的組合邏輯跟輸出;
在這裏插入圖片描述
(2)always block:更新狀態的時序邏輯。
在這裏插入圖片描述
通過上面的對比設計,我們可以發現Mealy狀態機的輸出與當前狀態和輸入信號都有關,所以會受到輸入的干擾,可能會產生毛刺(Glith)的現象,所以我們通常在做FPGA系統電路設計的時候使用Moore型狀態機。

參考推薦

參考推薦書籍《FPGA設計高級進階》。

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