-2

我正在创建计算 a+b、ab、a & b 或 a | 之一的 verilog 模块。湾。

问题是它确实计算了 a+b 和 ab。但它不能计算 a & b 和 a | b 并且什么也不返回。

input [31:0] a, b;
input [2:0] op;
output [31:0] z;
output ex; 
wire[31:0]a0,a1,a2,a3;

assign a0 = a & b;
assign a1 = a | b;
assign a2 = a + b;
assign a3 = a - b;

assign z=a0;
//assign z=a1;
//assign z=a2;
//assign z=a3;

endmodule

该模块基本上计算 a+b、ab、a&b 和 a|b 并将其计算值分配给 z。

它确实成功地计算了 a+b 和 ab 并将计算值放入 z。

但是对于 a&b 和 a|b,它不会为 z 分配任何东西。

我该如何解决这个问题?

如果你能帮助我,非常感谢。

4

2 回答 2

0

我确定它确实为z. 问题是您试图分配太多给z.

每个assign语句代表一些硬件,在这种情况下驱动wire z. 因此,您从 4 个独立的硬件块并行z驱动4 次。如果你愿意,你有一个短路。(记住 Verilog 是一种硬件描述语言。你在这里设计硬件,而不是编写软件。如果你从多个地方分配到一条线,你就会把一些硬件块的输出短路在一起。)

我注意到有一个input [2:0] op. 这对我来说看起来像是家庭作业,我猜你被要求设计一个 ALU。ALU 是一个硬件块(在这种情况下是组合逻辑),可以对其输入(它的操作数)执行各种操作,在这种情况下是ab。它执行的操作需要通过其他一些控制输入来选择,在这种情况下几乎可以肯定应该是op

因此,您需要一些使用、或来测试op和驱动的代码。对我来说,这份工作的明显结构是一个声明:za+ba-ba&ba|bcase

case (op)
  3'b000:
    z =     // some expression, eg a + b, it depends on what op code 000 is supposed to mean
  3'b001:
    z =     // some other expression here

            // etc etc

  default:  // perhaps...
    z =     // ...something to drive z if none of the other branches are used
endcase

一个case语句应该放在一个always块内。因为我怀疑这是家庭作业,所以我不会给你答案,我会让你弄清楚如何去做。

最后,我看到它op是 3 位宽。这表明您的 ALU 有超过 4 种不同的操作要执行。我还看到有一个ex输出,大概需要做一些事情。

于 2016-03-20T09:16:30.053 回答
0

这里有些混乱。您最初发布的代码很好;z将根据需要分配。另一个答案是不正确的——没有多个驱动程序;他们被注释掉了。延迟建议也是不正确的——延迟对您的逻辑没有任何影响。

于 2016-03-21T18:35:48.667 回答