在比较2位std_logic_vector
和std_logic_signed
包并加载到x"3"
等十六进制常量时,我遇到了意外的比较结果。我期望两个位都置位时比较结果为true,但始终为false。可能是因为std_logic_vector
的符号扩展到4位,以便与4位十六进制常量进行比较。但是,真正奇怪的是,使用常量3
时,比较可以按预期进行,但是仅当使用std_logic_vector
时,而不是使用signed
类型时,比较才能正常进行。请参见下面的示例代码。除第一个断言外,所有断言均失败。为什么此断言成功?同样,当不加载std_logic_signed
软件包时,vec0 = x"3"
比较仍然失败。仅在加载std_logic_unsigned
时此比较才能成功。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;
entity tb is
end entity;
architecture bhv of tb is
signal vec0 : std_logic_vector(1 downto 0) := (others => '1');
signal vec1 : signed(1 downto 0) := (others => '1');
begin
process
begin
assert vec0 = 3 report "Test 1";
assert vec0 = x"3" report "Test 2";
assert vec1 = 3 report "Test 3";
assert vec1 = x"3" report "Test 4";
wait;
end process;
end architecture;
答案 0 :(得分:1)
使用有符号/无符号进行比较时,两个操作数都将扩展为最长操作数的长度,然后进行比较。
因此,对于x“ 3”情况,您有一个4位数字“ 0011” = +3
vec0和vec1 =“ 11” = -1。因为它们被SLV视为已签名或实际已签名,所以将它们扩展为“ 1111”。因此,“ 1111”不等于“ 0011”。
将带符号/ slv与整数进行比较时,该整数将转换为另一个操作数长度的向量。在这两种情况下,文字3都不能转换为带符号的2位(因为范围是-2到+1)
对于std_logic_signed(非标准VHDL软件包),该函数的工作方式将3转换为“ 11”。因此,您会得到一个匹配项(不正确)
Numeric_std具有检查功能,其中有符号(或无符号)操作数范围之外的整数会自动返回false。
numeric_std是VHDL标准。
道德-不要打扰使用std_logic_signed。