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 не поддерживает ничего, кроме одномерного массива портов. Следовательно, вам придется разбить массив на сущности верхнего уровня, экспортировать отдельные порты как каналы, а затем собрать их на более высоком уровне обратно в массив. Это неудачно, но это правда.

Другие вопросы по тегам