2

如何检查 if (...) then ... end if; 如果 std_logic_vector 变量包含负数的位,则构造?如果它是负数,我必须给它分配一个零值。我有 :

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

谢谢!

4

3 回答 3

5

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

如果要对接口与 所公开的接口相似的类型使用算术,则应STD_LOGIC_VECTOR使用. 为了在这些类型之间进行转换,只需使用类型名称显式转换它们,如下所示:SIGNEDUNSIGNEDIEEE.NUMERIC_STD

std_logic_vector_variable := STD_LOGIC_VECTOR(unsigned_variable);
unsigned_variable := UNSIGNED(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;
于 2013-05-28T22:02:16.430 回答
2

快速简单的 hack 是检查最高有效位是否为 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;
于 2013-05-29T03:05:04.803 回答
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,则表示该数字为负数,否则为正数。

于 2014-06-04T13:31:32.053 回答