仅使用 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 与常量进行比较 的相关文章

  • FPGA:三种基本门电路设计(与门、或门、非门)

    FPGA的设计跟数电是紧密相连的 而我们学习数电时候 学习的第一个内容就是数字逻辑基础 这里面就包含了我们今天要讲解的三种基本的门电路 这里 我们依次讲解过来 1 与门 定义 有两个或多个输入 但只有一个输出 只有在所有输入都是高但电平时才
  • FPGA设计:制作一个频率计

    这次把自己做过的一个频率计拿出来跟大家分享一下 项目采用VHDL语言来编写 一 功能介绍 对信号源输入信号的频率进行正确测量并显示 测量范围 0 9999Hz 测量精度 1Hz 测量误差 1Hz 因为用的FPGA板只有四个数码管 所以就采用
  • FPGA设计:如何用半加器和全加器构成四位全加器

    今天来分享一下关于FPGA设计的文章 如何用半加器和全加器构成四位全加器 首先 我们看一位半加器的代码 1 一位半加器的程序代码及 图 library ieee use ieee std logic 1164 all entity half
  • 在 VHDL 中找到运算符“+”的“0”定义

    首先我想指出 这是我第一次尝试 VHDL 所以请客气一点 我想读取 X1 X4 输入并在输出处生成输入的总和 这是我的代码 library IEEE use IEEE STD LOGIC 1164 ALL entity counter of
  • 是否有理由在 VHDL 和 Verilog 中初始化(而不是重置)信号?

    我从未初始化过信号 这样 任何缺少重置或分配的信号都将是未知的或已初始化 在一些参考代码中它们有初始化 这违背了我的愿望 此外 由于初始化不可综合 因此可能会出现模拟 综合不匹配的情况 在这种情况下有什么理由初始化信号吗 编辑 2011 年
  • VHDL 中信号何时分配?

    考虑这段代码 architecture synth of my entity is signal a std logic begin a lt c and d b lt a and c end synth 第二行会尊重这一点吗a在其他进程中
  • VHDL 中的行为模型程序和数据流模型程序之间的混淆

    我正在使用 Douglas L Perry 所著的教科书 VHDL 示例编程 第四版 他在第 4 页给出了 Dataflow 编程模型的示例 Code I ENTITY mux IS PORT a b c d IN BIT s0 s1 IN
  • 使用“downto”进行 VHDL std_logic_vector 索引

    我想单独设置 std logic vector 的位 以便轻松设置单个位或位组的注释 这是我所拥有的 signal DataOut std logic vector 7 downto 0 DataOut lt 5 gt 1 Instruct
  • VHDL:进程块内的多个上升沿检测

    我对 VHDL 以及一般的数字电路 还很陌生 我正在尝试使用 BCD 样式块实现两位数的计数器 该电路的外部有一些按钮 按下这些按钮时 会将感兴趣的数字加一 很像闹钟 这是一个异步操作 会在某种形式的编辑模式下发生 外部强制 我编写的代码在
  • 在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

    我正在研究 VHDL 设计并且它可以工作 但是代码非常丑陋 而且我似乎正在尝试围绕语言的设计来实现我的目标 这一事实让我觉得有些事情是错误的 我对 VHDL 还很陌生 但我已经研究该项目的较小部分近一个月了 所以我有了总体想法 然而 这部分
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • 错误(10028):无法解析网络的多个常量驱动程序... VHDL 错误

    我正在尝试编写一个代码来检测 din 信号的上升沿 并在发生后将 doout 提高 5 个时钟周期 我在编译时不断收到不同的错误 但我不确定它们的含义 我认为我对 VHDL 中的一些概念缺乏基本的了解 但遗憾的是在网上查找并没有给我带来太大
  • 敏感列表中的哪个信号触发该过程

    在VHDL中 当模拟测试平台时 我有一个过程和一个敏感度列表 是否可以查看敏感列表中的哪个信号触发了该过程 我知道这可能取决于工具 我正在使用 Xilinx ISE 模拟器是否提供此信息 您可以使用 transaction属性结合 even
  • 全8位加法器,非逻辑输出

    我创建了一个带全加器的 8 位加法器 正如您所看到的 我开始从右到左添加相应的位 对于 cin 信号 t1 和 t2 并按顺序 cout t2 和 t1 第一个 cin 设置为加法器输入 cin 我在实现中没有看到任何问题 但是当我运行它时
  • 将 n 位的 std_logic_vector 向右或向左移位

    我有一个向量signal tmp std logic vector 15 downto 0 我必须将它向左或向右移动 n 位 我怎样才能实现这个操作 我想到了串联操作 但我不知道如何使用它 Use the ieee numeric std库
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • 32x8 寄存器文件 VHDL 测试台

    我已经用 vhdl 编写了该电路的汇编代码 我想用测试台来模拟它 RegWrite 1 位输入 时钟 写寄存器个数 3位输入 写地址 写入数据 32 位输入 数据输入 读取 寄存器编号 A 3 位输入 读取地址 读取寄存器编号 B 3 位输
  • VHDL STD_LOGIC_VECTOR 通配符值

    我一直在尝试用 VHDL 代码为我在 Altera DE1 板上实现的简单 16 位处理器编写有限状态机 在有限状态机中 我有一个CASE处理不同 16 位指令的语句 这些指令由 16 位 STD LOGIC VECTOR 带入 FSM 但
  • VHDL:如何声明可变宽度通用[重复]

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

    我有一个关于 VHDL 中 if 语句的问题 请参见下面的示例 signal SEQ bit vector 5 downto 0 signal output bit if SEQ 000001 and CNT RESULT 111111 t

随机推荐