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

2024-04-05

我仅在 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_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 引入了匹配运算符,它也通过不为没有数字解释的类型定义它们来解决此问题。这些运算符是:?=、?/=、?>、?>=、?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅使用 std_logic_vector 包将 std_logic_vector 与常量进行比较 的相关文章

  • VHDL:使用输入端口是不好的做法吗?

    我有一个程序 我按照以下方式使用 inout 端口 port inout unsigned 9 downto 0 if port gt 10 then port lt port 1 end if 我正在使用 inout 端口 这样我就可以读
  • 二进制补码 VHDL

    我只是想用 VHDL 制作一个简单的二进制补码设备 但它抛出了这个非常烦人的错误 我不确定我做错了什么 可能是一些非常愚蠢的事情 错误是 错误 10327 twocompliment vhd 21 处的 VHDL 错误 无法确定运算符 na
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • VHDL:IEEE std_logic 库中的真值表

    我研究了 IEEE 如何定义其库 当我打开的时候标准逻辑库 我看到了一些被定义为常数的真值表 我不知道真值表是如何运作的 请解释如何使用真值表返回结果 这是我找到的 AND 门 TYPE stdlogic table IS ARRAY st
  • 如何在 VHDL 中读取文件时消除空格

    我的输入文件中有以下数据可供读取 10101100 11010100 10101100 11010100 11111110 10111001 11111110 10111001 我需要读取每个半字节并将它们写入数组 但由于空格 行的长度会变
  • 信号分配在进程中如何工作?

    我了解到信号在遇到表达式时不会立即改变 而是在进程结束时立即改变 在此示例中 signal x y z bit process y begin x lt y z lt not x end process 这个例子是这样说的 如果信号 y 发
  • VHDL-读取HEX文件

    In VHDL 从 HEX 文件初始化 std logic vector 数组 https stackoverflow com questions 20164216 vhdl init std logic vector array from
  • 在VHDL中初始化记录数组

    我有一条记录定义如下 type ifx t is record data std logic vector 127 downto 0 address std logic vector 19 downto 0 WrReq std logic
  • Doxygen:使用 C++ 和 VHDL 进行项目的无缝文档

    我正在建立一个关于某种库的文档 该库由 C C 部分和 VHDL 部分以及一些仅包含 doxygen 的指导性页面组成 他们必须被放入一个独立的组中 到目前为止一切正常 漂亮又蓬松 但是如果我想通过使用优化 vhdl 子目录中的输出怎么办O
  • 在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

    我正在研究 VHDL 设计并且它可以工作 但是代码非常丑陋 而且我似乎正在尝试围绕语言的设计来实现我的目标 这一事实让我觉得有些事情是错误的 我对 VHDL 还很陌生 但我已经研究该项目的较小部分近一个月了 所以我有了总体想法 然而 这部分
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • VHDL 中的进程是可重入的吗?

    一个进程是否可以连续运行两次或多次VHDL 如果在进程的顺序执行未完成的情况下发生另一个事件 在敏感信号列表上 会发生什么 有可能还是我的VHDL流程中的模型完全错误 进程运行时不会发生任何事件 当进程被事件唤醒时 它会运行到完成 结束进程
  • 在 VHDL 中使用 SB_RGBA_DRV 原语

    我在使用为 Lattice ICE40UP fpga 提供的 SB RGBA DRV 原语时遇到问题 技术库提供了一个 verilog 示例 我可以使用它 但是当我尝试在 VHDL 中使用它时 P R 失败 输出以下消息 错误 非法连接 S
  • vhdl代码(for循环)

    描述 我想编写 vhdl 代码来查找数组 A 中的最大整数 该数组是一个由 20 个整数组成的数组 问题 我的算法应该是什么样子 以输入顺序语句的位置 我的VHDL代码 highnum for i in 0 to 19 loop i 0 i
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • VHDL (Xilinx) 中的错误:无法链接设计

    为什么我在 VHDL 中遇到错误 另外 有时 无法执行流程 因为之前的流程失败了 非常感谢 永久解决方案1 在win 10上 找出 installation directory Xilinx 14 x ISE DS ISE gnu MinG
  • 在单周期数据路径中加载半字和加载字节

    有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器 解决方案如下 替代文本 http img214 imageshack us img214 7107 99897101 jpg http img214 imageshack us
  • VHDL:如何声明可变宽度通用[重复]

    这个问题在这里已经有答案了 我想创建一个 VHDL 实体 其中一个泛型可以更改另一个泛型的宽度 entity lfsr n is generic WIDTH integer 32 counter width POLYNOMIAL std l
  • VHDL 中奇怪的 XNOR 行为

    导致问题的代码看起来像正常的 xnor 操作 如下所示 S 1 lt L 16 xnor L 26 该行会导致以下错误 ncvhdl p E EXPSMI HDL aes sbox enc depth16 vhd 169 14 expect
  • 为什么上升沿优于下降沿

    触发器 寄存器 通常由上升沿或下降沿触发 但大多数情况下 您会在代码中看到使用上升沿触发的 if 子句 事实上 我从未见过有下降沿的代码 这是为什么 是因为程序员自然而然地使用上升沿 因为他们习惯了 还是因为某些物理 模拟定律 事实 上升沿

随机推荐