1. 面積與速度的平衡與互換
這裡的面積指乙個設計消耗fpga/cpld的邏輯資源的數量,對於fpga可以用消耗的ff(觸發器)和lut(查詢表)來衡量,更一般的衡量方式可以用設計所佔的等價邏輯門數。
面積和速度這兩個指標貫穿fpga/cpld設計的時鐘,是設計質量的評價的終極標準 —— 面積和速度是一對對立統一的矛盾體。
要求乙個同時具備設計面積最小、執行頻率最高是不現實的。更科學的設計目標應該是在滿足設計時序要求(包括對設計頻率的要求)的前提下,占用最小的晶元面積。或者在所規定的面積下,是設計的時序餘量更大、頻率跑的更高。這兩種目標充分體現了面積和速度的平衡的思想。
作為矛盾的兩個組成部分,面積和速度的地位是不一樣的。相比之下,滿足時序、工作頻率的要求更重要一些,當兩者衝突時,採用速度優先的準則。
從理論上講,如果乙個設計時序餘量較大,所能跑的速度遠遠高於設計要求,那麼就通過功能模組的復用來減少整個設計消耗的晶元面積,這就是用速度的優勢換取面積的節約。反之,如果乙個設計的時序要求很高,普通方法達不到設計頻率,那麼一般可以通過將資料流串並轉換,並行複製多個操作模組,對整個設計採取桌球操作和串並轉換的思想執行。
2. 硬體原則
硬體原則主要針對hdl**編寫而言:verilog是採用了c語言形式的硬體的抽象,它的本質作用在於描述硬體,它的最終實現結果是晶元內部的實際電路。所以評判一段hdl**的優劣的最終標準是:其描述並實現的硬體電路的效能,包括面積和速度兩個方面。
評價乙個設計的**水平較高,僅僅是說這個設計是由硬體想hdl**這種表現形式的轉換更加流暢、合理。而乙個設計最終效能,在更大程度上取決於設計工程師所構想的硬體實現方案的效率以及合理性。(hdl**僅僅是硬體設計的表達形式之一)
初學者片面追求**的整潔、簡短,是錯誤的,是與hdl的標準背道而馳的。正確的編碼方法,首先要做到對所需實現的硬體電路胸有成竹,對該部分的硬體的結構和連線十分清晰,然後再用適當的hdl語句表達出來即可。
另外,verilog作為一種hdl語言,是分層次的。系統級--演算法級--暫存器傳輸級--邏輯級--門級--開關級。構建優先順序樹會消耗大量的組合邏輯,所以如果能夠使用case的地方,盡量使用case代替if.....else......
3. 系統原則
系統原則包含兩個層次的含義:更高層面上看,是乙個硬體系統,一塊單板如何進行模組花費和任務分配,什麼樣的演算法和功能適合放在fpga裡面實現,什麼樣的演算法和功能適合放在dsp/cpu裡面實現,以及fpga的規模估算資料介面設計等。具體到fpga設計就要對設計的全域性有個巨集觀上的合理安排,比如時鐘域、模組復用、約束、面積、速度等問題,在系統上模組的優化最為重要。
一般來說實時性要求高,頻率快的功能模組適合fpga實現。而fpga和cpld相比,更適合實現規模較大、頻率較高、暫存器較多的設計。使用fpga/cpld設計時,應該對晶元內部的各種底層硬體資源,和可用的設計資源有乙個較深刻的認識。
比如fpga一般觸發器資源豐富,cpld的組合邏輯資源更加豐富。fpga/cpld一般是由底層可程式設計硬體單元、bram、佈線資源、可配置io單元、時鐘資源等構成。
底層可程式設計硬體單元一般由觸發器和查詢表組成。xilinx的底層可程式設計硬體資源較slice,由兩個ff和2個lut構成。altera的底層硬體資源叫le,由1個ff和1個lut構成。使用片內ran可以實現單口ram、雙口ram、同步/非同步fifo、rom、cam等常用單元模組。
一般的fpga系統規劃的簡化流程
4. 同步設計原則
非同步電路的邏輯核心是用組合邏輯電路實現,比如非同步的fifo/ram讀寫訊號,位址解碼等電路。電路的主要訊號、輸出訊號等並不依賴於任何乙個時鐘性訊號,不是由時鐘訊號驅動ff產生的。非同步時序電路的最大缺點是容易產生毛刺,在布局佈線後**和用邏輯分析儀觀測實際訊號時,這種毛刺尤其明顯。
同步時序電路的核心邏輯用各種各樣的觸發器實現,電路的主要訊號、輸出訊號都是由某個時鐘沿驅動觸發器產生出來的。同步時序電路可以很好的避免毛刺,布局佈線後**,和用邏輯分析儀取樣實際工作訊號都沒有毛刺。
是否時序電路一定比非同步電路使用更多的資源呢?從單純的asci設計來看,大約需要7個門來實現乙個d觸發器,而乙個門即可實現乙個2輸入與非門,所以一般來說,同步時序電路比非同步電路占用更大的面積。(fpga/cpld中不同,主要是因為單元塊的計算方式)
如何實現同步時序電路的延時?非同步電路產生延時的一般方法是插入乙個buffer、兩級與非門等,這種延時調整手段是不適用同步時序設計思想的。首先要明確一點hdl語法中的延時控制語法,是行為級的**描述,常用於**測試激勵,但是在電路綜合是會被忽略,並不能啟動延時作用。
5. 桌球操作
「 桌球操作 」 是乙個常常應用於資料流控制的處理技巧,桌球操作的處理流程為:輸入資料流通過 「 輸入資料選擇單元 」 將資料流等時分配到兩個資料緩衝區,資料緩衝模組可以為任何儲存模組,比較常用的儲存單元為雙口 ram(dpram) 、單口 ram(spram) 、 fifo 等。
在第乙個緩衝週期,將輸入的資料流快取到 「 資料緩衝模組 1」 ;在第 2 個緩衝週期,通過 「 輸入資料選擇單元 」 的切換,將輸入的資料流快取到 「 資料緩衝模組 2」 ,同時將 「 資料緩衝模組 1」 快取的第 1 個週期資料通過 「 輸入資料選擇單元 」 的選擇,送到 「 資料流運算處理模組 」 進行運算處理;在第 3 個緩衝週期通過 「 輸入資料選擇單元 」 的再次切換,將輸入的資料流快取到 「 資料緩衝模組 1」 ,同時將 「 資料緩衝模組 2」 快取的第 2 個週期的資料通過 「 輸入資料選擇單元 」 切換,送到 「 資料流運算處理模組 」 進行運算處理。如此迴圈。
6. 串並轉換設計技巧
串並轉換是 fpga 設計的乙個重要技巧,它是資料流處理的常用手段,也是面積與速度互換思想的直接體現。串並轉換的實現方法多種多樣,根據資料的排序和數量的要求,可以選用暫存器、 ram 等實現。
前面在桌球操作的圖例中,就是通過 dpram 實現了資料流的串並轉換,而且由於使用了 dpram ,資料的緩衝區可以開得很大,對於數量比較小的設計可以採用暫存器完成串並轉換。如無特殊需求,應該用同步時序設計完成串並之間的轉換。比如資料從序列到並行,資料排列順序是高位在前,可以用下面的編碼實現:prl_temp<=。
其中, prl_temp 是並行輸出快取暫存器, srl_in 是序列資料輸入。對於排列順序有規定的串並轉換,可以用 case 語句判斷實現。對於複雜的串並轉換,還可以用狀態機實現。串並轉換的方法比較簡單,在此不必贅述。
7. 流水線操作設計思想
首先需要宣告的是,這裡所講述的流水線是指一種處理流程和順序操作的設計思想,並非 fpga 、 asic 設計中優化時序所用的 「pipelining」 。
流水線處理是高速設計中的乙個常用設計手段。如果某個設計的處理流程分為若干步驟,而且整個資料處理是 「 單流向 」 的,即沒有反饋或者迭代運算,前乙個步驟的輸出是下乙個步驟的輸入,則可以考慮採用流水線設計方法來提高系統的工作頻率。
流水線設計的結構
流水線設計的結構示意圖如圖所示。其基本結構為:將適當劃分的 n 個操作步驟單流向串聯起來。流水線操作的最大特點和要求是,資料流在各個步驟的處理從時間上看是連續的,如果將每個操作步驟簡化假設為通過乙個 d 觸發器 ( 就是用暫存器打乙個節拍 ) ,那麼流水線操作就類似乙個移位暫存器組,資料流依次流經 d 觸發器,完成每個步驟的操作。
資料介面的同步方法
資料介面的同步是 fpga/cpld 設計的乙個常見問題,也是乙個重點和難點,很多設計不穩定都是源於資料介面的同步有問題。在電路圖設計階段,一些工程師手工加入 buft 或者非門調整資料延遲,從而保證本級模組的時鐘對上級模組資料的建立、保持時間要求。
還有一些工程師為了有穩定的取樣,生成了很多相差 90 度的時鐘訊號,時而用正沿打一下資料,時而用負沿打一下資料,用以調整資料的取樣位置。這兩種做法都十分不可取,因為一旦晶元更新換代或者移植到其它晶元 組的晶元上,取樣實現必須重新設計。而且,這兩種做法造成電路實現的餘量不夠,一旦外界條件變換 ( 比如溫度公升高 ) ,取樣時序就有可能完全紊亂,造成電路癱瘓。
設計資料介面同步是否需要新增約束?建議最好新增適當的約束,特別是對於高速設計,一定要對週期、建立、保持時間等新增相應的約束。這裡附加約束的作用有兩點:提高設計的工作頻率,滿足介面資料同步要求;獲得正確的時序分析報告。
常用的八個設計模式
單例模式 singleton 保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點。工廠方法 factory method 工廠方法是針對每一種產品提供乙個工廠類。通過不同的工廠例項來建立不同的產品例項。建立方法只用乙個,只建立一種產品,側重於 怎麼建立 簡單工廠 staticfactory me...
FPGA知識點 FPGA的時鐘網路資源
fpga的時鐘網路資源一般分為三大類 1.全域性時鐘網路資源 2.區域時鐘網路資源 3.i o時鐘網路資源原因 前兩種主要針對fpga內部的一些資源,對於介面資源,則由專門的io時鐘網路資源來完成時鐘訊號承載工作。主要原因有三 介面資源的暫存器數量較少,不需要大型的樹狀時鐘網路來減少時鐘到達各個目的...
八個比較重要的http方法
get 傳送簡單資訊 安全效能差 有字數限制 post 傳送重要資訊 無字數限制 head 只要求得到get返回結果的首部份。它能提供索請求的url的有關資訊,但是不會返回實際要用的東西 trace 要求請求訊息傳送,測試排錯用 put 指定要把所包含的資訊放在請求的url上 delete 刪除指定...