gpt4 book ai didi

vhdl - 仅使用std_logic_vector包将std_logic_vector与常量进行比较

转载 作者:行者123 更新时间:2023-12-01 08:55:38 28 4
gpt4 key购买 nike

我仅在VHDL文件中使用以下软件包:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

在代码中,我将std_logic_vector信号:A与恒定值进行比较,例如
...if A<="00001011" then

但是Xilinx ISE已正确检查了代码。我的理解是STD_LOGIC_1164程序包不包含具有操作数std_logic_vector的不等式的实现,那么为什么接受上述代码语句,并且上述比较会将A视为带符号或无符号数字?

最佳答案

-将我的comp.lang.vhdl回复复制到此帖子。对不起,有些重复,但有些没有。

所有枚举类型和枚举类型的数组都隐式定义了常规排序关系运算符(>,> =,<,<=)。不幸的是,它没有按数字顺序排序,因此结果可能与预期不符。相反,它是按字典排序的。

首先,您必须查看元素类型,即基本类型为std_ulogic的std_logic。对于枚举类型,例如std_ulogic,左值小于右值,因此,对于std_ulogic(和std_logic):
'U'<'X'<'0'<'1'<'Z'<'W'<'L'<'H'<'-'

对于元素基类型为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中使用常规排序关系运算符(>,> =,<,<=),并使用lint工具强制实施。但是,这意味着您必须购买并要求使用皮棉工具。

2)禁止将常规排序关系运算符(>,> =,<,<=)与std_logic_vector一起使用,并通过同时使用以下两个包引用来强制实施它。请注意,这通过为每个运算符引用两个定义而产生错误,因此,当使用该表达式时,该表达式将变得模棱两可。注意,这可能是有问题的,因为numeric_std_unsigned是在1076-2008年引入的,综合工具可能尚不支持。
图书馆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 <= 11则

请注意,有人建议在数字_std_unsigned / std_logic_unsigned中重载“>”和朋友是非法的。在VHDL-2008之前,这是对1076的非常保守的解释。对于VHDL-2008之前具有ISAC决议的VHDL的所有修订版,此问题均已修复,该决议确定显式定义的运算符始终会使隐式定义的运算符超载而不会产生任何歧义。我注意到,即使是VHDL常见问题解答在此问题上也已过时。

4)要正式,但要切合实际。切勿使用std_logic_vector。仅使用数字类型,例如无符号和从软件包ieee.numeric_std中签名。有符号和无符号类型也支持与整数的比较。

我可能遗漏了一些策略。

请注意,VHDL-2008引入了匹配运算符,它们也通过不为没有数字解释的类型定义它们而解决了这个问题。这些运算符是:?=,?/ =,?>,?> =,?<,?<=

关于vhdl - 仅使用std_logic_vector包将std_logic_vector与常量进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934208/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com