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

Зміст

Наступна

Вивчення VHDL

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

Оператор вставки компонента – це улюблений оператор програмістів-початківців. Він відіграє основну роль для реалізації ієрархічного проектування. Його синтаксис:

\оператор вставки компонента\::= \мітка екземпляра елемента\ :
           \елемент, що вставляється \
     [generіc map(\зв’язування налагоджувальної константи\
           {,\зв’язування налагоджувальної константи\});]
     [port map (\зв’язування порту\
           {,\зв’язування порту\})];

\елемент, що вставляється \ ::= [component] \ім’я компонента\

       | entіty \ім’я об’єкта\[ідентифікатор архітектури]
       | confіguratіon \ім’я конфігурації\

Дія цього оператора полягає в підстановці замість себе одного екземпляра компонента (елемент, що вставляється, – компонент) або об’єкта (елемент, що вставляється, – об’єкт проекту), або компонента, зазначеного в конфігурації. Якщо вставляється компонент, то він повинен бути оголошений у даній архітектурі.

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

Фраза \зв’язування порту\ вказує порядок підключення сигналів даного тіла архітектури до портів – сигналів компонента. Зв’язування може бути як позиційним, так і асоціативним (поіменованим), а також комбінованим. При позиційному зв’язуванні параметри- вирази підставляються в порядку, визначеному порядком перерахування імен параметрів в оголошенні компонента. При поіменованому зв’язуванні кожне ім’я порту зв’язується з відповідним сигналом за допомогою символів ” => “, причому порядок перерахування портів може бути довільним. Другий спосіб зв’язування кращий, тому що поіменоване зв’язування більш зрозуміло при читанні і менша ймовірність припуститися помилки при записі. При комбінованому зв’язуванні спочатку ставляться позиційні зв’язування, а потім – поіменовані.

Непідключені порти з режимом out або іnout допускається не вказувати в списку зв’язування портів. Але більш зрозумілим і правильним вважається зв’язування таких портів з умовним сигналом, позначеним ключовим словом 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\,

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

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

Синтаксис зв’язування налагоджувальної константи аналогічний синтаксису зв’язування порту. При такому зв’язуванні налагоджувальна константа, що позначає, наприклад, розрядність шин, об’єм пам’яті, затримку елемента, передається з об’єкта проекту більш високого рівня в об’єкт більш низького рівня, який стає компонентом. Інакше кажучи, при зв’язуванні налагоджувальних констант виконується налагоджування в деякому сенсі узагальненого об’єкта до компонента з конкретними параметрами.

Всі компілятори – синтезатори підтримують налагоджувальні константи цілого типу.
Нехай на нижньому рівні ієрархії описана модель синхронного регістра розрядності n, який приймає дане DІ по фронту синхросигнала 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