我想检查std_logic_vector是否包含负整数

时间:2013-05-28 19:48:32

标签: vhdl

我如何检查if(...)然后...结束if;构造如果std_logic_vector变量保存负数的位?如果是负数,我必须为其赋值为零。 我有:

signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
   sum<=x"00";
end if;

谢谢!

3 个答案:

答案 0 :(得分:5)

你不能添加两个STD_LOGIC_VECTOR,因为该语言对它应该执行的算术一无所知。这是因为,对于综合工具,声明为STD_LOGIC_VECTOR的每个信号/端口/变量只不过是多值逻辑类型STD_LOGIC的数组。对这种类型的算术没有意义。

如果要对其接口类似于STD_LOGIC_VECTOR公开的类型的类型使用算术,则应使用SIGNED(对于带符号算术)和UNSIGNED(对于无符号算术) IEEE.NUMERIC_STD中定义的类型。为了在这些类型之间进行转换,只需使用类型名称明确地转换它们,如下所示:

std_logic_vector_variable := UNSIGNED(unsigned_variable);
unsigned_variable := STD_LOGIC_VECTOR(std_logic_vector_variable);

所以,总结一下 - signal sum应该声明为SIGNED,因为你显然要对它进行算术运算。然后,您可以自由地使用所需的比较和算术运算。生成的代码看起来应该或多或少如下:

use IEEE.NUMERIC_STD.ALL;
-- entity and architecture declarations...
signal sum : SIGNED (15 downto 0);
-- inside some process...
if (sum <= 0) then sum <= 0; end if;

答案 1 :(得分:2)

快速简单的黑客攻击是检查最高位是否为1,表示负数:

result <= (others=>'0') when sum(sum'left)='1' else sum;

或者您可以将std_logic_vector强制转换为适当的类型并查看它是否为负数:

result <= (others=>'0') when signed(sum) < 0 else sum;

或者在进程内部使用if语句而不是选择的信号赋值:

if signed(sum) < 0 then
    result <= (others=>'0');
else
    result <= sum;
end if;

答案 2 :(得分:0)

signal sum : std_logic_vector (15 downto 0);

sum<= x"E8";

if (sum(15)='1') then

   sum<=x"00";

end if;

只需检查MSB ..

如果MSB为1,则表示该数字为负数,否则为正数。