首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用全加法器纹波的N位加法器/减法器-进位问题

使用全加法器纹波的N位加法器/减法器-进位问题
EN

Stack Overflow用户
提问于 2019-03-28 18:31:08
回答 1查看 622关注 0票数 0

我正在尝试使用全加法器的波纹来创建N位加法器/减法器。输入为N位A,N位B,结果长度应为2N (它输出具有2条总线的ALU,每条总线的高和低各为N位,因此我正在尝试扩展带符号位)。

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

下面是我的代码:

代码语言:javascript
复制
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位加法器

代码语言:javascript
复制
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;

这是加法器或副加法器

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 23:28:39

此外,带符号的加法进位没有任何意义。符号位是从和的MSB得到的,而不是从进位得到的。在你的第二个例子中有一个下溢,因为-3+-3小于2^((N=3)-1),因此结果是不正确的。要对结果进行签名扩展,应首先检查有符号加法的上溢/下溢条件。如果没有发生溢出/下溢,则查看和的MSB并扩展该位

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55395374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档