Изучение VHDL

       

Изучение VHDLОператор вставки компонента.


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

\оператор вставки компонента\::= \метка экземпляра элемента\ :

                                 \вставляемый элемент\

                [generic map(\связывание настроечной константы\

                       {, \связывание настроечной константы\});]

                [port map (\связывание порта\ 

                         {,\связывание порта\})];

   \вставляемый элемент\ ::= [component] \имя компонента\

                  | entity \имя объекта\[идентификатор архитектуры]



               | configuration \имя конфигурации\              

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

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

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

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

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

U_RG: RG16 port map (CLK => CLK,

                      E  => \разр_зп_рг\,

                      DI =>     D,

                      DO(15)=> open,

                      DO(14)=> \знак_D\,

                      DO(13 downto 0)=>\мантисса_D\ );

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

    DI => Conv_Integer(D(n-1 downto 0));  

  To_Bit(DO(14)) => \знак_D\,

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

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

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

Все компиляторы – синтезаторы поддерживают настроечные константы целого типа.

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

entity RGn is

   generic(n: integer);

   port(CLK:bit;  DI, DO: bit_vector(n-1 downto 0));

end entity;

architecture behav of RGn is begin

   process(CLK)

   begin

       if CLK='1' and CLK'event then

             DO<=DI ;

       end process;

end architecture behav;

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

U_RG8: entity RGn(proc) generic map(8),

                         port map (CLK, DI=>DATA_IN, DO=>DATA_OUT);



Содержание раздела