行为verilog:使用1个模块创建多个多路复用器

Posted

技术标签:

【中文标题】行为verilog:使用1个模块创建多个多路复用器【英文标题】:Behavioral verilog: creating multiple muxes with 1 module 【发布时间】:2015-10-01 23:28:33 【问题描述】:

如果我有这样定义的模块:

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 位进位选择加法器

【问题讨论】:

【参考方案1】:

您可以使用生成块:(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) );

【讨论】:

哦,我忘了我可以做一个数组。 gidx 代表什么?同样对于参数化版本,mux 模块中的#(parameter WIDTH=1) 必须是我要使用的数量还是应该保持原样? @Austin gidx 只是用于 generate 循环的变量 Greg,它只是通过数字 0 到 31(你怎么称呼它并不重要,Greg 只是说清楚了这是一个generate index)。 #(parameter WIDTH = 1)WIDTH 参数的声明,用于扩大多路复用器的输入和输出中的位数(因此您可以将其视为 1 位 2x1 多路复用器的数量)。 = 1 只是给参数一个默认值,这样如果你不指定它(就像 Greg 在他的 #(32) 实例化中所做的那样),它将是一个 1 位宽的多路复用器。 感谢您添加评论 @Unn 。你明白了 100%

以上是关于行为verilog:使用1个模块创建多个多路复用器的主要内容,如果未能解决你的问题,请参考以下文章

时钟边沿上的 verilog 多路复用器

Verilog 没有给出预期的结果

Verilog:选择两个实例之一作为输出

为向上/向下计数器、4to1 mux、pulsegen 编写 verilog 模块代码

并发编程之进程,多路复用,multiprocess模块

python-IO多路复用,select模块