我无法学习如何在verilog中对n位宽的多路复用器进行建模。
我正在尝试将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 :(得分: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];
答案 1 :(得分: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门。一个简单的门只能用于一位输出,但它们可以在一个阵列上工作。这是通过声明一组实例来完成的。您还没有使用实例名称,但要完成此操作,您将需要实例名称和范围声明。以下内容适用于您的OR门:
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);
在这种情况下,我还使用了AND门的数组形式。在这种情况下,请注意它们是2位宽,但s和sbar输入只有一位宽。 Verilog通过对门的所有位使用这一位信号来处理它。