狀態機的基本概念安全
硬件設計很講究並行設計思想,雖然用Verilog描述的電路大都是並行實現的,可是對於實際的工程應用,每每須要讓硬件來實現一些具備必定順序的工做,這就要用到狀態機的思想。異步
狀態機就是經過不一樣的狀態遷移來完成一些特定的順序邏輯,硬件的並行性決定了用Verilog描述的硬件實現都是並行執行的,那麼若是但願分多個時間完成一個任務,怎麼辦?或許能夠用多個使能信號來銜接各個不一樣的模塊,可是多少有些繁瑣,狀態機的提出就大大簡化了這一工做。模塊化
構成狀態機的基本要素是狀態機的輸入、輸出和狀態。輸入就是一些引起狀態變化的條件;輸出就是狀態變化後引發的變化,如控制總線、地址總線和數據總線的輸出值就是狀態變化決定的;狀態就是空閒、讀、寫等,他們通常是由一些邏輯值來表示。函數
狀態機根據其狀態變化是否與輸入條件相關分爲兩類,即Moore型狀態機和Mealy型狀態機。Moore型狀態機的狀態變化僅與當前狀態有關,而與輸入條件無關,Mealy型狀態機的狀態變化不只與當前狀態有關還取決於當前的輸入條件。工具
三種不一樣狀態機寫法測試
狀態機通常有三種不一樣的寫法,即一段式、兩段式和三段式的狀態機寫法,他們在速度、面積、代碼可維護性等各個方面互有優劣設計
一、好的狀態機標準 狀態機要安全,不會進入死循環,特別是不會進入非預期的狀態,並且因爲某些擾動進入非設計狀態,也能很快的恢復到正常的狀態循環中來,這裏面有兩層含義,其一要求該FSM的綜合實現結果無毛刺等異常擾動;其二要求FSM都要完備,即便受到異常擾動進入非設計狀態,也能很快恢復到正常狀態;好的狀態機的設計要知足設計的面積和速度的要求,狀態機的設計要清晰易懂 易維護 。接口
二、狀態機的描述方法資源
狀態機描述時關鍵是要描述清楚幾個狀態機的要素:如何進行狀態轉移;每一個狀態的輸出是什麼;狀態轉移的條件等。input
一段式:整個狀態機寫到一個always模塊裏面,在該模塊中即描述狀態轉移又描述狀態的輸入和輸出;
二段式:用兩個always模塊來描述狀態機,其中一個always模塊採用同步時序描述狀態轉移,另外一個模塊採用組合邏輯判斷狀態轉移的條件,描述狀態轉移規律及輸出。
三段式:在兩個always模塊描述方法基礎上,使用第三個always模塊。一個always模塊採用同步時序描述狀態轉移,一個always採用組合邏輯判斷狀態轉移的條件,描述狀態轉移規律,另外一個always模塊描述狀態輸出,能夠用組合電路輸出,也能夠用時序電路輸出。
復位設計
異步復位always(@posedge clk or negedge rst)
同步復位always(@posedge clk ) begin if(!rst)...end;與異步復位相比,同步復位沒有用到存儲器的CLR端口,綜合出來的實際電路知識把復位信號做爲輸入邏輯的使能信號,那麼這樣的同步復位勢必會額外增長FPGA內部的資源消耗。
同步復位在時鐘信號clk的上升沿觸發時進行系統是否復位的判斷,這下降了亞穩態出現的機率,雖然缺點在於須要消耗更多的器件資源,沒法充分利用專用的復位端口CLR
FPGA重要設計思想及工程應用
一、速度和麪積互換原則
二、乒乓操做及串並轉換設計
三、流水線設計
四、邏輯複製與模塊複用
五、模塊化設計
通常整個設計的頂層只作例化,不作邏輯,而後頂層下面會有模塊A\B\C等,下面又能夠分多個子模塊。如此一來,就能夠將大規模複雜系統按照必定規則劃分爲若干模塊,而後對每一個模塊進行設計 輸入與綜合,並將實現結果約束在預先設置好的區域內,最後將全部模塊的實現結果有機的組織起來,就能完成整個系統的設計。
對於頂層模塊的設計,主管設計師須要完成頂層模塊的設計輸入與綜合,這也是進行模塊化設計實現階段的第一步即初始預算。
六、時鐘設計技巧
基於FPGA的跨時鐘域信號處理
簡單的TestBench設計
所謂TestBench,即測試平臺,詳細的說就是給待驗證的設計添加激勵,同時觀察他的輸出響應是否符合設計要求。就是要模擬一個和待驗證涉及接口的各類外圍設備。
仿真測試是FPGA設計流程中必不可少的步驟,對於測試結果的判斷不只能夠經過觀察對比波形獲得,並且能夠靈活的使用腳本命令將有用的輸出信息打印到終端或者產生文本進行觀察,也能夠寫一段代碼讓它自動比較輸出結果,總之,TestBench的設計時多種多樣的,是基於行爲級的語法。
簡單的TestBench的搭建
①對被測試設計的頂層接口進行例化
②給被測試設計的輸入接口添加激勵
③判斷被測試設計的輸出響應是否知足設計要求
input轉化爲reg,output轉換爲wire
inout端口,例化時也爲wire
對於激勵信號的產生,只提最基本的時鐘信號和復位信號的產生,時鐘信號產生方式有不少,使用initial和always語句都是能夠的
TestBench書寫技巧
一、封裝有用的子程序
使用task進行代碼的封裝,它可以和C語言的子函數同樣被靈活的調用
二、關於變量的定義
EX1C
EX2C
三、HDL的並行性
四、結構化TestBench
五、讀寫紊亂狀態
六、防止同時調用task
時序分析基礎
一、靜態時序分析基礎
靜態時序分析的前提就是設計者先提出要求,而後時序分析工具纔會根據特定的時序模型進行分析,即有約束纔會有分析,若設計者不添加時序約束,那麼時序分析就無從談起
二、時鐘相關概念
創建時間,是指在時鐘上升沿到來以前數據必須保持穩定的時間,
保持時間,是指時鐘上升沿到來之後數據必須保持穩定的時間。
一個數據須要在時鐘的上升沿被鎖存,那麼這個數據就必須在這個時鐘上升沿的創建時間和保持時間內保持穩定。
三、數據傳輸路徑分析
基於ISE的時序約束