2位宽多路复用门级模型

时间:2017-05-04 16:48:25

标签: verilog

我无法学习如何在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

任何人都可以帮助我或指出我正确的方向,以便轻松了解如何实现这一目标吗?

2 个答案:

答案 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通过对门的所有位使用这一位信号来处理它。