奇怪的签名比较结果

  • 本文关键字:比较 结果 vhdl signed
  • 更新时间 :
  • 英文 :


在比较加载到十六进制常量(如x"3"(的2位std_logic_vectorstd_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。

相关内容

  • 没有找到相关文章

最新更新