module fa(a,b,cin,cout,sum);
input a;
input b;
wire bxor;
input cin;
output cout;
output sum;
assign bxor = b ^ cin;
assign sum = ((a^bxor)^(cin));
assign cout = ((a&bxor)|((a^bxor)&cin));
endmodule
module rca(a,b,cin,cout,sum);
input cin;
output cout;
output [7:0] sum;
input [7:0] a, b;
wire c[6:0];
fa first(a[0],b[0],cin,c[0],sum[0]);
fa second(a[1],b[1],c[0],c[1],sum[1]);
fa third(a[2],b[2],c[1],c[2],sum[2]);
fa fourth(a[3],b[3],c[2],c[3],sum[3]);
fa fifth(a[4],b[4],c[3],c[4],sum[4]);
fa sixth(a[5],b[5],c[4],c[5],sum[5]);
fa seventh(a[6],b[6],c[5],c[6],sum[6]);
fa eighth(a[7],b[7],c[6],cout,sum[7]);
endmodule
module alu_op(a,b,op,out);
input [7:0] a, b;
input [2:0] op;
output [7:0] out;
output reg out1;
always @ (op or a or b)
case (op)
3'b000 : out1 = fa(a, b, op[0], op[0], out);
3'b001 : out1 = fa(a,b,op[0], op[0], out);
//3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]);
3'b011 : out1 = a ^ b;
3'b100 : out1 = a | b;
3'b101 : out1 = a & b;
endcase
endmodule
我在想它是因为你无法在case语句中调用函数。我对此完全陌生,不知道该怎么做。我基本上是在做一个alu,前两个案例应该做add和sub。
当我编译时,我得到:
alutester.vl:66: error: No function fa in this context (alu.utt).
alutester.vl:67: error: No function rca in this context (alu.utt).
我不明白为什么。有人可以帮帮我吗?
答案 0 :(得分:2)
您没有名为fa
的功能,您创建了一个名为fa
的模块(它们不是一回事)。而且你不能在程序块中实例化模块。
目前还不清楚你要对这些模块做些什么。我不确定这意味着什么
out1 = fa(a, b, op[0], op[0], out);
首先,你将op [0]与cin和cout联系起来,这似乎是错误的,并且不清楚out1
应该采用什么值。它应该得到加法器的和输出吗?如果你想从fa的某个输出取出1,那么在always块之外实例化它,并设置out1等于你想要的情况下来自模块的线。
答案 1 :(得分:1)
让我们看看......你已经构建了一个8位加法器,即rca
模块。
稍后,你有一个似乎是一个ALU,它将a
和b
作为输入操作数,并根据愿意执行的操作分配out1
。 / p>
您可以在rca
模块中实例化alu_op
模块,以便获得a
加上b
的总和,...
module alu_op(a,b,op,out);
input [7:0] a, b;
input [2:0] op;
output [7:0] out;
output reg out1;
wire [7:0] sum;
rca my_adder(.a(a),.b(b),.cin(1'b0),.sum(sum))
always @ (op or a or b)
case (op)
3'b000 : out1 = sum;
//3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]);
3'b011 : out1 = a ^ b;
3'b100 : out1 = a | b;
3'b101 : out1 = a & b;
endcase
endmodule
或者(当然更好),让编译器通过使用+
运算符来弄清楚如何构建加法器。
module alu_op(a,b,op,out);
input [7:0] a, b;
input [2:0] op;
output [7:0] out;
output reg out1;
always @ (op or a or b)
case (op)
3'b000 : out1 = a + b;
//3'b010 : out = shift shifter (a[7:0],b[7:0],out[7:0]);
3'b011 : out1 = a ^ b;
3'b100 : out1 = a | b;
3'b101 : out1 = a & b;
endcase
endmodule
BTW:位移也是一个有效的Verilog操作数,而且,由于我很确定你想要减法(对于操作001),减号-
运算符也是可用的。加法,比特随附和减法也是可合成的。