You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

仿真波形

仿真波形

错误分析

  1. 最低位初始进位错误:加法模式(en=1)下,最低位的初始进位应为0,但原代码中M0的cin接的是en,导致加法时初始进位为1,直接让结果多了1。减法模式需要初始进位1(因为减法等价于x + ~y + 1),所以初始进位应该是~en。

  2. 全加器(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:35:15