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

时间:2019-06-27 15:10:22

标签: vhdl

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

reg [31:0] mem[0:127];

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

type   mem_t is array(0 to 127) of std_logic_vector(31 downto 0); 
signal mem :mem_t;

是否可以像在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 '('

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

2 个答案:

答案 0 :(得分:3)

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

使用VHDL-2008,复合材料的元素可以不受限制,因此,您可以创建:

type std_logic_aoa is array (natural range <>) of std_logic_vector;

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

然后您可以通过以下方式使用它:

signal mem : std_logic_aoa (0 to 127)( 31 downto 0);

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

signal Data : std_logic_vector(31 downto 0) ;
. . . 
Data <= mem(15) ; 

答案 1 :(得分:1)

不。不是。

可以在VHDL中创建真正的多维数组,但是您仍然需要创建一个新类型。这就是VHDL方式。因此,您仍然需要您的包裹。

这是一个受约束的多维数组:

type c_mem_t is array (0 to 127, 31 downto 0) of std_logic;

这是一个多维 unconstrained 数组:

type mem_t is array (natural range <>, natural range <>) of std_logic;

您可以像这样使用它们:

signal mem : c_mem_t;
signal mem : mem_t(0 to 127, 31 downto 0);

在VHDL-2002中,必须限制两个尺寸,或者两个尺寸都必须不受限制。在VHDL-2008中,您可以限制一个,而不能限制一个:

type mem_t_2008 is array (natural range <>, 31 downto 0) of std_logic;