1.建模思想

Verilog HDL中一個重要的思想就是建模,「建模」顧名思義就是「建立模塊」的意思,在Verilog HDL中,模塊是具有一定功能的電路結構組合。

FPGA的所有設計可以只有一個模塊,也可以模塊嵌套,即頂層模塊由子模塊構成,子模塊又由下級子模塊構成。如下圖所示:

模塊的嵌套結構

在設計初期就應該做好建模的規劃,也就是模塊的功能劃分。新手在初期設計的電路往往比較簡單,不會涉及很複雜的模塊劃分。

真正做項目時的設計往往都是系統級的,代碼動輒上萬行,項目初期期做好系統規劃,根據功能將系統劃將系統分割成更小的子模塊,並規劃各模塊的介面關係,這樣可以多名工程師分別同時設計不同的子模塊,最後進行聯合調試。

建模技巧還是由對電路系統的功能和結構的熟悉程度決定的。一個好的建模設計要層次清晰,各子模塊功能明確,這樣不僅使自己寫代碼時思路清晰,而且也利於別人閱讀你的代碼。

有的設計師沒有建模的概念,寫出來的代碼只有他自己能夠看得懂,甚至時間長了後自己也看不懂。

無論多麼複雜的系統,總能劃分成多個小的功能模塊。系統的設計可以按照下面三個步驟進行:

(1)把系統劃分成模塊;

(2)規劃各模塊的介面;

(3)對模塊編程並連接各模塊完成系統設計。

教科書中告訴我們FPGA的建模方法有數據流建模行為建模結構化建模等,在實際做設計的過程中,我們並不care到底用了什麼樣的建模方法。更多的是根據功能劃分模塊,然後代碼實現各模塊功能。

教科書中還告訴了我們,FPGA的設計流程有自下而上的設計流程自頂向下的設計流程,兩種方法的區別是先設計最底層子模塊還是先設計頂層模塊。但是在實際的設計過程中,這種概念是很模糊的,初學者不用刻意去在乎。

2.模塊概念

模塊(module)是verilog最基本的概念,是verilog設計中的基本單元,每個verilog設計的系統中都由若干module組成。

1、模塊的實際意義是代表硬體電路上的邏輯實體

2、每個模塊都實現特定的功能。

3、模塊之間是並行運行的。

4、模塊是分層的,高層模塊通過調用、連接低層模塊的實例來實現複雜的功能。

5、各模塊連接完成整個系統需要一個頂層模塊(top-module)。

下面是一個我從YouTube上找到的5分鐘介紹Verilog HDL的視頻,我進行了翻譯並添加了字幕,

視頻封面

04:455分鐘帶你了解Verilog HDL

module是層次化設計的基本構件,下面以視頻中的電路結構為例講解一下Verilog 中module的基本語法結構:

這是一個簡單的數字電路,電路功能是 o=(x+y)·(~y)

首先,是模塊聲明,我們用moduleendmodule關鍵詞來標記模塊的開始和結束,在module和endmodule之間的代碼都是屬於本模塊的

模塊的定義以module關鍵詞開始,以endmodule關鍵詞結束

其次,是模塊名,比如這裡我們將這個模塊取名為huamayi,模塊名是例化模塊時的聲明憑證。比如我設計了一種A型號的窗戶,蓋房子時,在房子上放置A窗戶就是例化的過程。

在一個工程中,模塊名是唯一的,本模塊取名為huamayi

接下來我們將描述模塊的埠列表,我們的電路結構有三個對外埠,每個埠都需要給出一個名稱,我們示例電路的對外埠分別是o,x,y

埠列表需要列出模塊的所有對外埠

還需要列出所有埠的輸入輸出類型,也就是埠定義,埠定義有三種:常見的input,output,還有inout。input為輸入埠,output為輸出埠,inout是雙向埠,既能輸出也能輸入,多用數據匯流排。示例電路中output 為o,input 為x,y:代碼表示如下圖

埠定義

邏輯功能定義,這是一個module最重要的部分,它描述了這個module的功能,在本例子中,通過例化與、或、非門來定義模塊邏輯功能,Verilog中內置了14種基本門級元件,我們可以像例化其他模塊一樣例化與、或、非門,在例化模塊時,需要為例化的模塊指定一個名稱,此名稱在本模塊內是唯一的。

在一座房子裡面可以有兩個相同的模塊都叫窗戶,但名稱不會相同,比如一個叫做卧室窗戶,一個叫做客廳窗戶;同樣的也可以在一個電路中例化一個模塊多次,只要例化後的名字不一樣既可以,比如可以例化兩個或門分別叫o1和o2。在本例子電路中,分別例化了與、或、非門各一個(o1、n1、a1)。

例化完了與、或、非門,還應描述它們在電路中的連接關係,或門的兩個輸入分別連接至電路模塊的輸入端x和y,但是或門的輸出端連接至了與門的輸入,它們之間的連線是個內部信號,需要定義一個wire(線網)信號類型or_wire,那麼這個或門o1的連接關係應該如何表示呢。

在Verilog內置的原語中,規定了基本門元件的信號列表裡輸入在前,輸出在後,

所以或o1的連接關係應該是or o1(or_wire, x, y);

同理,定義wire類型信號not_wire;

非門n1和與門a1的連接關係也確定了:

not n1(not_wire,y);

and a1(o, or_wire, not_wire);

整個電路的Verilog HDL代碼描述到此結束,你可以看到verilog代碼與電路之間有明確的對應關係。

上面的例子是結構級建模方法,最後,我們再以一個半加器行為級建模的例子總結一下Verilog HDL模塊的語法要素:

3.本講語法總結

1.空白符:使用空白符是為了提高可讀性及代碼組織。Verilog忽略空白符,除非用於分開其它的語言標記(注釋和列印輸出)。

2.注釋:注釋語法有兩種

第一種注釋為雙斜杠「//」,只能注釋單行

第二種注釋以「/*」開始,以「*/」結束,可一次注釋多行

3.標識符:標識符是用戶在描述時給Verilog對象起的名字,比如例子中的模塊名huamayi,埠名字x、y、o,以及例化的基本門元件o1、n1、a1等。標識符必須以字母(a-z, A-Z)或( _ )開頭,後面可以是字母、數字、( $ )或( _ )。如下圖中的紅字都是用戶定義的標識符。

例子電路中的標識符

4.關鍵字:verilog中定義了一些關鍵字,如module、output、or、wire等,verilog關鍵字區分大小寫,所有關鍵字都要求小寫。在代碼編輯器中,所有的關鍵字會高亮顯示

關鍵字舉例

5.基本門級元件:Verilog HDL中有關門類型的關鍵字共有26個(14個是門級元件,12個為開關級元件)。

但是常用到的只有8個,其他的完全不用掌握。下面列出了八個基本的門類(GATETYPE關鍵字和它們所表示的門的類型:

  • and-與門
  • nand-與非門
  • nor-或非門
  • or -或門
  • xor -異或門
  • xnor-異或非門
  • buf -緩衝器
  • not -非門

6.wire與reg:下期講

7.操作符:下期講

8.assign賦值語句:下期講

如果你喜歡我的文章,請關注點贊!

推薦閱讀:

相关文章