2017-05-04 39 views
-2

我無法學習如何在verilog中對n位寬複用器進行建模。2位寬複用器門級模型

我想門級模型一個2位寬的多路,這裏是我當前的代碼:

module _2bit_mux_2_1(m,x,y,s); 

    output m[1:0]; 

    input x[1:0]; 
    input y[1:0]; 

    input s; 

    and (t0,s,y[0]), 
     (t1,sbar,x[0]) 
     (t0,s,y[1]), 
     (t1,sbar,x[1]); 

    not (sbar,s); 

    or (m[1:0],t0,t1); 
endmodule 

我收到以下錯誤消息:

[Synth 8-2715] syntax error near ( 

port m must not be declared to be an array 

part-select of memory m is not allowed 

燦任何人都可以幫助我或指出我在正確的方向,以便輕鬆理解如何實現這一點?

+0

我在'和'門上得到編譯錯誤。你的語法不正確。請參閱免費的IEEE Std 1800-2012,第21.4節和nand,nor,或xor和xnor gates。 – toolic

回答

1

多位巴士聲明如下

output [1:0] m; 

input [1:0] x; 
input [1:0] y; 

,而不是像這樣

output m[1:0]; 

input x[1:0]; 
input y[1:0]; 
+0

感謝Krieger! – Tom

0

除了總線聲明問題由mkrieger1你有你需要等幾個問題說明照顧。

目前,您在t0和t1上有多個驅動程序。從邏輯上看,你希望t0和t1也是2位總線,但是你正在使用這些信號的隱式聲明來創建單個位信號。例如,這意味着這兩種情況下,都駕駛相同的信號:

(t0,s,y[0]) 
    (t0,s,y[1]) 

在這種情況下,你會得到每當這些門在它們的輸出不同的X值。

相反,如果你宣佈這些信號,使他們2位,那麼下面會工作,只要你想:

wire [1:0] t0, t1; 
and (t0[0],s,y[0]), 
    (t1[0],sbar,x[0]), 
    (t0[1],s,y[1]), 
    (t1[1],sbar,x[1]); 

然後,你必須使用門做多比特實現的問題,特別是或門。一個簡單的門只能用於一位輸出,但它們可以在一個數組上工作。這是通過聲明一個實例數組來完成的。您尚未使用實例名稱,但要完成此操作,您需要實例名稱和範圍聲明。以下內容適用於您的或門:

or or0[1:0] (m,t0,t1); 

這將對這3個信號的兩個位執行操作。

總體最緊湊的實施將是這樣的:

wire [1:0] t0,t1; 
and and0[1:0] (t0,s,y), 
    and1[1:0] (t1,sbar,x); 
not (sbar,s); 
or or0[1:0] (m,t0,t1); 

在這種情況下我也用了與門陣列的形式。在這種情況下請注意它們是2位寬,但s和sbar輸入只有一位寬。 Verilog通過使用這些位信號來處理門的所有位。