在比较加载到十六进制常量(如x"3"
(的2位std_logic_vector
和std_logic_signed
包时,我遇到了意外的比较结果。当两个位都设置好时,我本以为比较结果是真的,但总是假的。可能是因为std_logic_vector
的符号扩展为4bit,以便与4bit十六进制常量进行比较。然而,真正奇怪的是,当使用常量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;
使用有符号/无符号进行比较时,两个操作数都会扩展到最长操作数的长度,然后进行比较。
因此,对于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。