1. 程式人生 > >FPGA設計的常用思想與技巧

FPGA設計的常用思想與技巧

本文討論的四種常用 FPGA/CPLD 設計思想與技巧:乒乓操作、串並轉換、流水線操作、資料介面同步化,都是 FPGA/CPLD 邏輯設計的內在規律的體現,合理地採用這些設計思想能在FPGA/CPLD 設計工作種取得事半功倍的效果。  
        FPGA/CPLD 的設計思想與技巧是一個非常大的話題,由於篇幅所限,本文僅介紹一些常用的設計思想與技巧,包括乒乓球操作、串並轉換、流水線操作和資料介面的同步方法。希望本文能引起工程師們的注意,如果能有意識地利用這些原則指導日後的設計工作,將取得事半功倍的效果!  

乒乓操作
“乒乓操作”是一個常常應用於資料流控制的處理技巧,典型的乒乓操作方法如圖 1 所示。  


         乒乓操作的處理流程為:輸入資料流通過“輸入資料選擇單元”將資料流等時分配到兩個資料緩衝區,資料緩衝模組可以為任何儲存模組,比較常用的儲存單元為雙口 RAM(DPRAM)、單口 RAM(SPRAM)、FIFO 等。在第一個緩衝週期,將輸入的資料流快取到“資料緩衝模組 1”;在第 2 個緩衝週期,通過“輸入資料選擇單元”的切換,將輸入的資料流快取到“資料緩衝模組 2”,同時將“資料緩衝模組 1”快取的第1 個週期數據通過“輸入資料選擇單元”的選擇,送到“資料流運算處理模組”進行運算處理;在第 3 個緩衝週期通過“輸入資料選擇單元”的再次切換,將輸入的資料流快取到“資料緩衝模組 1”,同時將“資料緩衝模組 2”快取的第 2 個週期的資料通過“輸入資料選擇單元”切換,送到“資料流運算處理模組”進行運算處理。如此迴圈。  

         乒乓操作的最大特點是通過“輸入資料選擇單元”和“輸出資料選擇單元”按節拍、相互配合的切換,將經過緩衝的資料流沒有停頓地送到“資料流運算處理模組”進行運算與處理。把乒乓操作模組當做一個整體,站在這個模組的兩端看資料,輸入資料流和輸出資料流都是
連續不斷的,沒有任何停頓,因此非常適合對資料流進行流水線式處理。所以乒乓操作常常應用於流水線式演算法,完成資料的無縫緩衝與處理。  
        乒乓操作的第二個優點是可以節約緩衝區空間。比如在 WCDMA 基帶應用中,1 個幀是由 15個時隙組成的,有時需要將 1 整幀的資料延時一個時隙後處理,比較直接的辦法是將這幀資料快取起來,然後延時 1 個時隙進行處理。這時緩衝區的長度是1 整幀資料長,假設資料速率是 3.84Mbps,1 幀長 10ms,則此時需要緩衝區長度是 38400 位。如果採用乒乓操作,只需定義兩個能緩衝 1 個時隙資料的 RAM(單口 RAM 即可)。當向一塊 RAM 寫資料的時候,從另一塊 RAM 讀資料,然後送到處理單元處理,此時每塊 RAM 的容量僅需 2560 位即可,

2 塊 RAM 加起來也只有 5120 位的容量。  
       另外,巧妙運用乒乓操作還可以達到用低速模組處理高速資料流的效果。如圖 2所示,資料緩衝模組採用了雙口 RAM,並在 DPRAM 後引入了一級資料預處理模組,這個資料預處理可以根據需要的各種資料運算,比如在 WCDMA 設計中,對輸入資料流的解擴、解擾、去旋轉等。假設埠 A 的輸入資料流的速率為 100Mbps,乒乓操作的緩衝週期是 10ms。以下分析各個節點埠的資料速率。 

         A 埠處輸入資料流速率為 100Mbps,在第1 個緩衝週期 10ms 內,通過“輸入資料選擇單元”,從 B1 到達 DPRAM1。B1 的資料速率也是 100Mbps,DPRAM1 要在 10ms 內寫入 1Mb 資料。同理,在第 2 個 10ms,資料流被切換到 DPRAM2,埠 B2 的資料速率也是 100Mbps,DPRAM2在第 2 個 10ms 被寫入 1Mb 資料。在第3 個 10ms,資料流又切換到 DPRAM1,DPRAM1 被寫入1Mb 資料。  
        仔細分析就會發現到第3個緩衝週期時,留給DPRAM1讀取資料並送到“資料預處理模組1”的時間一共是 20ms。有的工程師困惑於 DPRAM1 的讀數時間為什麼是 20ms,這個時間是這樣得來的:首先,在在第 2 個緩衝週期向 DPRAM2 寫資料的 10ms 內,DPRAM1 可以進行讀操作;另外,在第 1 個緩衝週期的第 5ms 起(絕對時間為 5ms 時刻),DPRAM1 就可以一邊向 500K 以後的地址寫資料,一邊從地址 0 讀數,到達 10ms 時,DPRAM1 剛好寫完了 1Mb 資料,並且讀了 500K 資料,這個緩衝時間內 DPRAM1 讀了 5ms;在第 3 個緩衝週期的第 5ms 起(絕對時間為 35ms 時刻),同理可以一邊向 500K 以後的地址寫資料一邊從地址0 讀數,又讀取了5 個ms,所以截止 DPRAM1 第一個週期存入的資料被完全覆蓋以前,DPRAM1 最多可以讀取 20ms時間,而所需讀取的資料為 1Mb,所以埠 C1 的資料速率為:1Mb/20ms=50Mbps。因此,“資料預處理模組 1”的最低資料吞吐能力也僅僅要求為 50Mbps。同理,“資料預處理模組 2”
的最低資料吞吐能力也僅僅要求為 50Mbps。換言之,通過乒乓操作,“資料預處理模組”的時序壓力減輕了,所要求的資料處理速率僅僅為輸入資料速率的 1/2。  
       通過乒乓操作實現低速模組處理高速資料的實質是:通過 DPRAM 這種快取單元實現了資料流的串並轉換,並行用“資料預處理模組 1”和“資料預處理模組 2”處理分流的資料,是面積與速度互換原則的體現!  

串並轉換設計技巧
         串並轉換是 FPGA 設計的一個重要技巧,它是資料流處理的常用手段,也是面積與速度互換思想的直接體現。串並轉換的實現方法多種多樣,根據資料的排序和數量的要求,可以選用暫存器、RAM 等實現。前面在乒乓操作的圖例中,就是通過 DPRAM 實現了資料流的串並轉換,而且由於使用了 DPRAM,資料的緩衝區可以開得很大,對於數量比較小的設計可以採用暫存器完成串並轉換。如無特殊需求,應該用同步時序設計完成串並之間的轉換。比如資料從序列到並行,資料排列順序是高位在前,可以用下面的編碼實現:  
prl_temp<={prl_temp,srl_in};  
其中,prl_temp 是並行輸出快取暫存器,srl_in 是序列資料輸入。對於排列順序有規定的串並轉換,可以用 case 語句判斷實現。對於複雜的串並轉換,還可以用狀態機實現。串並轉換的方法比較簡單,在此不必贅述。  

流水線操作設計思想
        首先需要宣告的是,這裡所講述的流水線是指一種處理流程和順序操作的設計思想,並非FPGA、ASIC 設計中優化時序所用的“Pipelining”。  
        流水線處理是高速設計中的一個常用設計手段。如果某個設計的處理流程分為若干步驟,而且整個資料處理是“單流向”的,即沒有反饋或者迭代運算,前一個步驟的輸出是下一個步驟的輸入,則可以考慮採用流水線設計方法來提高系統的工作頻率。  

       流水線設計的結構示意圖如圖 3 所示。其基本結構為:將適當劃分的 n 個操作步驟單流向串聯起來。流水線操作的最大特點和要求是,資料流在各個步驟的處理從時間上看是連續的,如果將每個操作步驟簡化假設為通過一個 D 觸發器(就是用暫存器打一個節拍),那麼流水線操作就類似一個移位暫存器組,資料流依次流經 D 觸發器,完成每個步驟的操作。流水線設計時序如圖 4 所示。  


         流水線設計的一個關鍵在於整個設計時序的合理安排,要求每個操作步驟的劃分合理。如果前級操作時間恰好等於後級的操作時間,設計最為簡單,前級的輸出直接匯入後級的輸入即可;如果前級操作時間大於後級的操作時間,則需要對前級的輸出資料適當快取才能匯入到後級輸入端;如果前級操作時間恰好小於後級的操作時間,則必須通過複製邏輯,將資料流分流,或者在前級對資料採用儲存、後處理方式,否則會造成後級資料溢位。  
        在 WCDMA 設計中經常使用到流水線處理的方法,如 RAKE 接收機、搜尋器、前導捕獲等。流水線處理方式之所以頻率較高,是因為複製了處理模組,它是面積換取速度思想的又一種具體體現。  

資料介面的同步方法
        資料介面的同步是 FPGA/CPLD 設計的一個常見問題,也是一個重點和難點,很多設計不穩定都是源於資料介面的同步有問題。   
       在電路圖設計階段,一些工程師手工加入 BUFT 或者非門調整資料延遲,從而保證本級模組的時鐘對上級模組資料的建立、保持時間要求。還有一些工程師為了有穩定的取樣,生成了很多相差 90 度的時鐘訊號,時而用正沿打一下資料,時而用負沿打一下資料,用以調整數
據的取樣位置。這兩種做法都十分不可取,因為一旦晶片更新換代或者移植到其它晶片組的晶片上,取樣實現必須從新設計。而且,這兩種做法造成電路實現的餘量不夠,一旦外界條件變換(比如溫度升高),取樣時序就有可能完全紊亂,造成電路癱瘓。  
下面簡單介紹幾種不同情況下資料介面的同步方法: 

 1. 輸入、輸出的延時(晶片間、PCB佈線、一些驅動介面元件的延時等)不可測,或者有可能變動的條件下,如何完成資料同步?  
         對於資料的延遲不可測或變動,就需要建立同步機制,可以用一個同步使能或同步指示訊號。另外,使資料通過 RAM 或者 FIFO 的存取,也可以達到資料同步目的。  
        把資料存放在RAM或FIFO的方法如下:將上級晶片提供的資料隨路時鐘作為寫訊號,將資料寫入 RAM 或者 FIFO,然後使用本級的取樣時鐘(一般是資料處理的主時鐘)將資料讀出來即可。這種做法的關鍵是資料寫入 RAM 或者 FIFO 要可靠,如果使用同步 RAM 或者 FIFO,
就要求應該有一個與資料相對延遲關係固定的隨路指示訊號,這個訊號可以是資料的有效指示,也可以是上級模組將資料打出來的時鐘。對於慢速資料,也可以取樣非同步 RAM 或者 FIFO,但是不推薦這種做法。  
        資料是有固定格式安排的,很多重要資訊在資料的起始位置,這種情況在通訊系統中非常普遍。通訊系統中,很多資料是按照“幀”組織的。而由於整個系統對時鐘要求很高,常常專門設計一塊時鐘板完成高精度時鐘的產生與驅動。而資料又是有起始位置的,如何完成資料
的同步,並發現資料的“頭”呢?  
        資料的同步方法完全可以採用上面的方法,採用同步指示訊號,或者使用 RAM、FIFO 快取一下。找到資料頭的方法有兩種,第一種很簡單,隨路傳輸一個數據起始位置的指示訊號即可,對於有些系統,特別是非同步系統,則常常在資料中插入一段同步碼(比如訓練序列),接收端通過狀態機檢測到同步碼後就能發現數據的“頭”了,這種做法叫做“盲檢測”。  上級資料和本級時鐘是非同步的,也就是說上級晶片或模組和本級晶片或模組的時鐘是非同步時鐘域的。  
        前面在輸入資料同步化中已經簡單介紹了一個原則:如果輸入資料的節拍和本級晶片的處理時鐘同頻,可以直接用本級晶片的主時鐘對輸入資料暫存器取樣,完成輸入資料的同步化;如果輸入資料和本級晶片的處理時鐘是非同步的,特別是頻率不匹配的時候,則只有用處理時
鍾對輸入資料做兩次暫存器取樣,才能完成輸入資料的同步化。需要說明的是,用暫存器對非同步時鐘域的資料進行兩次取樣,其作用是有效防止亞穩態(資料狀態不穩定)的傳播,使後級電路處理的資料都是有效電平。但是這種做法並不能保證兩級暫存器取樣後的資料是正確
的電平,這種方式處理一般都會產生一定數量的錯誤電平資料。所以僅僅適用於對少量錯誤不敏感的功能單元。  為了避免非同步時鐘域產生錯誤的取樣電平,一般使用 RAM、FIFO 快取的方法完成非同步時鐘域的資料轉換。最常用的快取單元是 DPRAM,在輸入埠使用上級時鐘寫資料,在輸出埠使用本級時鐘讀資料,這樣就非常方便的完成了非同步時鐘域之間的資料交換。  

2. 設計資料介面同步是否需要新增約束?  
         建議最好新增適當的約束,特別是對於高速設計,一定要對週期、建立、保持時間等新增相應的約束。 
這裡附加約束的作用有兩點:  
a. 提高設計的工作頻率,滿足介面資料同步要求。通過附加週期、建立時間、保持時間等約束可以控制邏輯的綜合、對映、佈局和佈線,以減小邏輯和佈線延時,從而提高工作頻率,滿足介面資料同步要求。  
b. 獲得正確的時序分析報告。幾乎所有的 FPGA 設計平臺都包含靜態時序分析工具,利用這類工具可以獲得對映或佈局佈線後的時序分析報告,從而對設計的效能做出評估。靜態時序分析工具以約束作為判斷時序是否滿足設計要求的標準,因此要求設計者正確輸入約束,以便靜態時序分析工具輸出正確的時序分析報告。  
         Xilinx 和資料介面相關的常用約束有 Period、OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER等;Altera與資料介面相關的常用約束有Period、tsu、tH、tco 等。