HDLBits (9) — 線網(wǎng)聲明
本題鏈接:
https://hdlbits.01xz.net/wiki/Wire_decl
到目前為止的電路都是輸出是輸入的簡單函數(shù)。隨著電路變得越來越復(fù)雜,您將需要線網(wǎng)將內(nèi)部組件連接在一起。 當(dāng)您需要使用線網(wǎng)( wire )時(shí),您應(yīng)該在模塊的主體中,在首次使用之前的某處聲明它。(將來,您會遇到更多類型的信號和變量,它們也以相同的方式聲明,但現(xiàn)在,我們將從類型為 wire 的信號開始)。
例子

module top_module (
? ?input in, ? ? ? ? ? ? ?// Declare an input wire named "in"
? ?output out ? ? ? ? ? ? // Declare an output wire named "out"
);
? ?wire not_in; ? ? ? ? ? // Declare a wire named "not_in"
? ?assign out = ~not_in; ?// Assign a value to out (create a NOT gate).
? ?assign not_in = ~in; ? // Assign a value to not_in (create another NOT gate).
endmodule ? // End of module "top_module"
在上面的模塊中,有三條線網(wǎng)( in、out 和 not_in ),其中兩條已經(jīng)聲明為模塊的輸入和輸出端口的一部分(這就是為什么您不需要在前面的練習(xí)中聲明任何線網(wǎng)的原因)。線網(wǎng)?not_in 需要在模塊內(nèi)聲明,所以從模塊外部看不到線網(wǎng)?not_in。 然后,使用兩個(gè)賦值( assign )語句創(chuàng)建兩個(gè)非門。 請注意,首先創(chuàng)建哪個(gè)非門并不重要:最終綜合后的電路依舊相同。
練習(xí)
實(shí)現(xiàn)以下電路。 創(chuàng)建兩條中間線網(wǎng)(命名隨意)將與門和或門連接在一起。 注意輸出線網(wǎng)也就是反饋到非門的線網(wǎng),因此不一定需要在此處聲明第三條線網(wǎng)。 注意線網(wǎng)是如何由一個(gè)源(門的輸出)驅(qū)動的,但可以反饋為多個(gè)輸入。
如果您遵循圖中的電路結(jié)構(gòu),您應(yīng)該得到四個(gè)賦值語句,因?yàn)橛兴膫€(gè)信號需要賦值。
(當(dāng)然,可以在沒有中間線網(wǎng)的情況下創(chuàng)建具有相同功能的電路。)

預(yù)期的解決方案長度:大約 5 行。
模塊聲明:
`default_nettype none
module top_module(
? ?input a,
? ?input b,
? ?input c,
? ?input d,
? ?output out,
? ?output out_n ? );

題目
`default_nettype none
module top_module(
? ?input a,
? ?input b,
? ?input c,
? ?input d,
? ?output out,
? ?output out_n ? );
endmodule

答案
`default_nettype none
module top_module(
? ?input a,
? ?input b,
? ?input c,
? ?input d,
? ?output out,
? ?output out_n ? );
? ?wire g1,g2,g3;
? ?assign g1 = a & b;
? ?assign g2 = c & d;
? ?assign g3 = g1 | g2;
? ?assign out = g3;
? ?assign out_n = ~g3;
endmodule

輸出波形


以反引號?`?開始的某些標(biāo)識符是 Verilog 系統(tǒng)編譯指令。
編譯指令為 Verilog 代碼的撰寫、編譯、調(diào)試等提供了極大的便利。
在編譯階段,`define?用于文本替換,類似于 C 語言中的?#define。
一旦?`define?指令被編譯,其在整個(gè)編譯過程中都會有效。
`undef?用來取消之前的宏定義。
連續(xù)賦值語句是 Verilog 數(shù)據(jù)流建模的基本語句,用于對 wire 型變量進(jìn)行賦值。
LHS(left hand side) 指賦值操作的左側(cè),RHS(right hand side)指賦值操作的右側(cè)。
assign 為關(guān)鍵詞,任何已經(jīng)聲明 wire 變量的連續(xù)賦值語句都是以 assign 開頭。
需要說明的是:
LHS_target 必須是一個(gè)標(biāo)量或者線型向量,而不能是寄存器類型。
RHS_expression 的類型沒有要求,可以是標(biāo)量或線型或存器向量,也可以是函數(shù)調(diào)用。
只要 RHS_expression 表達(dá)式的操作數(shù)有事件發(fā)生(值的變化)時(shí),RHS_expression 就會立刻重新計(jì)算,同時(shí)賦值給 LHS_target。
Verilog 還提供了另一種對 wire 型賦值的簡單方法,即在 wire 型變量聲明的時(shí)候同時(shí)對其賦值。wire 型變量只能被賦值一次,因此該種連續(xù)賦值方式也只能有一次。
參考內(nèi)容:
2.5 Verilog 編譯指令?| 菜鳥教程:https://www.runoob.com/w3cnote/verilog-compile-instruction.html
3.1 Verilog 連續(xù)賦值?| 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-assign.html