VHDL использует зависимый универсальный тип в спецификации порта - PullRequest
1 голос
/ 16 октября 2019

Я хотел бы иметь пакет, содержащий типы, которые зависят от обобщений, чтобы я мог использовать их в проекте. Однако у меня возникают проблемы с использованием этих зависимых типов в объявлениях портов:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


package dependent_types is
    generic (generic_value : natural);

    subtype dependent_type is std_ulogic_vector (generic_value - 1 downto 0);
end package;


use work.all;

entity dependent_entity_with_dependent_port is
    generic (generic_value : natural);

    package instantiated_types is new dependent_types
        generic map (generic_value => generic_value);
    use instantiated_types.all;

    port (dependent_port : out dependent_type);
end dependent_entity_with_dependent_port;

Кажется, что декларативные части сущностей (создание экземпляров, предложение use) должны следовать после объявления порта. Это предотвращает использование типов, определенных в универсальных пакетах, которые зависят от универсальных элементов сущности.

Есть ли способ достичь этого?

1 Ответ

0 голосов
/ 16 октября 2019

Я не думаю, что можно делать то, что вы хотите - установить универсальный пакет равным обычному универсальному, а затем использовать его в качестве порта. Однако вы можете использовать отложенную константу в пакете, подобном следующему:

Этот код компилируется один раз и является стабильным:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package dependent_types is
    generic (generic_value : natural);
    subtype dependent_type is std_ulogic_vector (generic_value - 1 downto 0);
end package;

package constants is
  constant generic_value : natural;
end package;

Этот код должен бытьперекомпилируется каждый раз, когда константа изменяется:

package body constants is
  constant generic_value : natural := 16;
end package body ;

use work.all;
use work.constants.all;
package instantiated_types is new dependent_types
    generic map (generic_value => generic_value);

use work.instantiated_types.all;
entity dependent_entity_with_dependent_port is
    port (dependent_port : out dependent_type);
end dependent_entity_with_dependent_port;

architecture A of dependent_entity_with_dependent_port is
begin
end;

https://www.edaplayground.com/x/3vfd

...