FPGA/CPLD設(shè)計小技巧
這是一個在設(shè)計中常犯的錯誤列表這些錯誤常使得你的設(shè)計不可靠或速度較慢為了提高你的設(shè)計性能和提高速度的可靠性你必須確定你的設(shè)計通過所有的這些檢查 。
本文引用地址:http://www.ex-cimer.com/article/201710/365644.htm可靠性
為時鐘信號選用全局時鐘緩沖器BUFG
不選用全局時鐘緩沖器的時鐘將會引入偏差 。
只用一個時鐘沿來寄存數(shù)據(jù)
使用時鐘的兩個沿是不可靠的因為時鐘的某沿或者兩個沿會漂移; 如果時鐘有漂移而且你只使用了時鐘的一個沿你就降低了時鐘邊沿漂移的風(fēng)險。
這個問題可以這樣來解決就是允許CLKDLL自動糾正時鐘的占空比以達百分之五十的占空比否則強烈建議你只使用一個時鐘沿
除了用CLKDLL或DCM產(chǎn)生的時鐘外不要在內(nèi)部產(chǎn)生時鐘.
這包括產(chǎn)生門控時鐘和分頻時鐘
作為替代可以建立時鐘使能或使用CLKDLL或DCM來產(chǎn)生不同的時鐘信號。
對于一個純同步設(shè)計建議你在任何可能的情況下只使用一個時鐘
可靠性
為時鐘信號選用全局時鐘緩沖器BUFG
不選用全局時鐘緩沖器的時鐘將會引入偏差 。
只用一個時鐘沿來寄存數(shù)據(jù)
使用時鐘的兩個沿是不可靠的因為時鐘的某沿或者兩個沿會漂移; 如果時鐘有漂移而且你只使用了時鐘的一個沿你就降低了時鐘邊沿漂移的風(fēng)險。
這個問題可以這樣來解決就是允許CLKDLL自動糾正時鐘的占空比以達百分之五十的占空比否則強烈建議你只使用一個時鐘沿
除了用CLKDLL或DCM產(chǎn)生的時鐘外不要在內(nèi)部產(chǎn)生時鐘.
這包括產(chǎn)生門控時鐘和分頻時鐘
作為替代可以建立時鐘使能或使用CLKDLL或DCM來產(chǎn)生不同的時鐘信號。
對于一個純同步設(shè)計建議你在任何可能的情況下只使用一個時鐘
不要在內(nèi)部產(chǎn)生異步的控制信號 例如復(fù)位信號或者置位信號
內(nèi)部產(chǎn)生的異步控制信號會產(chǎn)生毛刺
作為替代可以產(chǎn)生一個同步的復(fù)位/置位信號這個信號的譯碼要比需要作用的時刻提前一個時鐘周期
不要使用沒有相位關(guān)系的多個時鐘
你也許并不總能避免這個條件在這些情況下確定你已使用了適當(dāng)?shù)耐诫娐穪砜缭綍r鐘域
不要使用沒有相位關(guān)系的多個時鐘
再次你也許并不總能避免這個條件相反許多設(shè)計都需要這樣在這 些情況下確定你已適當(dāng)?shù)丶s束了跨越時鐘域的路徑
不要使用內(nèi)部鎖存器
內(nèi)部鎖存器會混淆時序而且常常會引入另外的時鐘信號
內(nèi)部鎖存器在透明門打開時可以被看成是組合邏輯但在門被鎖存時 可以被看成是同步元件這將會混淆時序分析
內(nèi)部鎖存器常常會引入門控時鐘門控時鐘會產(chǎn)生毛刺使得設(shè)計變得不可靠
性能
邏輯級的時延不要超過時序預(yù)算的百分之五十
每個路徑邏輯級時延可以在邏輯級時序報告或布局后時序報告中找到詳細分析了每個路徑之后時序分析器將生成每個路徑時延的統(tǒng)計量檢查一下總共的邏輯級時延超過了你的時序預(yù)算的百分之五十嗎?
IOB 寄存器
IOB寄存器提供了最快的時鐘到輸出和輸入到時鐘的時延
首先有一些限制對于輸入寄存器在從管腳到寄存器間不能有組合邏 輯存在對于輸出寄存器在寄存器和管腳之間也不能有組合邏輯存在對于三態(tài)輸出在IOB中的所有的寄存器必須使用同一個時鐘信號和復(fù)位信號而且IOB三態(tài)寄存器必須低電平有效才能放到IOB中三態(tài)緩沖器低電平有效所以在寄存器和三態(tài)緩沖器之間不需要一個反相器
你必須使軟件能夠選用IOB寄存器你可以設(shè)置全局實現(xiàn)選項為輸入 輸出或輸入輸出選擇IOB寄存器缺省值為關(guān)(off)。
你也可在綜合工具或在用戶約束文件UCF中設(shè)定使得能夠使用IOB寄存器句法為: INST IOB = TRUE;
對于關(guān)鍵的輸出選擇快速轉(zhuǎn)換速率
可以為LVCMOS和LVTTL電平選擇轉(zhuǎn)換速率快速的轉(zhuǎn)換速率會降低輸 出時延但會增加地彈所以你必須在仔細考慮的基礎(chǔ)之上選擇快速轉(zhuǎn)換速率
流水邏輯
如果你的設(shè)計允許增加延遲對組合邏輯采用流水操作可以提高性能
在Xilinx的FPGA中有大量的寄存器對每一個四輸入函數(shù)發(fā)生器有一個對應(yīng)的寄存器在犧牲延遲的情況下利用這些寄存器來增加數(shù)據(jù)吞吐量
為四輸入的查找表結(jié)構(gòu)進行代碼優(yōu)化
記住每一個查找表可以建立一個四輸入的組合邏輯函數(shù)如果你需要更大的功能記住實現(xiàn)該功能所需的查找表的數(shù)目
使用Case語句而不是if-then-else語句
復(fù)雜的if-then-else語句通常會生成優(yōu)先級譯碼邏輯這將會增加這些路徑上的組合時延
用來產(chǎn)生復(fù)雜邏輯的Case語句通常會生成不會有太多時延的并行邏輯 對于Verilog用戶可以使用編譯向?qū)ynopsys parallel_case
使用一個或多個核生成器塊
核生成器塊針對 Xilinx的結(jié)構(gòu)進行了優(yōu)化許多塊都可以允許用戶配置包括大小寬度和流水延遲
查看你設(shè)計中的關(guān)鍵路徑你是否可以在核生成器中產(chǎn)生一個核來提高鍵路徑性能
使有限狀態(tài)機FSM保持在層次中的自己所在的那一級
為了允許綜合工具完全優(yōu)化你的FSM它必須在它自己的塊中優(yōu)化如果不是這樣的話這將使得綜合工具將FSM邏輯和它周圍的邏輯一起優(yōu)化
FSM不能包括任何的算術(shù)邏輯數(shù)據(jù)通路邏輯或者其它與狀態(tài)機不相關(guān)的組合邏輯
使用兩個進程或always塊的有限狀態(tài)機
下一個狀態(tài)和輸出譯碼邏輯必須放在獨立的進程或always塊中這將不允許綜合工具在輸出和下一個狀態(tài)譯碼邏輯之間共享資源
使用一位有效編碼有限狀態(tài)機FSM
一位有效編碼通常會在富含寄存器的FPGA中提供最高性能的狀態(tài)機
為每一個葉級leaf-level塊提供寄存輸出
葉級塊是可以推論邏輯的塊而結(jié)構(gòu)級(structural-level)的塊僅例化較 底層的塊這樣就建立了層次
如果葉級塊被鎖存輸出則可使綜合工具保留層次這可使分析這些代碼 的靜態(tài)時序變得比較容易
對邊界進行寄存可以使得各個塊之間有確定的時序關(guān)系
利用有適當(dāng)管腳定位約束的數(shù)據(jù)流
Xilinx器件中的數(shù)據(jù)流是在水平方向上的這里部分的原因是進位鏈?zhǔn)窃诖怪狈较蛏系牧硗膺€有其它的原因三態(tài)緩沖線在水平方向上排列塊之間也有水平方向上的直接連接
為了利用數(shù)據(jù)流地址和數(shù)據(jù)管腳必須放在芯片的左側(cè)或右側(cè)同時注意因為進位鏈?zhǔn)亲韵露系乃詫⒆畹臀环旁谧钕旅婵刂菩盘柗旁谛酒纳喜亢拖虏?/p>
不同的計數(shù)器風(fēng)格
二進制計數(shù)器是非常慢的如果你的二進制計數(shù)器是關(guān)鍵路徑可以考慮使用不同的風(fēng)格的計數(shù)器LFSRPre-scalar或Johnson
設(shè)計是層次化的被分成不同的功能塊和技術(shù)塊
設(shè)計必須被劃分成不同的功能塊首先是較頂層的功能塊然后是較底層的塊你也應(yīng)該包括特定技術(shù)的塊
設(shè)計層次化必須使得設(shè)計更可讀更易調(diào)試更易復(fù)用
復(fù)制的高扇出網(wǎng)絡(luò)
這可以通過你的綜合工具來進行控制然而為了更緊地控制復(fù)制你可以選擇復(fù)制寄存器
利用四種全局約束來對設(shè)計進行全局的約束周期對每個時鐘偏置輸入偏置輸出管腳-到-管腳
你也許會有針對多周期路徑失敗路徑和關(guān)鍵路徑的其它約束但是你必須總要從指定四個全局約束開始
評論