Altera Qsys и сущность верхнего уровня с массивом std_logic_vector
Я пытался объявить мой тип в отдельном файле "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.
5 ответов
Вы упомянули, что используете 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. Всем компонентам HDL в Qsys будет назначена библиотека VHDL, имя библиотеки которой будет соответствовать имени проекта Qsys. Пакеты должны быть доступны с библиотекой явно (work.
в вашем случае) и это может все испортить. При этом, как правило, использование пакетов в компонентах Qsys прекрасно работает для меня (включая доступ к ним с помощью work.
).
Чтобы увидеть, как Quartus назначает и компилирует в библиотеки, откройте вкладку "Единицы проектирования" в Quartus. Он перечисляет единицы в папках библиотек. Однако я видел, что пакеты не будут перечислены здесь, по некоторым причинам. Также см. .qip
файл вашего проекта Qsys, где вы можете точно увидеть, как Quartus назначил ваши файлы HDL в библиотеку.
Тот факт, что ваша проблема не появляется при создании экземпляра вашего кода непосредственно в проекте Quartus, а не в качестве компонента Qsys, подсказывает объяснение проблемы библиотеки.
Я нашел только две ссылки на обработку библиотеки Qsys: http://www.alteraforum.com/forum/showthread.php?t=33605 http://www.alterawiki.com/wiki/New_Qsys_Issues (см. Раздел "Неизбежно" дизайн юнитов ")
(На заметку, я часто использую массивы std_logic_vector
в компонентах Qsys и никогда не испытывал проблем с этим.)
Вы должны указать компилятору использовать типы, которые вы создали в пакете mytypes:
use work.mytypes.all
entity my_entity is
port ( my_bus_array : 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
То, что вы действительно хотите определить, это 2D-массив как порт. К сожалению, QSYS НЕ поддерживает 2D-массивы. Ни один стандартный интерфейс Qsys не поддерживает ничего, кроме одномерного массива портов. Следовательно, вам придется разбить массив на сущности верхнего уровня, экспортировать отдельные порты как каналы, а затем собрать их на более высоком уровне обратно в массив. Это неудачно, но это правда.