HDLBits (6) — 與門
本題鏈接:
https://hdlbits.01xz.net/wiki/Andgate
創(chuàng)建一個(gè)能夠?qū)崿F(xiàn)與門的模塊。
該電路現(xiàn)在有三根線網(wǎng)(a、b 和 out)。 線網(wǎng)?a 和 b 已經(jīng)有了由輸入端口驅(qū)動的值。 但目前線網(wǎng)輸出不受任何驅(qū)動。 編寫一個(gè) assign 語句,用信號 a 和 b 相與來驅(qū)動。
請注意,該電路與非門非常相似,只是多了一個(gè)輸入。 如果聽起來不同,那是因?yàn)槲乙呀?jīng)開始將信號描述為受驅(qū)動(具有由附加到它的某些東西確定的已知值)或不受某些東西驅(qū)動。 輸入線網(wǎng)由模塊外部的內(nèi)容驅(qū)動。 ?assign?語句將驅(qū)動邏輯電平到線路上。 正如您所料,一個(gè)線網(wǎng)不能有多個(gè)驅(qū)動(如果有,它的邏輯電平是什么?),而沒有驅(qū)動的線網(wǎng)將有一個(gè)未定義的值(在綜合硬件時(shí)通常被視為 0)。

預(yù)期的解決方案長度:大約 1 行。
模塊聲明:
module top_module(
? ?input a,
? ?input b,
? ?output out );
提示
Verilog 和 C?語言一樣具有單獨(dú)的按位與 (&) 和邏輯與 (&&) 運(yùn)算符。因?yàn)槲覀冊谶@里我們只用對其中一位進(jìn)行操作,因此選擇哪個(gè)并不重要。

題目
module top_module(
? ?input a,
? ?input b,
? ?output out );
endmodule

答案
module top_module(
? ?input a,
? ?input b,
? ?output out );
assign out = a & b;
endmodule

輸出波形


Verilog 中提供了大約 9 種操作符,分別是算術(shù)、關(guān)系、等價(jià)、邏輯、按位、歸約、移位、拼接、條件操作符。
大部分操作符與 C 語言中類似。同類型操作符之間,除條件操作符從右往左關(guān)聯(lián),其余操作符都是自左向右關(guān)聯(lián)。圓括號內(nèi)表達(dá)式優(yōu)先執(zhí)行。
不同操作符之間,優(yōu)先級是不同的。其中按位?& 優(yōu)先度為第7(倒數(shù)第6),邏輯 && 優(yōu)先度為第10(倒數(shù)第3)。當(dāng)沒有圓括號時(shí),Verilog 會根據(jù)操作符優(yōu)先級對表達(dá)式進(jìn)行計(jì)算。為了避免由操作符優(yōu)先級導(dǎo)致的計(jì)算混亂,在不確定優(yōu)先級時(shí),建議用圓括號將表達(dá)式區(qū)分開來。
在本題中,由于只操作一位數(shù)據(jù),所以使用按位操作符( & )和邏輯操作符( && )在輸出的結(jié)果上是一致的。
按位操作符對 2 個(gè)操作數(shù)的每 1bit 數(shù)據(jù)進(jìn)行按位操作。
如果 2 個(gè)操作數(shù)位寬不相等,則用 0 向左擴(kuò)展補(bǔ)充較短的操作數(shù)。
邏輯操作符、按位操作符和歸約操作符都使用相同的符號表示,因此有時(shí)候容易混淆。區(qū)分這些操作符的關(guān)鍵是分清操作數(shù)的數(shù)目,和計(jì)算結(jié)果的規(guī)則。
邏輯操作符的計(jì)算結(jié)果是一個(gè) 1bit 的值,0 表示假,1 表示真,x 表示不確定。
如果一個(gè)操作數(shù)不為 0,它等價(jià)于邏輯 1;如果一個(gè)操作數(shù)等于 0,它等價(jià)于邏輯 0。如果它任意一位為 x 或 z,它等價(jià)于 x。
如果任意一個(gè)操作數(shù)包含 x,邏輯操作符運(yùn)算結(jié)果不一定為 x。
邏輯操作符的操作數(shù)可以為變量,也可以為表達(dá)式。
參考內(nèi)容:
2.4 Verilog 表達(dá)式?| 菜鳥教程:https://www.runoob.com/w3cnote/verilog-expression.html