Vhdl 我想检查std_逻辑_向量是否包含负整数

Vhdl 我想检查std_逻辑_向量是否包含负整数,vhdl,Vhdl,我怎样才能检查是否(…)然后。。。如果结束;如果std_逻辑_向量变量包含负数的位,则构造?如果它是负数,我必须给它赋值。 我有: 信号和:标准逻辑向量(15到0); sum不能添加两个STD\u LOGIC\u VECTORs,因为该语言不知道它应该执行的算术。这是因为,对于合成工具来说,每个声明为STD_LOGIC\u VECTOR的信号/端口/变量只不过是STD_LOGIC的数组,即多值逻辑类型。这种类型的算术没有意义 如果要在接口类似于STD\u LOGIC\u VECTOR公开的类型上

我怎样才能检查是否(…)然后。。。如果结束;如果std_逻辑_向量变量包含负数的位,则构造?如果它是负数,我必须给它赋值。 我有:

信号和:标准逻辑向量(15到0);

sum不能添加两个
STD\u LOGIC\u VECTOR
s,因为该语言不知道它应该执行的算术。这是因为,对于合成工具来说,每个声明为
STD_LOGIC\u VECTOR
的信号/端口/变量只不过是
STD_LOGIC
的数组,即多值逻辑类型。这种类型的算术没有意义

如果要在接口类似于
STD\u LOGIC\u VECTOR
公开的类型上使用算术,则应使用
SIGNED
(用于有符号算术)和
UNSIGNED
(用于无符号算术)在
IEEE.NUMERIC\u STD
中定义的类型。为了在这些类型之间转换,只需显式地使用类型名称强制转换它们,如下所示:

std_logic_vector_variable := STD_LOGIC_VECTOR(unsigned_variable);
unsigned_variable := UNSIGNED(std_logic_vector_variable);
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;
所以,求和-信号和应该声明为有符号的,因为你显然要对它执行算术运算。然后,您可以自由使用所需的比较和算术运算。生成的代码应该大致如下所示:

std_logic_vector_variable := STD_LOGIC_VECTOR(unsigned_variable);
unsigned_variable := UNSIGNED(std_logic_vector_variable);
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;
使用IEEE.NUMERIC\u STD.ALL;
--实体和体系结构声明。。。
信号和:有符号(15到0);
--在某些过程中。。。

if(sum快速简单的方法是检查最高有效位是否为1,表示负数:

result <= (others=>'0') when sum(sum'left)='1' else sum;
当sum(sum'left)=“1”时,结果“0”);
或者,您可以将std_逻辑_向量强制为适当的类型,并查看它是否为负值:

result <= (others=>'0') when signed(sum) < 0 else sum;
result'0')当有符号时(sum)<0;
或在进程内部使用if语句而不是选定的信号分配:

if signed(sum) < 0 then
    result <= (others=>'0');
else
    result <= sum;
end if;
如果有符号(和)<0,则
结果“0”);
其他的
结果<代码>信号和:标准逻辑向量(15到0);
总和