VHDL - GHDL 初始化 std_logic_vector 具有更小的位长度

VHDL - GHDL Initialise std_logic_vector with smaller bit length

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

我想给出一个小于 16 位的输入,例如 dataIn <= x"000a",这些位占据最高有效位,其余位为零。 在 verilog 中你可以很容易地做到这一点,但在 VHDL 中你会得到错误:

"string length does not match that of the anonymous integer subtype defined t... ".

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

有没有 IEEE Std 1076-2002 的方法?

对于 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);