學習筆記:FPGA設計Verilog基礎(一)——Verilog程式碼規範
本筆記內容轉自米聯客。
一、Verilog 設計規範及背景介紹
1、專案架構設計
專案的構架用於團隊的溝通,以及專案設計的全域性把控
2、介面時序設計規範
模組和模組之間的通過模組的介面實現關聯,因此規範的時序設計,對於程式設計的過程,以及程式的維護,團隊之間的溝通都是非常必要的。
3、技術背景
現代專用積體電路的設計是藉助於電子電路設計自動化(EDA)工具完成的。學習和掌握硬體描述語言(HDL)是使用電子電路設計自動化(EDA)工具的基礎。
學過微控制器的都知道,我們的程式程式碼是一條指令一條指令來執行的。CPU 首先通過匯流排,讀取一條指令,然後解析這條指令,再然後執行這條指令。我們寫的 C 程式碼總是一條一條地執行。如果我們同時要處理 10 個子程式,那麼 CPU 必須一個個子程式來執行。如果有些實時性較高的,如掃描下矩陣鍵盤,VGA 刷個屏,都需要中斷來實現。如果刷屏時間比較長,就會影響到你按鍵的靈敏度。另外比如,我們的微控制器在用串列埠接收資料,並且也要傳送資料,同時我們的微控制器要處理外部的 IO 訊號,如果我們的 IO 訊號非常快,並且有幾百個訊號,可能同一個時刻觸發,很顯然,如果這些訊號比較快,那麼我們的微控制器,就沒法實現了。
這是筆者簡單舉了兩種情況,那麼如果使用 FPGA 就可以很方便地解決以上問題。由於 FPGA 的並行性,不管是掃描鍵盤,還是掃描 VGA,都可以把它們做成獨立的模組,時間上沒有衝突,每個模組可以同時執行。
再比如用一個 FPGA,就可以同時完成串列埠的收發,以及 IO 的監控,因為 FPGA的程式實際上就是電路,是瞬間就完成了,我們只要用 Verilog 寫出來相應功能的程式模組,這些模組是同時執行的。
這樣看來 FPGA 真是太強大了,太完美了。但不要高興地太早,由於 FPGA 可以在一個時鐘內,完成多條語句的賦值,但是如果賦值必須有個前後順序呢?也就是需要一步步的完成,怎麼辦?如果說並行控制是
a、順序控制的第一種辦法——狀態機設計
可以說,我們用 Verilog 來寫程式,狀態機無處不在。顧名思義,通過設計狀態機,我們可可以控制 Verilog 讓他該快的時候快,該慢的時候慢,該做什麼的時候就做什麼。這才是我們想要的。狀態機是很不錯的東西,初學者對他望而生畏,而熟悉 Verilog 語言的人都對其會愛不釋手。n
b、順序控制的第二種方法——FPGA 中執行 CPU
FPGA 也可以執行 CPU?是的,沒錯,FPGA 也可以像微控制器一樣使用,這樣我們就可以用
這裡有兩個概念,軟Core和硬Core:
1)軟核就是用程式碼就是能現的 CPU 核,這種核配置靈活,成本較低。可以在任何資源足夠的FPGA中實現,使用非常靈活。而且在大容量的FPGA中還可以整合多個軟core,實現多核並行處理。但是要佔用FPGA 寶貴的資源。
2)硬核就是一塊電路,做到 FPGA 內部,方便使用,效能更高。比如 Xilinx 的 DDR記憶體控制器,就是一種硬核,其執行速度非常高,我們只要做些配置,就可以方便使用,缺點是不夠靈活。
兩種核可謂各有所長。
不過,FPGA還是有缺點。對於某些高主頻的應用,FPGA就無能為力了。現在雖然理論上FPGA可以支援的500MHz,但在實際設計中,往往200MHz以上工作頻率就很難實現了。
FPGA還是ASIC ?
根據具體看情況而定,從我們上面的一些介紹,筆者相信你已經有一定的判斷能力了。筆者的建議是,低速場合,實時性要求的低的地方用ASIC,有些功能用ASIC 方便的用ASIC,成本低的用ASIC。排除那些可以不用FPGA 地方,那麼剩餘的就要考慮是不是用FPGA 來實現更加方便。一般來說,FPGA 程式開發相對來說要難度大一些,並且成本要高一些。
講了這麼多的背景知識,我們來看一小段程式碼:
Verilog語言:
u32sum(a,b)
{
a=a+1;
b=b+1;
c=a+b;
return c;
}
C程式碼:
[email protected](posedgeclk)
begin
a = a + 1;
b = b + 1;
c = a + b;
end
同樣是實現了求和,但是,C 程式碼需要 N 多個(很多)CPU 週期才得出結果,而用Verilog 一個 clk 週期就計算出來了。或許現在你還不知道為什麼。沒關係,下面的記憶體筆者講解 Verilog 語言基礎。