Verilog 4位全加减法器加法结果多1问题求助
4位全加减法器加法结果多1的问题排查与修复
问题现象
实现的4位全加减法器减法功能正常,但加法运算结果总是比正确值多1。例如0101 + 0101得到1011(正确结果应为1010)。
原代码
加减法器代码
module Add_sub(x,y,co,u,en); input [3:0] x, y; input en; // en=1: add; en=0:sub output [3:0] u; output co; wire [3:1]carry; FA M0(x[0], y[0], en, en, u[0], carry[1]); FA M1(x[1], y[1], carry[1], en, u[1], carry[2]); FA M2(x[2], y[2], carry[2], en, u[2], carry[3]); FA M3(x[3], y[3], carry[3], en, u[3], co); endmodule module FA(x,y,cin,en,u,co); input x, y, cin, en; output u, co; wire b = !x^en; assign u = x^y^cin; assign co = (b&y)|(b&cin)|(y&cin); endmodule
测试平台代码
`timescale 1ns/1ns module testbench(); reg [3:0]x, y; reg en; wire[3:0]u; wire co; Add_sub tb(.x(x), .y(y), .co(co), .u(u), .en (en)); initial begin $monitor ($time, "x=%b, y=%b, co=%b, u=%b, en=%b",x,y,co,u,en); end initial begin #0 x=5; y=5; en=1; // 加法操作 #20 x=5; y=5; en=0; // 减法操作 #20 x=8; y=1; en=1; // 加法操作 #20 x=8; y=1; en=0; // 减法操作 #20 $stop; end endmodule
仿真波形

错误分析
最低位初始进位错误:加法模式(
en=1)下,最低位的初始进位应为0,但原代码中M0的cin接的是en,导致加法时初始进位为1,直接让结果多了1。减法模式需要初始进位1(因为减法等价于x + ~y + 1),所以初始进位应该是~en。全加器(FA)内部逻辑错误:
- 取反信号
b的逻辑完全错误,原代码b = !x^en与加减控制无关,正确逻辑应为:加法时b=y,减法时b=~y,即b = en ? y : ~y。 - 和
u的计算应使用取反后的b而非原始y,原代码u = x^y^cin未考虑减法时y的取反,导致逻辑错误。 - 进位
co的计算错误,应基于x、b、cin计算,而非b、y、cin,正确的进位逻辑是(x&b) | (x&cin) | (b&cin)。
- 取反信号
修复后的代码
修正后的加减法器代码
module Add_sub(x,y,co,u,en); input [3:0] x, y; input en; // en=1: add; en=0:sub output [3:0] u; output co; wire [3:1]carry; // 修正最低位初始进位:加法cin=0,减法cin=1 FA M0(x[0], y[0], ~en, en, u[0], carry[1]); FA M1(x[1], y[1], carry[1], en, u[1], carry[2]); FA M2(x[2], y[2], carry[2], en, u[2], carry[3]); FA M3(x[3], y[3], carry[3], en, u[3], co); endmodule module FA(x,y,cin,en,u,co); input x, y, cin, en; output u, co; // 修正取反逻辑:加法用y,减法用~y wire b = en ? y : ~y; // 和计算使用取反后的b assign u = x ^ b ^ cin; // 修正进位计算逻辑 assign co = (x & b) | (x & cin) | (b & cin); endmodule
验证说明
修复后重新运行测试平台:
- 加法
5+5会得到正确结果1010,进位1; - 减法
5-5结果为0000,进位0(无借位); - 加法
8+1结果为1001,符合预期。
内容的提问来源于stack exchange,提问作者JarvisLYu1
相关产品推荐
相关产品推荐

