2011-02-25 107 views
2

來自C++背景我開始學習Verilog。該代碼描述了進入兩個AND門的四個輸入。這兩個與門的輸出進入一個或門。或門的輸出是最終的輸出。爲什麼在這個Verilog函數中沒有賦值語句?

// a user-defined AND gate 
module my_and2 (in, out); 
input [1:0] in; 
output out; 
assign out = in[1]&in[0]; 
endmodule 

// a user-defined OR gate 
module my_or2 (in, out); 
input [1:0] in; 
output out; 
assign out = in[1]|in[0]; 
endmodule 

// the AND-OR logic built on top of the user-defined AND and OR gates 
module and_or (in_top, out_top); 
input [3:0] in_top; 
output out_top; 
wire [1:0] sig; 
// instantiate the gate-level modules 
my_and2 U1 (.in(in_top[3:2]),.out(sig[1])); 
my_and2 U2 (.in(in_top[1:0]),.out(sig[0])); 
my_or2 U3 (.in(sig),.out(out_top)); 
endmodule 

前兩個模塊對我有意義。但是,最後一個沒有。前兩個模塊最後有一個分配語句來設置輸出變量的值。但是,最後一個沒有。這是爲什麼?

回答

3

Verilog是「事件驅動」。在編寫verilog時,請考慮靈敏度列表。

在你的AND門的例子中,你的表達式爲assign out = in[1]&in[0];。據說您的表情對in[0]in[1]敏感。這意味着任何時候in[0]in[1]都會更改,表達式將被重新計算,並且out的值將被更新。

因此,在您的頂層模塊and_or中,您基本上構建了一個對前面表達式的輸出敏感的大型表達式樹。這棵樹當然是使用模塊連接構建的。因此,這個頂層模塊的其中一個輸入的值的變化將波及其「邏輯錐」中的所有表達式。

要驅動輸入,您需要更高級別的測試臺模塊驅動信號到您的and_or模塊。這將提供時間間隔輸入,這將觸發and_or中和以下的表達式。如果沒有,你的模擬將沒有事件,所以沒有表達式會觸發,模擬將在0ps超時,因爲它是'事件餓死'。

PS:爲了您和門的表情,assign out = ∈將工作太...(減少和運營商)

2

out_top由U3實例輸出驅動。

+0

那麼實例化一個模塊會自動運行它嗎? – 2011-02-25 21:57:03

+0

實際上,該代碼中沒有任何「運行」,因爲它不包含任何過程語句。這是一個顯示連接性的結構描述。當然,仿真器將執行代碼來實現信號變化,但這些細節與建模該電路並不相關。 – 2011-02-26 00:40:36

0

爲了把事情簡單地說,我喜歡把實例作爲剛剛連接線。

模塊是數字電路塊。你和門模塊是魔術發生的地方。你已經明白那一部分。通過實例化這些模塊,就好像您將頂層模塊的輸入線連接到兩個塊AND模塊的輸入。然後取出它們的輸出並將它們粘貼到伸出OR塊的輸入線上。最後,您將OR塊的輸出連接到頂層的輸出信號線。

相關問題