我尝试实施和添加两个签名号码。第一个是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;
但是,我有溢出因为结果很奇怪。你能告诉我一个解决方案吗?
祝你好运;
答案 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
种类型(signed
和unsigned
)。
除非使用Range
修饰符,否则它们通常为32位宽。
我建议您考虑使用整数而不是std_logic_vector
。
您可以在C语言中转换类型,例如强制转换。
这是我最喜欢的关于转换/转换VHDL类型的图表。我把它打印出来放在墙上http://www.bitweenie.com/listings/vhdl-type-conversion
中的整数页面