【问题标题】:Data types in VHDLVHDL 中的数据类型
【发布时间】:2020-05-18 20:11:15
【问题描述】:

我正在尝试在 VHDL 中实现过滤器。所有输入向量和输出向量都是有符号的 16 位(1.15 格式,第一位是符号位)。我计划将所有信号/变量声明为 STD_LOGIC / STD_LOGIC_VECTOR 类型。所有计算都将基于 2 的补码。

有一些包(在 IEEE 中),例如 std_logic_1164(std_logic 类型和相关函数)、std_logic_arith(算术函数)、std_logic_signed(有符号算术函数)和 std_logic_unsigned(无符号算术函数)。

为了在这个基于 STD_LOGIC / STD_LOGIC_VECTOR 类型的过滤器实现中实现所有 2 的补码操作,我应该使用哪个库?我应该同时使用 std_logic_signed.ALL 和 std_logic_1164.ALL 吗?

【问题讨论】:

  • 我建议使用来自numeric_stdsigned(和unsigned)向量和相关运算符。如果你不熟悉这个包,维基百科有一个brief article
  • 我强烈推荐使用 ... numeric_std...

标签: filtering vhdl


【解决方案1】:

std_logic_(un)signed 和 std_logic_arith 不是标准的 VHDL 包。它们是近 30 年前由 synopsys 编写的,从未成为 VHDL 标准的一部分。

此处适用的 VHDL 标准包是来自 VHDL 93 的 numeric_std(用于 unsignedsigned 类型)或用于计算 std_logic_vector 的 numeric_std_unsigned(来自 VHDL 2008)。 VHDL2008 中还提供了 fixed_pkg,它允许用户使用定点包定义和执行算术运算。例如:

signal a,b : sfixed(0 downto -15); -- 1.15 signed fixed 
signal c   : sfixed(1 downto -15);

....

a <= to_sfixed(0.12345, a);
b <= to_sfixed(-0.54321, b);

c <= a + b;

这是定点,2s 补码,整数运算。

【讨论】:

  • 如果我使用 std_logic_1164.ALL 和 numeric_std.ALL,我怎么知道计算是以有符号格式完成的?
  • 如果您使用 numeric_std 中的有符号类型,您将 a,b 声明为 signed(15 downto 0)。然后由您来分隔整数和小数部分。使用 fixed_package 可以为您做到这一点,因为您可以使用 +ve 和 -ve 索引来跟踪分离。
  • 信号 a : 有符号 (7 down to 0);一个'0');第二个说法合法吗?
  • @Cindy 如果它在程序区域内,那么是的。
  • numeric_std中的有符号和无符号数据类型可以在端口信号声明中使用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多