我试图将我编写的两个模块组合起来创建一个加法器/减法器模块,但我遇到了将它拼凑在一起的问题。以下是我到目前为止:
`include "invert.v" //since I'll be using 2s complement for subtraction
`include "add.v" //basic add which also produces an overflow bit
module addsub(A,B,O,overflow);
input [7:0] A,B;
output [7:0] O;
output overflow;
wire [7:0] notB;
//active high
generate
if(B[7] == 1)
invert iv1(B,notB);
add ad1(A,notB,O,overflow);
else(B[7] == 0)
add ad2(A,B,O,overflow);
endgenerate
endmodule
这些是我收到的错误:
错误 - 先前声明的[MPD]模块 该模块先前已声明: " invert.v",3 稍后将重新宣布: " invert.v",3:令牌是'反转' 模块反转(in,out); ^ 请删除其中一个声明并重新编译。
返回文件' add.v'。 返回文件' addsub.v'。
错误 - [SE]语法错误 以下verilog源有语法错误: " addsub.v",17:令牌是'否则' 别的(B [7] == 0) ^ 2个错误
我是verilog的新手,所以非常感谢任何帮助!
下面列出了-edit-adder和invert:
//adder
module add(A,B,O,co);
input [7:0] A,B;
output [7:0] O;
output reg co;
wire [8:0] tmp;
assign tmp = A+B;
assign O = tmp[7:0];
always@*
begin
if(tmp[8] == 1)
assign co = 1;
else if(tmp[8] == 0)
assign co = 0;
end
endmodule
//inverter
module invert(in,out);
input [7:0] in;
output [7:0] out;
assign out[0] = ~in[0];
assign out[1] = ~in[1];
assign out[2] = ~in[2];
assign out[3] = ~in[3];
assign out[4] = ~in[4];
assign out[5] = ~in[5];
assign out[6] = ~in[6];
assign out[7] = ~in[7];
endmodule
答案 0 :(得分:1)
在合成时评估生成语句。这意味着if语句中的if语句必须是常量。它们可以由模块PARAMETERS更改,但不能由INPUTS更改,因为参数是常量但输入是可变的。
您需要的不是生成语句,而是一些多路复用器。您可以实例化两个加法器并根据B [7]切换O和溢出,或者您可以实例化一个加法器并根据B [7]切换B输入。
所以要么
`include "invert.v" //since I'll be using 2s complement for subtraction
`include "add.v" //basic add which also produces an overflow bit
module addsub(A,B,O,overflow);
input [7:0] A,B;
output [7:0] O;
output overflow;
wire [7:0] notB;
wire [7:0] O1, O2;
wire ovf1, ovf2;
invert iv1(B,notB);
add ad1(A,notB,O1,ovf1);
add ad2(A,B,O2,ovf2);
assign O = B[7] ? O1 : O2;
assign overflow = B[7] ? ovf1 : ovf2;
endmodule
或
`include "invert.v" //since I'll be using 2s complement for subtraction
`include "add.v" //basic add which also produces an overflow bit
module addsub(A,B,O,overflow);
input [7:0] A,B;
output [7:0] O;
output overflow;
wire [7:0] notB;
wire [7:0] B2;
invert iv1(B,notB);
assign B2 = B[7] ? notB : B;
add ad1(A,B2,O,overflow);
endmodule
如果您愿意,也可以将多路复用器[s]移动到单独的模块中。