【问题标题】:When to use VHDL library std_logic_unsigned and numeric_std?何时使用 VHDL 库 std_logic_unsigned 和 numeric_std?
【发布时间】:2017-08-16 02:19:33
【问题描述】:

我在 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 不是标准库。 Here.

我对此感到困惑,有人可以帮忙吗?

【问题讨论】:

  • 没有人知道你的队友,以及他们的意图。他们可能只是不知道这个问题。我会问他们为什么坚持使用STD_LOGIC_ARITHSTD_LOGIC_UNSIGNED 而不是numeric_std
  • 他们说如果你不做任何算术运算,你就不需要 numeric_std.@Staszek
  • 几乎相同的问题。谢谢。@wjl

标签: vhdl fpga


【解决方案1】:

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

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

integers 中进行所有数学运算有一些缺点:

  • 没有未初始化的值
  • 没有“X”传播
  • 限制为 32 位
    (如何写一个64位的计数器?)

【讨论】:

  • 但是如果我在编写控制功能模块时几乎不需要'signed'或'unsigned'类型?
  • 未初始化值是什么意思?没有'X'传播是什么意思?
  • 如果你不需要有符号和无符号的值,那么除了std_logic_1164之外不要使用任何包......不需要将更多未使用的类型和运算符加载到当前范围内。
  • 对于“U”:在仿真中,您将能够看到没有默认值的寄存器、未驱动的信号,因为它们初始化为“U”并且电路永远不会复位。对于“X”,即使仅查看顶级信号,您也有机会在顶级看到内部 X 值,因为错误 (“X”) 正在通过您的设计并冒泡到顶部。这就是我们使用std_logic 而不是bit 作为数据类型的原因。
  • 注: wrt语言:“后者”是指两个中的第二个。相反的是“前”,但在这种情况下,我只想重复他们的名字;)
【解决方案2】:

我的纯粹主义者同意@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 设计,我建议您对所有您认为是数学的操作使用有符号和无符号类型。这是我纯粹的一面。

在 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 位怎么办?然后它进行字典(字典排序)比较。即:“100”>“01111”为真。

使用 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 添加了匹配的关系操作“?=”、“?/=”、“?>”……当这些在您的综合工具中可用时,我建议切换到这些。匹配的相等操作(?=,?/=)要求操作数的长度相同 - 如果它们不相等则意味着编译错误。匹配的排序操作 (?>, ?>=, ?

【讨论】:

  • 谢谢。 @Jim Lewis 非常详细的答案。我必须有时间阅读它。
猜你喜欢
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多