假设我有:
x: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
Y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
如何测试我的x是否为整数?
答案 0 :(得分:1)
std_logic_vector是一个复合类型,一个数组类型由一个离散枚举类型的元素组成(基类型std_ulogic代表9个值'U','X','0','1','Z', 'W','L','H'和' - ')。 “0”和“1”表示强制二进制位值,“L”和“H”表示弱二进制位值,其余为金属值(“Z”除外,用于表示驱动器的高阻抗,参见IEEE Std 1076-2008 16.8.2.4逻辑值的解释)。
IEEE Std 1076-2008有两个用于评估std_logic_vector直接作为整数值的二进制表示的包:package numeric_std_unsigned假定std_logic_vector值具有可转换为numeric_std无符号类型的自然范围二进制值(类似于Synopsys包std_logic_arith_unsigned ),或使用包numeric_std间接通过类型转换,或者为二进制数字键入unsigned,或者为包括负数的二进制补码数字打字。
为了评估表示存在金属值的二进制数的有符号或无符号类型,或'Z的包numeric_std使用为signed和unsigned声明的函数IS_X,如果参数actual包含metalogical值,则返回Boolean true Z”。
使用包numeric_std_unsigned将std_logic_vector值解释为unsigned时,使用的IS_X函数在包std_logic_1164中定义,并在没有类型转换的情况下对std_logic_vector参数进行操作。
弱值'L'和'H'未通过赋值映射到'0'和'1'。在软件包std_logic_1164的-2008版本中,包含了一个函数TO_01,它将'L'和'H'映射为'0'和'1',如果你在条件或选择中将y与字符串文字进行比较。
使用-2008包std_logic_1164和numeric_std_unsigned一个赋值保证y包含无符号整数的二进制表示将使用函数TO_01:
y <= TO_01(x) when not IS_X(x);
或者在流程语句或适合顺序语句的地方使用if语句:
if not IS_X(x) then
y <= TO_01(x);
end if;
所使用的函数调用都没有对合成有任何影响,其中在证明中没有使用金属值(而'Z'具有特殊含义)。
如果可以保证x永远不会包含'L'或'H',则可以消除TO_01功能。
只有在模拟中有条件地指定y才有结果。如果x包含金属值或“Z”,则不会进行赋值,将y的最后一个值保留为y。这可能会产生意想不到的后果,在某些情况下应引起用户的注意,因为模拟不会与合成行为相匹配。可以通过为IS_X引入重载函数来完成通知,或者在此处找到报告金属值或“Z”的新函数。