1. 程式人生 > >學習筆記:FPGA設計Verilog基礎(一)——Verilog程式碼規範

學習筆記: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 可以在一個時鐘內,完成多條語句的賦值,但是如果賦值必須有個前後順序呢?也就是需要一步步的完成,怎麼辦?如果說並行控制是

FPGA 的優點,那麼順序控制就是他的不足之處。世界上永遠沒有完美的東西,我們在獲得一種優勢的時候,往往也獲得了一種劣勢。但是,辦法總比問題多。

a、順序控制的第一種辦法——狀態機設計

    可以說,我們用 Verilog 來寫程式,狀態機無處不在。顧名思義,通過設計狀態機,我們可可以控制 Verilog 讓他該快的時候快,該慢的時候慢,該做什麼的時候就做什麼。這才是我們想要的。狀態機是很不錯的東西,初學者對他望而生畏,而熟悉 Verilog 語言的人都對其會愛不釋手。n

b、順序控制的第二種方法——FPGA 中執行 CPU 

    FPGA 也可以執行 CPU?是的,沒錯,FPGA 也可以像微控制器一樣使用,這樣我們就可以用

C 程式碼來一條條指令來執行了,這不是太強大了?是的,沒錯。關鍵的問題是,我們是可以把一些邏輯控制順序複雜的事情用 C 程式碼來實現,而實時處理的部分仍然用 Verilog 來實現。並且那部分 Verilog 可以被 C 程式碼控制。Xilinx FPGA 目前支援的CPU MicroblazeARM9,POWERPCCortex A9zynq 是Xilinx 比較新的一款片子,完美的將 Cortex A9 FPGA 整合到一起,有興趣的可以淘寶搜尋 Mi Z702、zedboard)其中Microblaze 是一款軟 CPU,是軟核。ARM9Cortex A9 POWERPC 是硬核。

這裡有兩個概念,軟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 語言基礎。