VHDL-GHDL用较小的位长初始化std_logic_vector

时间:2019-05-19 14:16:40

标签: vhdl ghdl

我有一个signal dataIn : std_logic_vector ( 15 downto 0);

我想提供一个少于16位的输入,例如dataIn <= x"000a",这些位占据了最高有效位,其余为零。 在verilog中,您可以很容易地做到这一点,但是在VHDL中,您会收到错误消息:

  

“字符串长度与定义为...的匿名整数子类型的字符串长度不匹配”。

我知道,如果您使用16x"bit_string"可以解决此问题,但这仅适用于VHDL-2008,而ghdl尚不支持VHDL-2008。

IEEE Std 1076-2002有什么方法吗?

1 个答案:

答案 0 :(得分:0)

对于VHDL-87 / 93/2002,您可以使用numeric_std软件包中的resize函数。

library ieee;
use ieee.numeric_std.all;
...
constant FOO : std_logic_vector(2 downto 0) := "010";
signal dataIn : std_logic_vector(15 downto 0) := std_logic_vector(resize(unsigned(FOO), 16));

请注意,resize函数仅针对类型signedunsigned定义。
如果要将短位字符串放入MSB中,则可能需要使用'reverse_order属性。

通常,您会发现,定义一个专用函数封装更复杂的初始化会更加容易。

constant FOO : std_logic_vector(2 downto 0) := "010";

function init_dataIn (bar : std_logic_vector; len : integer) return std_logic_vector is
begin
  return bar & (len - bar'length - 1 downto 0 => '0');
end function init_dataIn;

signal dataIn : std_logic_vector(15 downto 0) := init_dataIn(FOO, 16);