模塊的概念編程
模塊(module)是verilog最基本的概念,是v設計中的基本單元,每一個v設計的系統中都由若干module組成。ide
一、模塊在語言形式上是以關鍵詞module開始,以關鍵詞endmodule結束的一段程序。函數
二、模塊的實際意義是表明硬件電路上的邏輯實體。post
三、每一個模塊都實現特定的功能。設計
四、模塊的描述方式有行爲建模和結構建模之分。code
五、模塊之間是並行運行的。對象
六、模塊是分層的,高層模塊經過調用、鏈接低層模塊的實例來實現複雜的功能。接口
七、各模塊鏈接完成整個系統須要一個頂層模塊(top-module)。ci
不管多麼複雜的系統,總能劃分紅多個小的功能模塊。系統的設計能夠按照下面三個步驟進行:get
(1)把系統劃分紅模塊;
(2)規劃各模塊的接口;
(3)對模塊編程並鏈接各模塊完成系統設計。
模塊的結構
module <模塊名>(<端口列表>);
<定義>
<模塊條目>
endmodule
其中:
<模塊名>是模塊惟一的標識符;
<端口列表>是輸入、輸出和雙向端口的列表,這些端口用來與其餘模塊進行鏈接。
<定義>是一段程序,用來指定數據對象爲寄存器型、存儲器型、線型以及過程塊,諸如函數塊和任務塊;
<模塊條目>也是一段程序,將上面<定義>和<端口>組合起來,是說明這個模塊要作什麼的語句;
endmodule以後沒有分號。
模塊的調用
在作模塊劃分時,一般會出現這種情形:某個大的模塊中包含了一個或多個功能子模塊。verilog是經過模塊調用或稱爲模塊實例化的方式來實現這些子模塊與高層模塊的鏈接的。
調用模塊實例的通常形式爲:
<模塊名><參數列表><實例名>(<端口列表>);
module_nameinstance_name(port_associations) ;
其中參數列表是傳遞到子模塊的參數值,參數傳遞的典型應用是定義門級時延。
信號端口能夠經過位置或名稱關聯;可是關聯方式不可以混合使用。
port_expr //位置關聯
.PortName (port_expr) //名稱關聯
定義模塊:module Design(端口1,端口2,端口3……);
1)引用時,嚴格按照模塊定義的端口順序來鏈接,不用標明原模塊定義時規定的端口名。
Design u_1(u_1的端口1,u_1的端口2,u_1的端口3,u_1的端口……);//和Design對應
2)引用時用」.」符號,標明原模塊定義時規定的端口名:
Design u_2( .(端口1(u_1的端口1),
.(端口2(u_1的端口2),
.(端口3(u_1的端口3),
…… ); //建議:在例化的端口映射中採用名字關聯,這樣,當被調用的模塊管腳改變時不易出錯。
eg.
module and (C,A,B);
input A,B;
output C;
...
and A1 (T3,A,B); //實例化時採用位置關聯,T3對應輸出端口C,A對應A,B對應B。
and A2 ( .C(T3),
.A(A),
.B(B) );//實例化時採用名字關聯,.C是and器件的端口,其與信號T3相連
port_expr 能夠是如下的任何類型:
1) 標識符(reg 或net )如 .C(T3),T3 爲wire 型標識符。
2) 位選擇,如 .C(D[0]),C 端口接到D 信號的第0bit 位。
3) 部分選擇,如 .Bus (Din[5:4])。
4) 上述類型的合併,如 .Addr({ A1,A2[1:0]}。
5) 表達式(只適用於輸入端口),如 .A (wire Zire = 0 )。
參數傳遞:引用模塊時,注意對運用參數編寫的模塊的靈活引用。
eg.
module Decoder(A,F);
parameterWidth=1,Polarity=1;
…….
endmodule
引用時:
module Top;
wire[3:0] A4;
wire[4:0] A5;
wire[15:0] F16;
wire[31:0] F32;
Decoderu_D1(A4,F16); //u_D1使用默認參數,Width爲1,Polarity爲1
Decode #(4,0) u_D2(A4,F16); //u_D2的Width爲4,Polarity爲0
#(4,0)這個參數改變方法是內容對應於被引用的module的,參數的改變還能夠像module的引用同樣使用」.」:
module_name #( .parameter_name(para_value),.parameter_name(para_value)) inst_name (port map);
懸空端口的處理
在實例化中,可能有些管腳沒用到,可在映射中採用空白處理。
eg.
DFF d1 ( .Q(QS),
.Qbar ( ),
.Data (D ) ,
.Preset ( ), // 該管腳懸空
.Clock (CK) ); //名稱對應方式。
輸入管腳懸空,該管腳輸入爲高阻 Z,
輸出管腳懸空,該管腳廢棄不用。