《FPGA入門教程》看書隨筆——RTL設計
阿新 • • 發佈:2019-01-09
1、使用verilog進行RTL設計一般可歸納為3種基本的描述方式:
(1)資料流描述:採用assign連續賦值語句
(2)行為描述:使用always語句或initial語句塊的過程賦值語句
(3)結構化描述:例項化已有的功能模組或原語,即平常所說的元件例化和IP core.
過程賦值語句包括非阻塞過程賦值、阻塞過程賦值和 連續過程賦值。
2、RTL級設計時需注意的問題
(1)凡是在always或initial語句中賦值的變數,一定是reg型別變數;凡是在assign語句中賦值的變數,一定是wire型別變數、
(2)定義儲存器:reg[3:0] MEMAORY[0:7];地址為0~7,每個儲存單元都是4bit;
(3)由於硬體是並行工作的,在Verilog語言的module中,所有描述語句(包括連續輔助語句assign、行為語句塊always和initial語句塊以及模組例項化)都是併發執行的。
(4)使用完備的if...else語句,使用個條件完備的case語句並設定default操作。以防止產生鎖存器latch,因為鎖存器對毛刺敏感
(5)嚴禁設計組合邏輯反饋環路,它最容易引起振盪、毛刺、時序違規等問題 。
(6)不要在兩個或兩個以上的語句塊(always或initial)中對同一個訊號賦值
3、阻塞賦值與非阻塞賦值
(1)阻塞賦值的操作符號為“=”。它的含義是在計算等式右側表示式值及完成其賦值時不 會被其他的 verilog 語句打斷,就是說,在當前賦值沒有完成之前,它阻塞了其他 verilog 語句的執行。
(2) 非阻塞賦值的操作符為“<=”。它的含義是子啊賦值操作時刻開始計算等式右邊,賦值操作時刻結束時更新等式左邊。在這器件,可以執行其他Verilog語句,也不阻塞其他Verilog語句的執行。
在實際使用中,應該遵循的原則是:
(1)在時序邏輯中,使用非阻塞賦值
(2)在組合邏輯中,使用阻塞賦值
(3)在同一個always塊中,不要混合使用阻塞賦值和非阻塞賦值
(4)在同一個always塊中,如果既有組合邏輯又有時序邏輯,使用非阻塞賦值
(5)always模組的敏感表為電平敏感訊號時,使用阻塞賦值
(6)不要使用#0時延進行賦值
(7)不要在阻塞賦值中使用時延語句
(8)在行為級描述中,如語句間是順序執行的關係,使用阻塞賦值
4、哪些是不可綜合的程式碼
(1)對於一些抽象的行為描述程式碼是不可綜合的。延遲語句(如:#delay)、初始化語句initial以及等待語句wait。
(2)對於一些抽象的運算程式碼也是不可綜合的。
(3)對於不定次數的迴圈運算是不可綜合的。
5、面積和速度是FPGA設計的兩個標準。
“面積”是指一個設計所消耗FPGA的邏輯資源數量,“速度”指設計在晶片上穩定執行所能達到的最高頻率。
優化RTL程式碼追求的最終目標是面積或速度,或者是兩者的平衡。
6、Pipelining技術
即流水線時序優化方法 ,其本質是調整一個較大的組合邏輯路徑中暫存器位置,用暫存器合理分割改組合邏輯路徑,從而降低路徑Clock-To-Output 和Setup等時間引數的要求,達到提高設計頻率的目的。
7、模組複用與資源共享
模組複用與資源共享的目的在於節約FPGA的邏輯資源,即節約面積。
8、邏輯複製時一種通過增加面積而改善時序條件的優化手段。邏輯複製最常用的場合是調整訊號的扇出。
9、狀態機的設計
推薦採用兩段寫法(2個always模組)或三段寫法(3個always模組)。
兩段寫法的核心思想是,一個always模組採用同步時序描述狀態轉移;另一個always模組採用組合邏輯方式判斷轉檯轉移條件,描述狀態轉移規律。其結構如下:
三段式寫法的核心思想是,一個always模組採用同步時序的方式描述狀態轉移,一個採用組合邏輯的方式判斷狀態轉移條件,描述狀態轉移規律,第三個always模組使用同步時序電路描述每個狀態的輸出。