【问题标题】:VHDL std_logic_vector without rangeVHDL std_logic_vector 无范围
【发布时间】:2018-04-07 10:06:17
【问题描述】:

我遇到了一个我无法解决的问题,所以我请求您的帮助。 在 VHDL 包中,我应该按以下方式定义自定义类型的数组,以便将其用作函数中的参数:

type matrixsignal is array (integer range <>) of std_logic_vector;
function first_defined(matrix:matrixsignal; start_index,col_index:integer) return integer;

如您所见,std_logic_vector 不应该有范围,因为它取决于主代码中存在的变量。 但是,当然,编译器拒绝这种结构......我读到它只有 VHDL2008 才有可能,但仍然......有任何可能的解决方案来解决这个问题吗?

【问题讨论】:

  • 拒绝哪个结构?也许您可以提供一个minimal reproducible example,包括问题的演示以及指定您是否使用 -2008 兼容性?
  • 是的,这是 VHDL-2008 的一项功能。我们是在谈论综合代码还是模拟代码?您使用的是什么工具和版本?您是否在工具中启用了 VHDL-2008?

标签: vhdl


【解决方案1】:

VHDL2008 之前的解决方法:

了解为什么这不起作用

根据变量扩展信号在硬件中没有意义,您根本无法根据在某处定义的数字添加线。

所以解决它

你的变量会有一个定义的上限,比如

constant c_bus_maxwidth : integer := 6;
variable r_bus_usedwidth : integer 0 to c_bus_maxwidth;

如果您在编译层次结构中定义了足够高的此常量,则可以使用它来定义矩阵信号的子类型:

type t_matrixsignal is array(integer range<>) of std_logic_vector;
subtype t_definedmatrixsignal is t_matrixsignal(c_bus_maxwidth-1 downto 0);

现在您需要做的就是为您的函数接收一个 t_definedmatrixsignal 并接收您的变量 r_bus_usedwidth。对函数代码进行细微的更改即可为您提供所需的功能。实施期间的总线将始终使用 c_bus_maxwidth std_logic_vectors。

【讨论】:

  • “您根本无法根据您在某处定义的数字添加电线。”嗯......是的,你可以。这就是为什么它包含在 VHDL-2008 中并且可以完美合成,只要该数字在编译时保持不变。
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多