Изучение 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);