我一直在尝试在单独的"mytypes.vhd"文件中声明我的类型,如下所示:
library ieee;
use ieee.std_logic_1164.all;
package mytypes is
type my_bus_array_type is array (0 to 3) of std_logic_vector(7 downto 0);
end package mytypes;
然后按如下方式定义实体:
library ieee;
use ieee.std_logic_1164.all;
library work;
use work.mytypes.all;
entity my_entity is
port(
bus_array : in my_bus_array_type;
...
);
end my_entity;
好吧,这是行不通的。当我尝试使用 Altera Qsys 工具将组件添加到我的库中时,出现以下错误:
Error: Verilog HDL or VHDL XML Interface error at my_entity.vhd(41): port "bus_array" has an unsupported type File: /home/project/my_entity.vhd Line: 41
请注意,问题是我试图在实体中定义一个standard_logic_vector数组,即多维数组。如果我改为定义一个std_logic数组,则此代码可以正常工作。
你提到你正在使用Quartus,它可能会挑剔地使用std_logic_vectors作为其他项目的基本类型。
我使用子类型在 Quartus 中做我认为你所追求的事情:
mytypes.vhd 文件:
library ieee;
use ieee.std_logic_1164.all;
package mytypes is
subtype BYTE_T is std_logic_vector(7 downto 0);
type BYTE_A is array (natural range <>) of BYTE_T;
type my_bus_array_type is array (0 to 3) of BYTE_T;
end package mytypes;
my_entity.vhd 文件:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.mytypes.all
entity my_entity is
port (
my_bus_array1 : in BYTE_A(0 to 3);
my_bus_array2 : in my_bus_array_type;
...
是要在实体中定义数组范围(可能使用泛型),还是在包中定义数组范围,这取决于您。
我不是VHDL的专家,但我认为你必须像这样编写代码:
我编辑:试试这个:
package mytypes is
type my_bus_array_type is array (0 to 3) of std_logic_vector(7 downto 0);
end package mytypes;
entity my_entity is
port ( my_bus_array : in my_bus_array_type;
...);
end my_entity
你必须告诉编译器使用你在mytypes包中创建的类型:
use work.mytypes.all
entity my_entity is
port ( my_bus_array : in my_bus_array_type;
...
我也有类似的问题,这与 VHDL 库的处理有关。Qsys 中的所有 HDL 组件都将分配一个 VHDL 库,其中库名称设置为 Qsys 项目的名称。包必须使用库显式访问(在您的情况下work.
),这可能会搞砸事情。话虽如此,通常在 Qsys 组件中使用包对我来说效果很好(包括使用 work.
访问它们)。
要查看 Quartus 如何分配和编译到库中,请查看 Quartus 中的"设计单元"选项卡。它列出了库文件夹中的单元。但是,由于某种原因,我已经看到包不会在此处列出。另请参阅Qsys项目的.qip
文件,您可以在其中准确了解Quartus如何将HDL文件分配到库中。
直接在 Quartus 项目中实例化代码而不是作为 Qsys 组件时,您的问题不会出现,这一事实暗示了库问题是对此的解释。
我只找到了两个关于 Qsys 库处理的参考:http://www.alteraforum.com/forum/showthread.php?t=33605http://www.alterawiki.com/wiki/New_Qsys_Issues(请参阅"不可避免的设计单元碰撞"一节)
(附带说明一下,我经常在 Qsys 组件中使用std_logic_vector
数组,但从未遇到过问题。
您真正想要定义的是将 2D 数组作为端口。 不幸的是,QSYS不支持2D阵列。没有标准的 Qsys 接口只支持一维端口阵列。 因此,您必须在顶级实体中将阵列分解,将各个端口导出为管道,然后在更高级别将它们重新组装回阵列中。 这是不幸的,但确实如此。