標籤:
原文連結:
FPGA實戰開發技巧(2)
FPGA開發全攻略連載之十二:FPGA實戰開發技巧(3)
FPGA開發全攻略連載之十二:FPGA實戰開發技巧(4)
5.2 如何進行FPGA設計早期系統規劃
Ricky Su (www.rickysu.com)
這篇文章講述了如何用工具提高效率的方法,適用程度因人而異。
Situation: 在對FPGA 設計進行最初步的系統規劃的時候,需要進行模組劃分,模組介面定義等工作。通常,我們起初會在紙上進行設計,到了一定階段的定稿可能會輸入Visio 等工具,方便在Team 內部交流和審閱。雖然在紙上我們可以很隨意地書寫,而用紙畫的不方便就在於,如果想對某一個模組進行一些改動或者重畫模組,那麼常常因為留出的空餘紙張不夠,而導致拿一張新的白紙重新畫一遍,比較浪費時間。對於電子化的Visio 來說,方便修改是好處,但他不是專為設計FPGA 系統而設計的,添加輸入輸出連接埠沒那麼方便,也不會根據定義的模組自動產生HDL檔案。
HDLQuestion: 我們能不能使用更好軟體進行系統規劃呢?
Solution: 答案是可以的。下面以ISE 10.1 為例作說明:
1) 畫一個空模組,僅定義連接埠 - 建立Schematic,選擇Tools -> Symbol Wizard,裡面可以定義Symbol名和連接埠屬性。完成後產生sym 格式的Symbol。如果連接埠是一個bus,那麼可以用A(4:0) 的形式。
2) 將Symbol 添加到原理圖 - 在Schematic 的Symbol 頁面,選擇Categories 為工程檔案夾,在Symbols列表中就可以看到剛剛建立的Symbol。將它添加到原理圖中。
3) 重複1-2 步驟,建立所有Symbol,並串連連接埠。如果需要修改連線的名字或者模組的例化名,可以選擇需要修改名字的元件然後按右鍵--> Object Properties --> 在Name/InstName 窗格中填入需要的名字。
4) 如需修改Symbol,可以直接在sym 檔案中修改 - 可以按右鍵-> Add -> Pin 等等添加,也可以Copy已存在的Pin,然後改變PinName。但是ISE10.1 的Symbol Editor 對Add Pin 有一些Bug。因此在UltraEditor開啟這個sym 檔案,在裡面修改可能是更好的辦法。sym 檔案格式很易懂。改變 Symbol 連接埠後需要UpdateSchematic。在點到Schematic 後會自動彈出Update 對話方塊。
5) 產生原理圖對應的HDL 檔案 - 點擊"Sources in Project" 列表中的sch 檔案,在"Process" 視窗選擇"View HDL Functional Model"。這樣會自動產生Schematic 對應的HDL 檔案,其中例化了上面的各個模組。要改變HDL檔案類型,可以改變Project 屬性中的"Generated Simulation Language" 屬性。
6) 產生Symbol 對應的HDL 檔案 - 在開啟一個sym 檔案時,選擇Tools -> Generate HDL Template from Symbol。此時可以選擇產生VHDL 還是Verilog 的檔案。
至此,我們已經產生了頂層檔案和待開發的子模組檔案,我們已經可以在它的基礎上進行開發了。在開發過程中我們可能還會碰到這些問題:
1. 我想把設計圖列印下來- 除了ISE 內建的列印功能外,要列印好看的圖紙,還可以使用Synplify Pro或PlanAhead。由於以上流程產生的程式碼都是可綜合的,帶有連接埠資訊的HDL 會被綜合工具認為是一個blackbox的wrapper,因此我們可以用ISE 或Synplify 將這些代碼綜合,綜合工具會產生比較好看的綜合模組圖(RTL Schematic)。除了可以用ISE 和Synplify 開啟這些綜合網表產生RTL Schematic 之外,也可以用PlanAhead 開啟綜合網表,它的Schematic 顯示功能更為強大。
2. 我要修改某些模組的連接埠,並添加連線修改模組連接埠是否還需要在原來的Schematic 上編輯修改呢?這是仁者見仁智者見智的問題了。我個人在產生了帶連接埠資訊的HDL 後還是偏好修改HDL --> 綜合 --> 在PlanAhead 中產生需要的串連圖 --> 列印 --> 在列印稿上繼續思考寫寫劃劃 --> 繼續修改HDL 這樣的流程。
5.3.綜合和模擬技巧
田耘/雲創工作室
5.3.1 綜合工具XST的使用
所謂綜合,就是將HDL語言、原理圖等設計輸入翻譯成由與、或、非門和RAM、觸發器等基本邏輯單元的邏輯串連( 網表),並根據目標和要求( 約束條件) 最佳化所產生的邏輯串連,產生EDF 檔案。XST 內嵌在ISE 3 以後的版本中,並且在不斷完善。此外,由於XST 是賽靈思公司自己的綜合工具,對於部分賽靈思晶片專屬的結構具有更好的融合性。
完成了輸入、模擬以及管腳分配後就可以進行綜合和實現了。在過程管理區雙擊Synthesize-XST,5-1所示,就可以完成綜合,並且能夠給出初步的資源消耗情況。圖5-2 給出了模組所佔用的資源。
圖5-1 設計綜合視窗
圖5-2 綜合結果報告
綜合可能有3 種結果:如果綜合後完全正確,則在Synthesize-XST 前面有一個打鉤的綠色小圈圈;如果有警告,則出現一個帶驚嘆號的黃色小圓圈;如果有錯誤,則出現一個帶叉的紅色小圈圈。綜合完成之後,可以通過雙擊View RTL Schematics 來查看RTL 級結構圖,察看綜合結構是否按照設計意圖來實現電路。ISE 會自動調用原理圖編輯器ECS 來瀏覽RTL 結構。對於一個計數器,其RTL 結構圖5-3 所示,綜合結果符合設計者的意圖,調用了加法器和寄存器來完成邏輯。
圖5-3 經過綜合後的RTL級結構圖
2.綜合參數的設定
一般在使用XST 時,所有的屬性都採用預設值。其實XST 對不同的邏輯設計可提供豐富、靈活的屬性配置。下面對ISE9.1 中內嵌的XST 屬性進行說明。開啟ISE 中的設計工程,在過程管理區選中“Synthesis –XST”並單擊右鍵,彈出介面5-4 所示。
圖5-4 綜合選項
由圖5-4 可以看出,XST 配置頁面分為綜合選項(Synthesis Options)、HDL 語言選項(HDL Options) 以及賽靈思特殊選項(Xilinx Specific Options) 等三大類,分別用於設定綜合的全域目標和整體策略、HDL 硬體文法規則以及賽靈思特有的結構屬性。
1) 綜合選項參數
綜合參數配置介面5-4 所示,包括8 個選項,具體如下所列:
【Optimization Goal】:最佳化的目標。該參數決定了綜合工具對設計進行最佳化時,是以面積還是以速度作為優先原則。面積優先原則可以節省器件內部的邏輯資源,即儘可能地採用串列邏輯結構,但這是以犧牲速度為代價的。而速度優先原則保證了器件的整體工作速度,即儘可能地採用並行邏輯結構,但這樣將會浪費器件內部大量的邏輯資源,因此,它是以犧牲邏輯資源為代價的。
【Optimization Effort】:最佳化器努力程度。這裡有【normal】和【high】兩種選擇方式。對於【normal】,最佳化器對邏輯設計僅僅進行普通的最佳化處理,其結果可能並不是最好的,但是綜合和最佳化流程執行地較快。如果選擇【high】,最佳化器對邏輯設計進行反覆的最佳化處理和分析,並能產生最理想的綜合和最佳化結果,在對高效能和最終的設計通常採用這種模式;當然在綜合和最佳化時,需要的時間較長。
【Use Synthesis Constraints File】:使用綜合約束檔案。如果選擇了該選項,那麼綜合約束檔案XCF 有效。
【Synthesis Constraints File】:綜合約束檔案。該選項用於指定XST 綜合約束檔案XCF 的路徑。
【Global Optimization Goal】:全域最佳化目標。可以選擇的屬性包括有【AllClockNets】、【Inpad To
Outpad】、【Offest In Before】、【Offest Out After】、【Maximm Delay】。該參數僅對FPGA 器件有效,可用於選擇所設定的寄存器之間、輸入引腳到寄存器之間、寄存器到輸出引腳之間,或者是輸入引腳到輸出引腳之間邏
輯的最佳化策略。
【Generate RTL Schematic】:產生寄存器傳輸級視圖檔案。該參數用於將綜合結果產生RTL 視圖。
【Write Timing Constraints】:寫時序約束。該參數僅對FPGA 有效,用來設定是否將HDL 原始碼中用於控制綜合的時序約束傳給NGC 網表檔案,該檔案用於布局和布線。
【Verilog 2001】:選擇是否支援Verilog 2001 版本。
HDL語言選項
HDL 語言選項的配置介面5-5 所示,包括16 個選項,具體如下所列:
圖5-5 HDL語言選項的配置介面選項
【FSM Encoding Algorithm】:有限狀態機器編碼演算法。該參數用於指定有限狀態機器的編碼方式。選項有【Auto】、
【One-Hot】、【Compact】、【Sequential】、【Gray】、【Johnson】、【User】、【Speed1】、【None】編碼方式,預設為【Auto】編碼方式。
【Safe Implementation】:將添加安全模式約束來實現有限狀態機器,將添加額外的邏輯將狀態機器從無效狀態
調轉到有效狀態,否則只能複位來實現,有【Yes】、【No】兩種選擇,預設為【No】。
【Case Implementation Sytle】:條件陳述式實作類別型。該參數用於控制XST 綜合工具解釋和推論Verilog 的
條件陳述式。其中選項有【None】、【Full】、【Parallel】、【Full-Parallel】,預設為【None】。 對於這四種選項,區別如下:(1)【None】,XST 將保留程式中條件陳述式的原型,不進行任何處理;(2)【Full】,XST 認為條件陳述式是完整的,避免鎖存器的產生;(3)【Parallel】,XST 認為在條件陳述式中不能產生分支,並且不使用優先順序編碼器;(4)【Full-Parallel】,XST 認為條件陳述式是完整的,並且在內部沒有分支,不使用鎖存器和優先順序編碼器。
【RAM Extraction】:儲存空間擴充。該參數僅對FPGA 有效,用於使能和禁止RAM 宏介面。預設為允許使用RAM 宏介面。
【RAM Style】:RAM 實作類別型。該參數僅對FPGA 有效,用於選擇是採用塊RAM 還是分布式RAM 來作為RAM 的實作類別型。預設為【Auto】。
【ROM Extraction】:唯讀記憶體擴充。該參數僅對FPGA 有效,用於使能和禁止唯讀記憶體ROM 宏介面。預設為允許使用ROM 宏介面。
【ROM Style】:ROM 實作類別型。該參數僅對FPGA 有效,用於選擇是採用塊RAM 還是分布式RAM 來作為ROM 的實現和推論類型。預設為【Auto】。
【Mux Extraction】:多工器擴充。該參數用於使能和禁止多工器的宏介面。根據某些內定的演算法,對於每個已識別的多工/ 選取器,XST 能夠建立一個宏,並進行邏輯的最佳化。可以選擇【Yes】、【No】和【Force】
中的任何一種,預設為【Yes】。
【Mux Style】:多工實作類別型。該參數用於胃巨集建立器選擇實現和推論多工/ 選取器的宏類型。可以選擇【Auto】、【MUXF】和【MUXCY】中的任何一種,預設為【Auto】。
【Decoder Extraction】:解碼器擴充。該參數用於使能和禁止解碼器宏介面,預設為允許使用該介面。
【Priority Encoder Extraction】:優先順序解碼器擴充。該參數用於指定是否使用帶有優先順序的編碼器宏單元。
【Shift Register Extraction】:移位寄存器擴充。該參數僅對FPGA 有效,用於指定是否使用移位寄存器宏單元。預設為使能。
【Logical Shifter Extraction】:邏輯移位寄存器擴充。該參數僅對FPGA 有效,用於指定是否使用邏輯移位寄存器宏單元。預設為使能。
【XOR Collapsing】:異或邏輯合并方式。該參數僅對FPGA 有效,用於指定是否將級聯的異或邏輯單元合并成一個大的異或宏邏輯結構。預設為使能。
【Resource Sharing】:資源共用。該參數用於指定在XST 綜合時,是否允許複用一些運算處理模組,如加法器、減法器、加/ 減法器和乘法器。預設為使能。如果綜合工具的選擇是以速度為優先原則的,那麼就不考慮資源共用。
【Multiplier Style】:乘法器實作類別型。該參數僅對FPGA 有效,用於指定巨集建立器使用乘法器宏單元的方式。選項有【Auto】、【Block】、【LUT】和【Pipe_LUT】。預設為【Auto】。選擇的乘法器實作類別型和所選擇的器件有關。
2) 賽靈思特殊選項
賽靈思特殊選項用於將使用者邏輯適配到賽靈思晶片的特殊結構中,不僅能節省資源,還能提高設計的工作頻率,其配置介面5-6 所示,包括10 個配置選項,具體如下所列。
圖5-6 賽靈思指定的選項
【Add I/O Buffers】:插入I/O 緩衝器。該參數用於控制對所綜合的模組是否自動插入I/O 緩衝器。預設為自動插入。
【Max Fanout】:最大扇出數。該參數用於指定訊號和網線的最大扇出數。這裡扇出數的選擇與設計的效能有直接的關係,需要使用者合理選擇。
【Register Duplication】:寄存器複製。該參數用於控制是否允許寄存器的複製。對於高扇出和時序不能滿足要求的寄存器進行複製,可以減少緩衝器輸出的數目以及邏輯級數,改變時序的某些特性,提高設計的工作頻率。預設為允許寄存器複製。
【Equivalent Register Removal】:等效寄存器刪除。該參數用於指定是否把寄存器傳輸級功能等效的寄存器刪除,這樣可以減少寄存器資源的使用。如果某個寄存器是用賽靈思的硬體原語指定的,那麼就不會被刪除。預設為使能。
【Register Balancing】:寄存器配平。該參數僅對FPGA 有效,用於指定是否允許平衡寄存器。可選項有【No】、【Yes】、【Forward】和【Backward】。採用寄存器配平技術,可以改善某些設計的時序條件。其中【Forward】
為前移寄存器配平,【Backward】為後移寄存器配平。採用寄存器配平後,所用到的寄存器數就會相應地增減。預設為寄存器不配平。
【Move First Flip-Flop Stage】:移動前級寄存器。該參數僅對FPGA 有效,用於控制在進行寄存器配平時,是否允許移動前級寄存器。如果【Register Balancing】的設定為【No】,那麼該參數的設定無效。
【Move Last Flip-Flop Stage】:移動後級寄存器。該參數僅對FPGA 有效,用於控制在進行寄存器配平時,是否允許移動後級寄存器。如果【Register Balancing】的設定為【No】,那麼該參數的設定無效。
【Pack I/O Registers into IOBs】:I/O 寄存器置於輸入輸出塊。該參數僅對FPGA 有效,用於控制是否將邏輯設計中的寄存器用IOB 內部寄存器實現。在賽靈思系列FPGA 的IOB 中分別有輸入和輸出寄存器。如果將設計中的第一級寄存器或最後一級寄存器用IOB 內部寄存器實現,那麼就可以縮短IO 引腳到寄存器之間的路徑,這通常可以縮短大約1~2ns 的傳輸時延。預設為【Auto】。
【Slice Packing】:最佳化Slice 結構。該參數僅對FPGA 有效,用於控制是否將關鍵路徑的尋找表邏輯盡量配置在同一個Slice 或者CLB 模組中,由此來縮短LUT 之間的布線。這一功能對於提高設計的工作頻率、改善時序特性是非常有用的。 預設為允許最佳化Slice 結構。
【Optimize Instantiated Primitives】:最佳化已例化的原語。該參數控制是否需要最佳化在HDL 代碼中已例化的原語。預設為不最佳化。
在代碼編寫完畢後,需要藉助於測試平台來驗證所設計的模組是否滿足要求。ISE 提供了兩種測試平台的建立方法,一種是使用HDL Bencher 的圖形化波形編輯功能編寫,另一種就是利用HDL 語言,相對於前者使用簡單、功能強大。下面介紹基於Verilog 語言建立測試平台的方法。
首先在工程管理區將“Sources for”設定為Behavioral Simulation,在任意位置單擊滑鼠右鍵,並在彈出的菜單中選擇“New Source”命令,然後選中“Verilog Test Fixture”類型,輸入檔案名稱為“test_test”,再點擊“Next”進入下一頁。這時,工程中所有Verilog Module 的名稱都會顯示出來,設計人員需要選擇要進行測試的模組。
用滑鼠選中test,點擊“Next”後進入下一頁,直接點擊“Finish”按鍵,ISE 會在原始碼編輯區自動顯示測試模組的代碼:
`timescale 1ns / 1ps
module test_test_v;
// Inputs
reg clk;
reg [7:0] din;
// Outputs
wire [7:0] dout;
// Instantiate the Unit Under Test (UUT)
test uut (
.clk(clk),
.din(din),
.dout(dout)
);
initial begin
// Initialize Inputs
clk = 0;
din = 0;
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
end
endmodule
由此可見,ISE 自動產生了測試平台的完整架構,包括所需訊號、連接埠聲明以及模組調用的完成。所需的工作就是在initial…end 模組中的“// Add stimulus here”後面添加測試向量產生代碼。添加的測試代碼如下:
forever begin
#5;
clk = !clk;
if(clk == 1)
din = din + 1;
else
din = din;
end
完成測試平台後。在工程管理區將“Sources for”選項設定為Behavioral Simulation,這時在過程管理區會顯示與模擬有關的進程,5-7 所示。
圖5-7 模擬過程
選中圖5-7 中Xilinx ISE Simulator 下的Simulate Behavioral Model 項,點擊滑鼠右鍵,選擇快顯功能表的Properties項,會彈出5-8 所示的屬性設定對話方塊,最後一行的Simulation Run Time 就是模擬時間的設定,可將其修改為任意時間長度,本例採用預設值。
圖5-8 模擬屬性設定對話方塊
模擬參數設定完後,就可以進行模擬了,直接雙擊ISE Simulator 軟體中的Simulate Behavioral Model,則ISE 會自動啟動ISE Simulator 軟體,並得到5-9所示的模擬結果,從中可以看到設計達到了預計目標。
圖5-9 test模組的模擬結果
FPGA開發全攻略——ISE基本操作