在 VHDL 中,是否可以在不使用类型的情况下创建 std_logic_vector 数组?

pic*_*ico 2 vhdl

在 SystemVerilog 中,我可以创建一个多维数组,如下所示:

reg [31:0] mem[0:127];
Run Code Online (Sandbox Code Playgroud)

但是,在 VHDL 中,所有在 VHDL 书中在线创建类似多维数组的示例都表明我必须在创建数组之前先创建一个类型。例子:

type   mem_t is array(0 to 127) of std_logic_vector(31 downto 0); 
signal mem :mem_t;
Run Code Online (Sandbox Code Playgroud)

是否可以像在 verilog 中一样在 VHDL 中一步完成所有这些,而无需先为数组创建类型?例子:

signal mem :array(0 to 127) of std_logic_vector(31 downto 0);
--syntax error:GHDL: Type mark expected in a subtype indication
--syntax error:vsim: near "array": (vcom-1576) expecting STRING or IDENTIFIER or << or '('
Run Code Online (Sandbox Code Playgroud)

我问的原因是因为我试图避免使用包来声明数组类型,当将 IO 与连接到 VHDL 中的模块之间的数组连接时。

Jim*_*wis 5

您创建的是一个数组的数组 - 这通常是您想要的。@Matthew Taylor 创建的是一个多维数组。

使用 VHDL-2008,组合的元素可以不受约束,因此,您可以创建:

type std_logic_aoa is array (natural range <>) of std_logic_vector;
Run Code Online (Sandbox Code Playgroud)

现实地说,这应该在标准库中 - 它目前不存在。

然后您可以通过执行以下操作来使用它:

signal mem : std_logic_aoa (0 to 127)( 31 downto 0);
Run Code Online (Sandbox Code Playgroud)

您需要一个数组数组的原因是它允许您执行以下操作:

signal Data : std_logic_vector(31 downto 0) ;
. . . 
Data <= mem(15) ; 
Run Code Online (Sandbox Code Playgroud)