2015-10-01 129 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