我正在创建verilog模块,用于计算a + b,a-b,a& a中的任何一个。 b或a湾
问题是它确实计算了a + b和a-b。 但它无法计算出一个& 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,a-b,a& b和a | b,并将其计算值分配给z。
它确实成功计算了a + b和a-b并将计算值计算到z。
但是对于a& b和a | b,它并没有为z指定任何内容。
我该如何解决这个问题?
非常感谢你能帮助我。
答案 0 :(得分:0)
我确定它确实为z
分配了一些内容。问题是你试图为z
分配太多。
每个assign
语句代表一些硬件,在这种情况下驱动wire
z
。因此,您从4个独立的硬件块中驱动z
4次并行。如果你愿意,你就会发生短路。 (请记住,Verilog是一种硬件描述语言。您在这里设计硬件,而不是编写软件。如果您从一个以上分配线路你把一些硬件的输出短路在一起。)
我注意到有一个input [2:0] op
。这看起来像是我的家庭作业,我想你被要求设计一个ALU。 ALU是一块硬件(在这种情况下是组合逻辑),可以对其输入(其操作数)执行各种操作,在本例中为a
和{ {1}}。它执行的操作需要通过其他一些控制输入来选择,在这种情况下几乎可以肯定是b
。
因此,您需要使用op
,op
,z
或a+b
来测试a-b
和驱动a&b
的代码。对我来说,这项工作的一个显而易见的结构是a|b
陈述:
case
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
是3位宽。这表明您的ALU有超过4种不同的操作要执行。我还看到有一个op
输出,可能需要做一些事情。
答案 1 :(得分:0)
这里有一些混乱。您原来发布的代码很好; {1}}将根据您的需要进行分配。另一个答案是错误的 - 没有多个驱动程序;他们被评论出来了。延迟建议也是错误的 - 延迟对你的逻辑没有任何影响。