VHDL中的签名加法溢出

时间:2016-08-24 09:06:04

标签: vhdl fpga

我尝试实施和添加两个签名号码。第一个是32位,第二个也是32位,但对应于先前操作的添加。代码VHLD如下:

Entity Sum_Position is 
  port 
  (
     Clk: in std_logic;
     Reset: in std_logic;
     Raz_position: in std_logic;
     Position_In: in std_logic_vector(31 downto 0);
     Position_Out: out std_logic_vector(31 downto 0)
  );
end Sum_Position;


Architecture Arch_position of sum_Position is 

    -- create locale signals
    signal position_before: signed (31 downto 0):= (OTHERS => '0');
    -- both signals have one more bit than the original
    signal Position_s   : SIGNED(Position_In'length downto 0):= (OTHERS => '0');
    signal Position_Before_s   : SIGNED(Position_In'length downto 0):= (OTHERS => '0');
    signal Sum_Pos_s : SIGNED(Position_In'length downto 0):= (OTHERS => '0');

    Begin  -- begin of architecture

     -- convert type and perform a sign-extension
    Position_s <=SIGNED(Position_In(31) & Position_In);
    Position_Before_s<=resize(signed(position_before), Position_Before_s'length);

    Sum_of_position: process(Clk, Reset) 

    begin 

       IF (Reset='0') THEN          -- when reset is selected
           -- initialize all values 
          Sum_Pos_s<= (OTHERS => '0');
       ELSIF (Clk'event and Clk = '1') then
           -- addition of two 33 bit values
          Sum_Pos_s <= Position_s + Position_Before_s;

       END IF;  

    end process Sum_of_position;

    -- resize to require size and type conversion
    position_before <= (OTHERS => '0') WHEN Raz_position='1' else 
                        signed(resize(Sum_Pos_s, position_before'length));

    -- Resize and output the result
    Position_Out  <= (OTHERS => '0') WHEN Raz_position='1' else  
                     std_logic_vector(resize(Sum_Pos_s, Position_Out'length));

    end Arch_position;

但是,我有溢出因为结果很奇怪。你能告诉我一个解决方案吗?

祝你好运;

2 个答案:

答案 0 :(得分:0)

首先你的代码还不清楚。

其次,position_before(_s)没有理由是异步的,它应该是时钟控制的,例如(总结):

begin 
   IF (Reset='0') THEN          -- when reset is selected
       -- initialize all values 
      Sum_Pos_s<= (OTHERS => '0');
   ELSIF (Clk'event and Clk = '1') then
      Position_Before_s <= Sum_Pos_s
      Sum_Pos_s <= Position_s + Position_Before_s;
   END IF;  
end process Sum_of_position;

第三,你的问题的答案。您将浮点数传递给您的VHDL引擎。将它们解释为已签名并添加它们。您应该查看IEEE754浮点数。符号位有一个固定的字段,一个用于指数,一个用于尾数。你不能只是添加一切。

步骤1是在相同的指数基础上表达。然后添加调整后的尾数并保持指数。然后将最高有效位的尾数重新缩放以对应于0.5。

以下是您的要求: 0.4 + 40 =(0.1)* 4 +(10)* 4 mantissas都是4 指数是-1和1.没有字段溢出,你的结果变为指数0和尾数8,所以8。

答案 1 :(得分:0)

大多数现代VHDL工具都有Integer种类型(signedunsigned)。 除非使用Range修饰符,否则它们通常为32位宽。

我建议您考虑使用整数而不是std_logic_vector

您可以在C语言中转换类型,例如强制转换。

这是我最喜欢的关于转换/转换VHDL类型的图表。我把它打印出来放在墙上http://www.bitweenie.com/listings/vhdl-type-conversion

VHDL http://vhdl.renerta.com/mobile/source/vhd00039.htm

中的整数页面