天天看點

FPGA設計的常用思想與技巧

本文讨論的四種常用 FPGA/CPLD 設計思想與技巧:乒乓操作、串并轉換、流水線操作、資料接口同步化,都是 FPGA/CPLD 邏輯設計的内在規律的展現,合理地采用這些設計思想能在FPGA/CPLD 設計工作種取得事半功倍的效果。  

        FPGA/CPLD 的設計思想與技巧是一個非常大的話題,由于篇幅所限,本文僅介紹一些常用的設計思想與技巧,包括乒乓球操作、串并轉換、流水線操作和資料接口的同步方法。希望本文能引起工程師們的注意,如果能有意識地利用這些原則指導日後的設計工作,将取得事半功倍的效果!  

乒乓操作   

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

FPGA設計的常用思想與技巧

         乒乓操作的處理流程為:輸入資料流通過“輸入資料選擇單元”将資料流等時配置設定到兩個資料緩沖區,資料緩沖子產品可以為任何存儲子產品,比較常用的存儲單元為雙口 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。以下分析各個節點端口的資料速率。 

FPGA設計的常用思想與技巧

         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”。  

        流水線處理是高速設計中的一個常用設計手段。如果某個設計的處理流程分為若幹步驟,而且整個資料處理是“單流向”的,即沒有回報或者疊代運算,前一個步驟的輸出是下一個步驟的輸入,則可以考慮采用流水線設計方法來提高系統的工作頻率。  

FPGA設計的常用思想與技巧

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

FPGA設計的常用思想與技巧

         流水線設計的一個關鍵在于整個設計時序的合理安排,要求每個操作步驟的劃分合理。如果前級操作時間恰好等于後級的操作時間,設計最為簡單,前級的輸出直接彙入後級的輸入即可;如果前級操作時間大于後級的操作時間,則需要對前級的輸出資料适當緩存才能彙入到後級輸入端;如果前級操作時間恰好小于後級的操作時間,則必須通過複制邏輯,将資料流分流,或者在前級對資料采用存儲、後處理方式,否則會造成後級資料溢出。  

        在 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 等。 

繼續閱讀