【问题标题】:N-bits adder/subtractor using ripple of full adders- problem with carryout使用全加器纹波的 N 位加法器/减法器 - 进位问题
【发布时间】:2019-03-29 16:33:24
【问题描述】:

我正在尝试使用全加器的波纹创建 N 位加法器/减法器。 输入是 N 位 A,N 位 B,结果应该是 2N 的长度(它输出具有 2 个总线高和低的 N 位的 ALU,所以我试图扩展有符号位)。

问题出现在减法中的进位。例如,当做 3-2 时(假设 N=3,所以它是 011-010 并且有两个的恭维它是 011+110)我得到 001 进位 1。问题是这个进位是垃圾,不能扩展,但在其他情况下,这是必要的。例如,当尝试做(-3)+(-3)(101+101,再次N=3)时,我得到010,进位为1。这次进位真的表示符号,所以我想扩展它。

这是我的代码:

entity FullAdder is
      Port (
          A : in std_logic;
          B : in std_logic;
          Cin : in std_logic;
          sum : out std_logic;
          Cout : out std_logic
          );
end FullAdder;


architecture gate of FullAdder is
begin
     sum <= A xor B xor Cin ;
     Cout <= (A and B) OR (Cin and A) OR (Cin and B) ;
end gate;

这里是 N 位加法器

entity NbitsAdder is
    generic(N: integer := 8); 
    Port(
       A :     in std_logic_vector((N-1) downto 0);
       B :     in std_logic_vector((N-1) downto 0);
       Cin:    in std_logic;
       SUM :   out std_logic_vector((N-1) downto 0);
       Cout : out std_logic
    );
end NbitsAdder;


architecture  NbitsAdderGate of NbitsAdder is
...

    signal temp : std_logic_vector (N downto 0);
    begin
        temp (0) <= Cin; 
        arrrayOfFullAdders : for i in 0 to N-1 generate
            adder_i: FullAdder port map  ( A(i), B(i), temp(i), SUM(i), temp (i+1) );
        end generate;
        Cout <= temp(N); --which will be extend         
end NbitsAdderGate;

这是加法器或减法器

entity NbitsAddOrSub is 
    generic(N: integer := 8);
        port(
            A :     in std_logic_vector ((N-1) downto 0);
            B :     in std_logic_vector ((N-1) downto 0);
            addOrSub :   in std_logic;
            sumLo :   out std_logic_vector ((N-1) downto 0);
            sumHi :   out std_logic_vector ((N-1) downto 0)
                    );              
end NbitsAddOrSub;

architecture NbitsAddOrSubGate of NbitsAddOrSub is 

    signal tempB: std_logic_vector ( (N-1) downto 0);
    signal CoutTemp:  std_logic;
    begin
    loop1 : for i in 0 to N-1 generate
        xor_i: xorGate port map ( B(i), addOrSub, tempB(i));
        end generate;
        theOperation : NbitsAdder generic map (N)
            port map (  A => A, B => tempB, Cin => addOrSub, sum => sumLo, Cout => CoutTemp);
        sumHi <= (N-1 downto 0 => CoutTemp); -- tring to extend the sign bit
end NbitsAddOrSubGate;

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    在有符号加法中,进位没有意义。您从总和的 MSB 而非进位获得符号位。在您的第二个示例中存在下溢,因为 -3+-3 小于 2^((N=3)-1),因此结果不正确。 要对结果进行符号扩展,您应该首先检查有符号加法的上溢/下溢条件。如果没有发生上溢/下溢,则查看总和的 MSB 并扩展该位

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多