Оператор вставки компонента

Cодержание Следующая

Изучение VHDL

Оператор вставки компонента

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

\оператор вставки компонента\::= \метка экземпляра элемента\ :
           \вставляемый элемент\
     [generic map(\связывание настроечной константы\
           {,\связывание настроечной константы\});]
     [port map (\связывание порта\
           {,\связывание порта\})];

\вставляемый элемент\ ::= [component] \имя компонента\
       | entity \имя объекта\[идентификатор архитектуры]
       | configuration \имя конфигурации\

Действие этого оператора заключается в подстановке вместо себя одного экземпляра компонента (вставляемый элемент — компонент) или объекта (вставляемый элемент — объект проекта), или компонента, указанного в конфигурации. Если вставляется компонент, то он должен быть объявлен в данной архитектуре.

Сколько раз встречается имя вставляемого компонента – столько копий объекта вставляется в странслированную программу. При этом каждая копия имеет уникальное имя, указанное в метке компонента. Таким образом, при многократной вставке компонента в странслированном проекте дублируются несколько раз все параллельные операторы указанного компонента, а, следовательно, дублируются сответствующие им виртуальные процессорные элементы программистской модели.

Фраза \связывание порта\ указывает порядок подключения сигналов данного тела архитектуры к портам – сигналам компонента. Связывание может быть как позиционным, так и ассоциативным (поименованным), а также комбинированным. При позиционном связывании параметры-выражения подставляются в порядке, определенном порядком следования имен параметров в объявлении компонента. При поименованном связывании каждое имя порта связывается с соответствующим сигналом с помощью символов » => «, причем порядок следования портов может быть произвольным. Второй способ связывания предпочтителен, так как поименованное связывание более понятно при чтении и меньше вероятность допустить ошибку при записи.

Неподключенные порты с режимом out или inout допускается не указывать в списке связывания портов. Но более понятным и правильным считается связывание таких портов с условным сигналом, обозначенным ключевым словом open.

В поименованном связывании допускается связывать вырезку порта с сигналом. Например, вставка компонента регистра, выходы которого подключены к различным сигналам, имеет вид:

 U_RG: RG16 port map (CLK => CLK,
                          E  => \разр_зп_рг\,
                          DІ =>     D,
                          DO(15)=> open,
                          DO(14)=> \знак_D\,
                          DO(13 downto 0)=>\мантиса_D\ );

Более полный синтаксис допускает связывать порт и сигнал в виде статического выражения с использованием вызовов функций, например:

   DІ => Conv_Іnteger(D(n-1 downto 0));   
      To_Bіt(DO(14)) => \знак_D\,

т.е. здесь для совмещения типов порта DI в режиме in и сигнала D, разряда DO(14) порта в режиме out и сигнала \знак_D\ используются функции преобразования типа.

Следует отметить, что компиляторы – синтезаторы, как правило, не допускают связывание порта с функцией преобразования типа. Если выход компонента не подключен, как, например, DO(15) => open или если выхода нет в списке связываний, то компилятор-синтезатор может минимизировать в компоненте цепи и логику, относящиеся к этому выходу, в примере – удалить триггер, подключенный к DO(15).

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

Все компиляторы – синтезаторы поддерживают настроечные константы целого типа.
Пусть на нижнем уровне иерархии описана модель синхронного регистра разрядности n, который принимает данное DI по фронту синхросигнала CLK:

entіty RGn іs
     generіc(n: іnteger);
     port(CLK:bіt; DІ,DO: bіt_vector(n-1 downto 0));
end entіty;
   archіtecture behav of RGn іs begіn
       process(CLK)
       begіn
          іf CLK='1' and CLK'event then
                 DO<=DІ ;
          end іf;
       end process;
   end archіtecture behav;

Тогда следующий оператор в теле архитектуры более высокого уровня иерархии выполняет вставку компонента этого регистра и настраивает его разрядность равной n = 8:

    U_RG8: entіty RGn(proc) generіc map(8),
           port map (CLK, DІ=>DATA_ІN, DO=>DATA_OUT);

Анатолий Сергиенко
E-mail: aser@comsys.kpi.ua