在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中模块之间的数组连接时,我试图避免使用包声明数组类型。
答案 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;