2015-10-01 37 views
0

如果我有這樣定義的模塊:行爲的Verilog:創建多個複用器與1個模塊

module mux_1x2(in, out, select); 

,我需要他們的32,我都知道,使用結構編碼我可以這樣做:

mux_1x2 mux01(in[0], out[0], select); 
mux_1s2 mux02(in[1], out[1], select); 
etc... 

但是,我怎樣才能使用行爲編程在某些循環中創建其中的32個,而無需明確定義每個循環呢?

編輯:只爲背景,我試圖讓一個2級的64位進位選擇加法器

回答

2

您可以使用生成塊:(IEEE1364-2001及以上)

genvar gidx; 
generate 
    for(gidx=0; gidx<32; gidx=gidx+1) begin : loop 
    mux_1x2 mux(in[gidx], out[gidx], select); 
    end 
endgenerate 

或者陣列的實例:(IEEE1364-1995及以上)

mux_1x2 mux[0:31] (.in(in) , .out(out) , .select(select) ); 

或者參數化:

module mux_1x2 #(parameter WIDTH=1) (input [WIDTH-1:0] in, output [WIDTH-1:0] out, input select); 
    // ... 
endmodule 
// ... 
mux_1x2 #(32) mux (.in(in) , .out(out) , .select(select)); 
+0

哦,我忘了我可以只做一些他們。 gidx代表什麼?對於參數化版本,多路複用器模塊中的#(參數WIDTH = 1)必須是我要使用的數量還是應該保持完全一樣? – Austin

+2

@Austin'gidx'只是Greg用於'generate'循環的變量,它只是經過了0到31的數字(它並不重要,你稱之爲格雷格只是明確表示它是一個'g'enerate 'i'n'd'e'x')。 '#(參數WIDTH = 1)'是WIDTH參數的聲明,用於擴展多路複用器輸入和輸出的位數(因此您可以將其視爲1-位2x1多路複用器)。 '= 1'只是給這個參數一個默認值,這樣如果你沒有指定它(就像Greg用'#(32)'實例化的那樣),它將是一個1位寬的多路複用器。 – Unn

+0

噢,好的,謝謝! – Austin