我如何检查if(...)然后...结束if;构造如果std_logic_vector变量保存负数的位?如果是负数,我必须为其赋值为零。 我有:
signal sum : std_logic_vector (15 downto 0);
sum<= (...);
if (...) then
sum<=x"00";
end if;
谢谢!
答案 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,则表示该数字为负数,否则为正数。