如何检查 if (...) then ... end if; 如果 std_logic_vector 变量包含负数的位,则构造?如果它是负数,我必须给它分配一个零值。我有 :
signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
sum<=x"00";
end if;
谢谢!
如何检查 if (...) then ... end if; 如果 std_logic_vector 变量包含负数的位,则构造?如果它是负数,我必须给它分配一个零值。我有 :
signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
sum<=x"00";
end if;
谢谢!
您不能添加两个STD_LOGIC_VECTOR
s,因为该语言对它应该执行的算术一无所知。这是因为,对于综合工具来说,每个被声明为的信号/端口/变量STD_LOGIC_VECTOR
只不过是一个STD_LOGIC
多值逻辑类型的数组。这种类型的算术没有意义。
如果要对接口与 所公开的接口相似的类型使用算术,则应STD_LOGIC_VECTOR
使用. 为了在这些类型之间进行转换,只需使用类型名称显式转换它们,如下所示:SIGNED
UNSIGNED
IEEE.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;
快速简单的 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;
signal sum : std_logic_vector (15 downto 0);
sum<= x"E8";
if (sum(15)='1') then
sum<=x"00";
end if;
只需检查MSB ..
如果 MSB 为 1,则表示该数字为负数,否则为正数。