如何在verilog中实现4位adder/subtractor
How to implement a 4-bit adder/subtractor in verilog
我正在尝试确定如何使用全加器将此代码转换为 4 位 adder/subtractor。现在它正在做加法,但我不知道如何做减法部分。
module Adder #(parameter N = 4)(
output wire [N-1:0] sum, // sum
output wire co, // carry
input wire [N-1:0] x,
input wire [N-1:0] y,
input wire is_sub;
);
wire [N:0] c;
assign c[0] = 1'b0;
assign co = c[N];
genvar i;
generate
for (i = 0; i < N; i=i+1)
begin : counter_gen_label
FA FAInst (
.s(sum[i]),
.co(c[i+1]),
.a(x[i]),
.b(y[i]),
.cin(c[i]),
.is_sub(is_sub)
);
end
endgenerate
endmodule
module FA(
output reg s,
output reg co,
input wire a,
input wire b,
input wire cin,
input wire is_sub
);
always @(*)
begin
s = a ^ b ^ cin;
co = (a & b) | (a & cin) | (b & cin);
end
endmodule
如何在 FA 模块中进行减法?
谢谢!
FA 不需要使用 is_sub
输入。
将 c[0] = 1'b0;
替换为 c[0] = is_sub;
,并将 .b(y[i])
替换为 .b(y[i] ^ is_sub)
。
这是 x - y = x + y' + 1 的结果,其中 y' 表示反转的 y。
我正在尝试确定如何使用全加器将此代码转换为 4 位 adder/subtractor。现在它正在做加法,但我不知道如何做减法部分。
module Adder #(parameter N = 4)(
output wire [N-1:0] sum, // sum
output wire co, // carry
input wire [N-1:0] x,
input wire [N-1:0] y,
input wire is_sub;
);
wire [N:0] c;
assign c[0] = 1'b0;
assign co = c[N];
genvar i;
generate
for (i = 0; i < N; i=i+1)
begin : counter_gen_label
FA FAInst (
.s(sum[i]),
.co(c[i+1]),
.a(x[i]),
.b(y[i]),
.cin(c[i]),
.is_sub(is_sub)
);
end
endgenerate
endmodule
module FA(
output reg s,
output reg co,
input wire a,
input wire b,
input wire cin,
input wire is_sub
);
always @(*)
begin
s = a ^ b ^ cin;
co = (a & b) | (a & cin) | (b & cin);
end
endmodule
如何在 FA 模块中进行减法? 谢谢!
FA 不需要使用 is_sub
输入。
将 c[0] = 1'b0;
替换为 c[0] = is_sub;
,并将 .b(y[i])
替换为 .b(y[i] ^ is_sub)
。
这是 x - y = x + y' + 1 的结果,其中 y' 表示反转的 y。