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
函数仅针对类型 signed
和 unsigned
定义。
如果您希望将短位串放入 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);
我有一个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
函数仅针对类型 signed
和 unsigned
定义。
如果您希望将短位串放入 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);