我在ISE中使用VHDL-200X。我总是使用数据类型,如std_logic_vectorstd_logicintegerbooleanreal始终使用std_logic_vector转换为integer和反向。 我的队友让我使用library IEEE这三个部分。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

但有人说不要使用IEEE.STD_LOGIC_UNSIGNED.ALL而不是IEEE.NUMERIC_STD.ALL 。因为你在numeric_std拥有所需的一切,而STD_LOGIC_UNSIGNED不是标准库。 在这里

我很困惑,任何人都可以帮忙吗?

#1楼 票数:14 已采纳

永远不要使用std_logic_arithstd_logic_**signed 当需要有符号或无符号值时,始终使用numeric_std 以前的软件包声称是IEEE,但它们不是。 它们是Synopsys或Mentor Graphics的特定于供应商的扩展。

两者都基于导入的包在std_logic_vector上定义了算术运算。 这意味着您不能在同一架构中使用有符号和无符号值。

integer s进行所有数学运算有一些缺点:

  • 没有未初始化的价值
  • 没有'X'传播
  • 限制为32位
    (如何编写64位计数器?)

#2楼 票数:3

我的纯粹主义方面同意@Pabbles。 OTOH,我务实的一面反对。 我的实用方赢了,因此,我推荐以下内容(直到支持numeric_std_unsigned):

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

对于RTL设计,我建议您对所有您认为是数学的操作使用signed和unsigned类型。 这是我的纯粹主义方面。

在RTL中,我从不建议在std_logic_vector中进行数学运算,相反,std_logic_unsigned只适用于安全网。 考虑所有关系运算符都是隐式定义的(=,/ =,<,<=,>,> - )。 在设计中,我们对值进行了大量比较:

if A = "00001" then 
. . . 
if B = X"1A" then 

如果A不是5位会发生什么? 如果B不是8位会发生什么? 如果使用隐式定义的比较,则为FALSE。 如果您使用std_logic_unsigned中的比较,那么如果大小不同则可以。 如果您没有使用std_logic_unsigned,那么您的测试平台应该会发现此问题。

由于“=”可以与RTL一起使用,如果有人正在进行地址解码并写入:

Sel <= '1' when Addr > X"3FFF" else '0' ; 

如果A是16位,那么它应该可以正常工作。 如果A不是16位怎么办? 然后它进行词典(字典排序)比较。 IE:“100”>“01111”为TRUE。

使用std_logic_unsigned,这些将由无符号数学规则处理。 大多数情况下都是正确的。 如果没有std_logic_unsigned,这些将导致FALSE。 如果您没有使用std_logic_unsigned并且您对测试平台很小心,那么您应该找到它。

我担心的是,如果你不使用std_logic_unsigned,那么你有可能你模拟的电路将与你合成的电路不同(因为综合工具倾向于创建一个与std_logic_unsigned一致的实现)。 如果你错过了在模拟中捕捉这个,那么在评论中找到它真的很难。 因此,在使用普通的关系运算符时,我建议使用std_logic_unsigned作为安全网。

请注意,VHDL-2008引入了包numeric_std_unsigned,我计划在所有综合工具中使用时切换到它。

我非常严格的一面说我们应该通过创建额外的包来解决排序操作(<,<=,>,> =)的问题,这些包也会为std_logic_vector重载它们,因此,使用它们会因模糊而导致错误。 注意我们不能以同样的方式保护“=”。

VHDL-2008添加了匹配的关系操作“?=”,“?/ =”,“?>”,...当这些在您的综合工具中可用时,我建议切换到这些。 匹配的相等运算(?=,?/ =)要求操作数长度相同 - 如果它们的长度不相等则意味着编译错误。 匹配排序操作(?>,?> =,?<,?<=)仅在数学包中定义,例如numeric_std或numeric_std_unsigned - 因此,除非使用适当的数学包,否则不能使用它们。

  ask by Liang He translate from so

未解决问题?本站智能推荐:

2回复

在VHDL中从无符号的numeric_std转换为std_logic_vector

我有一个与从numeric_std转换为std_logic_vector的问题。 我正在使用在网上看到的移动平均滤波器代码,并对ADC值进行滤波以稳定这些值。 过滤器程序包代码为: 在我的顶级文件中,我调用了MAF_filter过程。 adc_dat定义为: 我想
1回复

unsigned和std_logic_vector之间的区别

谁能告诉我下面的书面陈述之间的区别。
1回复

VHDL 如何使用 std_logic_vector 作为数组的索引

我想使用 std_logic_vector 作为数组的索引,例如: 由于 VHDL 语法检查告诉我应该使用带有 Data 的整数作为索引,我想问一下是否可以使用 std_logic_vector 作为索引。 如果不是,如果我使用这样的计数器: 合成器将创建一个 8 位计数器(因为 7 是最
1回复

VHDL 中的数组/STD_LOGIC_VECTOR

在我的 BASYS-3 板上,我想使用 4 个开关并根据这些开关的组合输出不同的东西。 例如,如果开关 12 打开,我想要一个分配给信号的值。 我设法将我的代码上传到板上,但是当我轻弹开关时,​​显示屏上没有任何反应。 以下是我对这一段代码的约束文件的一部分: 这就是我在顶级实体的端口图中编写
1回复

VHDL:反转std_logic_vector中的每8位

我有一个非常长的std_logic_vector,大小为752。该函数中的每个8位都需要反转。 所以 然后反转接下来的8位 直到752为止,每8位就一直这样。是否有更好的方法呢? 我当时正在考虑在for循环中使用for循环。 第一个循环用于检查元素是否为8-1的整数倍,第二
1回复

需要 VHDL 代码解释(std_logic_vector)

1) std_logic_vector(data_width - 1 downto 0) 在这段代码中,我不理解(-1 降到 0)。 我知道这告诉我们它是 8 位的。 但不明白怎么办? 例如, (7 donwto 0) 是不言自明的,例如。 0、1、2、3、4、5、6、7。 2) A_re
1回复

VHDL-将std_logic_vectors数组转换为std_logic_vector

意向: 我正在从ZedBoard上的RAM读取数据,该RAM由32位长字组成,因此我使用以下缓冲区 但是,我想在中间线性缓冲区中以线性方式处理数据 因此我可以轻松地寻址缓冲区中的任何位,而无需重新计算(buffer_word)特定字的位置。 题: 如何从std_
1回复

VHDL生成具有减小长度的STD_LOGIC_VECTORS阵列

我正在尝试创建一个减少长度的std_logic_vectors数组。 我尝试使用通用std_logic_vector创建一个数组,然后使用generate语句来生成向量。 以及返回通用std_logic_vector的函数: 我是否错误地使用了生成语句?