我有一个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有什么方法吗?
答案 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
函数仅针对类型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);