模塊結(jié)構(gòu)
本節(jié)的文檔編號(hào):001100000036
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):?001100000051
1、本節(jié)主要介紹模塊結(jié)構(gòu),模塊(module)是verilog的基本描述單位,是用于描述某個(gè)設(shè)計(jì)功能或結(jié)構(gòu)及與其他模塊通信的外部端口,有5個(gè)主要部分:端口定義、參數(shù)定義(可選)、I/O說(shuō)明、內(nèi)部信號(hào)聲明、功能定義。? ? ?
2、這是ALTERA和VIVADO文檔
第3節(jié)?模塊結(jié)構(gòu)
3.1?模塊介紹
模塊(module)是Verilog?的基本描述單位,是用于描述某個(gè)設(shè)計(jì)的功能或結(jié)構(gòu)及與其他模塊通信的外部端口。
?模塊在概念上可等同一個(gè)器件,就如調(diào)用通用器件(與門(mén)、三態(tài)門(mén)等)或通用宏單元(計(jì)數(shù)器、ALU、CPU)等。
因此,一個(gè)模塊可在另一個(gè)模塊中調(diào)用,一個(gè)電路設(shè)計(jì)可由多個(gè)模塊組合而成。
一個(gè)模塊的設(shè)計(jì)只是一個(gè)系統(tǒng)設(shè)計(jì)中的某個(gè)層次設(shè)計(jì),模塊設(shè)計(jì)可采用多種建模方式。
?Verilog?的基本設(shè)計(jì)單元是“模塊”。采用模塊化的設(shè)計(jì)使系統(tǒng)看起來(lái)更有條理也便于仿真和測(cè)試,
因此整個(gè)項(xiàng)目的設(shè)計(jì)思想就是模塊套模塊,自頂向下依次展開(kāi)。在一個(gè)工程的設(shè)計(jì)里,每個(gè)模塊實(shí)現(xiàn)特定的功能,
模塊間可進(jìn)行層次的嵌套。對(duì)大型的數(shù)字電路進(jìn)行設(shè)計(jì)時(shí),可以將其分割成大小不一的小模塊,
每個(gè)小模塊實(shí)現(xiàn)特定的功能,最后通過(guò)由頂層模塊調(diào)用子模塊的方式來(lái)實(shí)現(xiàn)整體功能,這就是Top-Down的設(shè)計(jì)思想。
本書(shū)主要以Verilog硬件描述語(yǔ)言為主,模塊是Verilog的基本描述單位,用于描述每個(gè)設(shè)計(jì)的功能和結(jié)構(gòu),
以及其他模塊通信的外部接口。
? ?模塊有五個(gè)主要部分:端口定義、參數(shù)定義(可選)、?I/O說(shuō)明、內(nèi)部信號(hào)聲明、功能定義。
模塊總是以關(guān)鍵詞module開(kāi)始,以關(guān)鍵詞endmodule結(jié)尾。它的一般語(yǔ)法結(jié)構(gòu)如下所示:

下面筆者詳細(xì)分析一下這段代碼:
3.2?模塊名和端口定義
第1至5行聲明了模塊的名字和輸入輸出口。其格式如下:
module 模塊名(端口 1,端口 2,端口 3,……);
其中模塊是以module開(kāi)始,以endmodule結(jié)束。模塊名是模塊唯一的標(biāo)識(shí)符,
一般建議模塊名盡量用能夠描述其功能的名字來(lái)命名,并且模塊名和文件名相同。
模塊的端口表示的是模塊的輸入和輸出口名,也是其與其他模塊聯(lián)系端口的標(biāo)識(shí)。
3.3?參數(shù)定義
第8行參數(shù)定義是將常量用符號(hào)代替以增加代碼可讀性和可修改性。這是一個(gè)可選擇的語(yǔ)句,
用不到的情況下可以省略,參數(shù)定義一般格式如下:
parameter DATA_W = x;
3.4?接口定義
第9至12行是I/O(輸入/輸出)說(shuō)明,模塊的端口可以是輸入端口、輸出端口或雙向端口。
其說(shuō)明格式如下。
輸入端口:? ???input [信號(hào)位寬-1?:?0]?端口名?1;
? ?? ?? ?? ?? ???input [信號(hào)位寬-1?:?0]?端口名?2;
? ?? ?? ?? ?? ???……;
輸出端口:? ???output [信號(hào)位寬-1?:?0]?端口名?1;
? ?? ?? ?? ?? ???output [信號(hào)位寬-1?:?0]?端口名?2;
? ?? ?? ?? ?? ???……;
雙向端口:inout [信號(hào)位寬-1?:?0]?端口名?1;
inout [信號(hào)位寬-1 : 0] 端口名 2;
? ?? ?? ?? ?? ???……;
3.5?信號(hào)類(lèi)型
第14至17行定義了信號(hào)的類(lèi)型。這些信號(hào)是在模塊內(nèi)使用到的信號(hào),
并且與端口有關(guān)的 wire 和 reg 類(lèi)型變量。其聲明方式如下:
?reg [width-1 : 0] R 變量 1, R 變量 2 ……;
wire [width-1 : 0] W?變量?1,W?變量?2……;
如果沒(méi)有定義信號(hào)類(lèi)型,默認(rèn)是wire型,并且信號(hào)位寬為1。
3.6?功能描述
?第21至31行是功能描述部分。模塊中最重要的部分是邏輯功能定義部分,有三種方法可在模塊中產(chǎn)生邏輯。
1.?用“assign”聲明語(yǔ)句,如描述一個(gè)兩輸入與門(mén):assign??a = b & c。詳細(xì)功能見(jiàn)“功能描述-組合邏輯”一節(jié)。
2.? 用“always”塊。即前面介紹的時(shí)序邏輯和組合邏輯。
3.? 模塊例化。詳細(xì)功能見(jiàn)“模塊例化”一節(jié)。
3.7?模塊例化
對(duì)數(shù)字系統(tǒng)的設(shè)計(jì)一般采用的是自頂向下的設(shè)計(jì)方式,可將系統(tǒng)劃分成幾個(gè)功能模塊,
每個(gè)功能模塊再劃分成下一層的子模塊。每個(gè)模塊的設(shè)計(jì)對(duì)應(yīng)一個(gè)module?,每個(gè)module?設(shè)計(jì)成一個(gè)Verilog HDL?程序文件。
因此,對(duì)一個(gè)系統(tǒng)的頂層模塊采用結(jié)構(gòu)化設(shè)計(jì),即頂層模塊分別調(diào)用了各個(gè)功能模塊。
?一個(gè)模塊能夠在另外一個(gè)模塊中被引用,這樣就建立了描述的層次。
模塊實(shí)例化語(yǔ)句形式如下:
module_name instance_name(port_associations) ;
信號(hào)端口可以通過(guò)位置或名稱(chēng)關(guān)聯(lián),但是關(guān)聯(lián)方式不能夠混合使用。
端口關(guān)聯(lián)形式如下:port_expr / /通過(guò)位置。
.PortName (port_expr) / /通過(guò)名稱(chēng)。

建議:在例化的端口映射中請(qǐng)采用名字關(guān)聯(lián),這樣,當(dāng)被調(diào)用的模塊管腳改變時(shí)不易出錯(cuò)。
在實(shí)例化中,可能有些管腳沒(méi)用到,可在映射中采用空白處理,如:

輸入管腳懸空端口的輸入為高阻?Z,由于輸出管腳是被懸空的,該輸出管腳廢棄不用。
相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=5