我用VHDL-200X在ISE.I经常使用的数据类型一样std_logic_vector,std_logic,integer,boolean和real.总是使用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;
Run Code Online (Sandbox Code Playgroud)
但有人说不要使用IEEE.STD_LOGIC_UNSIGNED.ALL而不是.IEEE.NUMERIC_STD.ALL因为你拥有所需的一切numeric_std,而STD_LOGIC_UNSIGNED不是标准的库.在这里.
我很困惑,任何人都可以帮忙吗?
Pae*_*els 15
永远不要使用std_logic_arith或std_logic_**signed.始终numeric_std在需要有符号或无符号值时使用.以前的软件包声称是IEEE,但它们不是.它们是Synopsys或Mentor Graphics的特定于供应商的扩展.
两者都std_logic_vector基于导入的包定义了算术运算.这意味着您不能在同一架构中使用有符号和无符号值.
在integers中做所有数学有一些缺点:
我的纯粹主义者同意@Pabbles。OTOH,我务实的一面异议。我务实的一面获胜,因此,我推荐以下内容(直到支持 numeric_std_unsigned):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Run Code Online (Sandbox Code Playgroud)
对于 RTL 设计,我建议您对所有您认为是数学的运算使用有符号和无符号类型。这是我纯粹的一面。
在 RTL 中,我从不建议在 std_logic_vector 中进行数学运算,相反,std_logic_unsigned 只是为了安全网。考虑到所有关系运算符都是隐式定义的(=、/=、<、<=、>、>-)。在一个设计中,我们对值做了很多比较:
if A = "00001" then
. . .
if B = X"1A" then
Run Code Online (Sandbox Code Playgroud)
如果 A 不是 5 位会发生什么?如果 B 不是 8 位会发生什么?如果使用隐式定义的比较,则为 FALSE。如果使用 std_logic_unsigned 的比较,大小不同也没关系。如果您没有使用 std_logic_unsigned,您的测试平台应该会发现这个问题。
由于“=”可以与 RTL 一起使用,如果有人在做地址解码器并写道:
Sel <= '1' when Addr > X"3FFF" else '0' ;
Run Code Online (Sandbox Code Playgroud)
如果 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 添加了匹配的关系运算“?=”、“?/=”、“?>”……当这些在您的综合工具中可用时,我建议切换到这些。匹配的相等运算 (?=, ?/=) 要求操作数的长度相同 - 如果它们的长度不相等,则意味着编译错误。匹配排序操作 (?>, ?>=, ?<, ?<=) 仅在诸如 numeric_std 或 numeric_std_unsigned 之类的数学包中定义 - 因此,除非您使用适当的数学包,否则您不能使用它们。