-- 复制我对这篇文章的 comp.lang.vhdl 回复。抱歉,有些重复,但有些则不然。
所有枚举类型和枚举类型数组都隐式定义常规排序关系运算符(>、>=、
首先要查看元素类型,即std_logic,其基类型为std_ulogic。对于枚举类型,例如 std_ulogic,左值小于右值,因此,对于 std_ulogic(和 std_logic):
'U'
对于元素基类型为 std_ulogic(例如 std_logic_vector 或 std_ulogic_vector)且值仅为 0 或 1 的等长数组,一切正常:
“1010”>“0101”
请注意,字典比较始终首先比较左侧元素。因此,对于字符串,以“S”开头的内容始终小于以“T”开头的内容,与长度无关。这对于将字符串排序到字典中非常有用,并且是唯一实用的默认值 - 如果我们要提供这样的东西。
OTOH,如果您认为事物是数字的话,这就不那么好了。例如,如果数组长度不相等,则以下情况成立,因为左侧参数的前导“1”大于右侧参数的前导“0”。
“100”>“0111”
因此,仅使用“use ieee.std_logic_1164.all”,您可能会遇到错误的编码实践,错误地将 std_logic_vector 视为数字(例如无符号)。
许多人会争辩说,永远不要使用 std_logic_vector 进行数学计算,而“>”就是数学。我大体上同意。
那我该怎么办?我如何保护我的设计和设计团队免受此影响。首先,您必须决定一项政策以及如何实施它。
1) 禁止在 std_logic_vector 中使用常规排序关系运算符(>、>=、
2) 禁止对 std_logic_vector 使用常规排序关系运算符(>、>=、IEEE 图书馆;
使用 ieee.numeric_std_unsigned.all ;
使用 ieee.std_logic_unsigned.all ;
3)放宽一些规则。我们最关心的是设计的正确性。允许 std_logic_vector 被解释为无符号值,并引用 numeric_std_unsigned (首选,但它是 VHDL-2008,可能尚未由您的综合工具实现 - 但如果不确定,请务必提交错误报告)或 std_logic_unsigned (不是首选 - 这是一个旧的共享软件包,不是 IEEE 标准,可能不属于 IEEE 库 - OTOH,它得到了很好的支持,并且与其他软件包(例如 numeric_std)配合得很好。
这样做的好处是它还允许包含整数的比较:
如果 A
请注意,有人认为“">”和 numeric_std_unsigned/std_logic_unsigned 中的朋友的重载是非法的。这是 VHDL-2008 之前对 1076 的非常保守的解释。在 VHDL-2008 之前,通过 ISAC 决议对 VHDL 的所有修订版进行了修复,该决议确定显式定义的运算符始终重载隐式定义的运算符,而不会产生任何歧义。我注意到,即使是 VHDL FAQ 在这个问题上也已经过时了。
4)正式但实用。切勿使用 std_logic_vector。仅使用数字类型,例如包 ieee.numeric_std 中的无符号和有符号。有符号和无符号类型也支持与整数的比较。
我可能遗漏了一些策略。
请注意,VHDL-2008 引入了匹配运算符,它也通过不为没有数字解释的类型定义它们来解决此问题。这些运算符是:?=、?/=、?>、?>=、?