1. 程式人生 > >verilog HDL -模塊代碼基本結構

verilog HDL -模塊代碼基本結構

htm 清晰 判斷 藍色 層次 一個空格 命名 p s 因此

1--verilog HDL 語言的預編譯指令作用:指示在編譯verliog HDL源代碼前,需要執行哪些操作。

2--模塊內容是嵌在module 和endmodule兩個語句之間。每個模塊實現特定的功能,模塊可進行層次的嵌套,因此可以將大型的數字電路設計分割成大小不一的小模塊來實現特定的功能,最
後通過由頂層模塊調用子模塊來實現整體功能。

3--模塊包括接口描述部分和邏輯功能描述部分。這可以把模塊與器件相類比。

01 /*=======================================

02 * file neme : mux2.v

03 * author : 小梅哥

04 * Verison : V1.0

05 * date : 20150701

06 * description

07 * sel0時,將輸入端口in_a上的數據通過out端口輸出,

08 * 否則將輸入端口in_b上的數據通過out端口輸出

09 =======================================*/

10

11 module mux2(in_a,in_b,sel,out);

12

13 input [1:0] in_a; //輸入端口in_a

14 input [1:0] in_b; //輸入端口in_b

15

16 input [0:0] sel; //通路選擇線

17

18 output [1:0] out; //輸出端口out

19

20 /*--------------------------------------------

21 sel0時,選擇將in_a端口的數據通過out端口輸出,

22 sel1時,選擇將in_b端口的數據通過out端口輸出.

23 --------------------------------------------*/

24 assign out = (sel == 1‘b0)? in_a : in_b;

25

26 endmodule

(註:最左側一列行號是作者為了講解方便加上的,不屬於代碼內容,請知悉)

第1到9行:

該部分為文件頭,記錄了本設計文件中的一些基本信息如設計者、版本號、修改歷史以及代碼實現的功能描述。在編譯時,該部分屬於註釋內容,將不被綜合成任何內容。

第11行:module mux2(in_a,in_b,sel,out);

該行第一個字符串"module"為Verilog中的一個保留字(關鍵詞),該保留字的出現表明了一個模塊內容的開始。相對應的,第26行的"endmodule"也是一個保留字,該保留字的出現表明了一個模塊內容的結束。在Verilog語法中,module和encmodule總是成對出現,module和encmodule之間的內容則是用戶代碼。

module之後是一個空格(或制表符"tab"),空格或制表符數量不一定限定為1個,也可以是多個,對結果沒有任何影響。緊跟空格之後的mux2則是模塊名稱,該名稱由用戶自己定義,但一般要求與設計內容有一定關系,通過該名稱能夠體現出模塊的功能或作用,例如這裏使用mux2表明這是一個二選一多路器,讓人一目了然。換個例子,如果要做PWM波生成模塊,則可以直接以PWM作為模塊名(module PWM(……);)這樣簡潔直觀,一看就能理解模塊的功能。

mux2之後使用圓括號括起來的部分則是端口列表,該列表中列出了該模塊所有需要外部輸入或者需要輸出到外部的信號,信號間以英文中的逗號","隔開。端口名的命名也盡量能夠代表該端口信號的實際功能或意義,例如"in_a",很清晰的就能告訴讀者這是數據輸入通道的a端口。

第13行到18行

13 input [1:0] in_a; //輸入端口in_a

14 input [1:0] in_b; //輸入端口in_b

15

16 input [0:0] sel; //通路選擇線

17

18 output [1:0] out; //輸出端口out

這裏藍色保留字"input"和"output"是端口類型,input表示該端口是本模塊的輸入型端口,output表示該端口是本模塊的輸出型端口。另外,在實際項目中,還有一種很常見的端口類型是雙向端口,Verilog中用關鍵字"inout"來表示。在本例中,由於沒有使用到雙向端口,因此不做介紹,該部分內容將在後面以一個單獨的章節來進行講解。

第13行緊跟著"input"之後用方括號括起來的部分[1:0]表示端口的寬度,這裏表示輸入端口in_a的位寬為2。需要註意的是,定義位寬時雖然寫成[1:0][0:1]表示的位寬是一致的,但是Verilog中習慣使用[MSB:LSB]的形式,請大家在自己寫代碼時也統一遵照這一要求。當位寬為1時,位寬定義部分可以省略,例如第16行的[0:0]是可以省略的,即寫成"input sel;""input [0:0] sel;"效果是一樣的。

第24行:24 assign out = (sel == 1‘b0)? in_a : in_b;

這一行為賦值語句,這裏是Verilog中最基礎的一種賦值方式——連續賦值語句。這段代碼的意義就是"判斷括號中的條件是否成立,若成立,則將in_a的值賦給out,否則,則將in_b的值賦給out",即通過這種方式實現了根據條件選擇通道的功能。其中,"?"之後":"之前的信號為括號中條件滿足時需要賦給out的的源信號,":"之後的信號則是括號中條件不滿足時需要賦給out的源信號。此種賦值方式還支持多重選擇,例如下面的代碼:

assign out = (sel1 == 1‘b0)? in_a : (sel2 == 1)? in_b : in_c;

這裏有三個數據輸入端口"in_a , in_b , in_c",兩個選擇輸入端口"sel1 , sel2"。該句話的意思就是,當第一個括號中的條件滿足時,則將in_a的數據賦值給out,否則再判斷第二個括號中的條件是否滿足,滿足則將in_b的值賦給out,不滿足則將in_c的值賦給out。括號中的內容可以直接簡寫為(!sel1)或者(!sel2),這一點與C語言一樣。

【內容部分來自https://www.cnblogs.com/xiaomeige/p/4617264.html】

verilog HDL -模塊代碼基本結構