Оператор вставки компонента
Назад | Cодержание | Следующая |
Изучение VHDLОператор вставки компонентаператор вставки компонента — это любимый оператор начинающих программистов. Он играет основную роль для реализации иерархического проектирования. Его синтаксис: \оператор вставки компонента\::= \метка экземпляра элемента\ : \вставляемый элемент\ ::= [component] \имя компонента\ Действие этого оператора заключается в подстановке вместо себя одного экземпляра компонента (вставляемый элемент — компонент) или объекта (вставляемый элемент — объект проекта), или компонента, указанного в конфигурации. Если вставляется компонент, то он должен быть объявлен в данной архитектуре. Сколько раз встречается имя вставляемого компонента – столько копий объекта вставляется в странслированную программу. При этом каждая копия имеет уникальное имя, указанное в метке компонента. Таким образом, при многократной вставке компонента в странслированном проекте дублируются несколько раз все параллельные операторы указанного компонента, а, следовательно, дублируются сответствующие им виртуальные процессорные элементы программистской модели. Фраза \связывание порта\ указывает порядок подключения сигналов данного тела архитектуры к портам – сигналам компонента. Связывание может быть как позиционным, так и ассоциативным (поименованным), а также комбинированным. При позиционном связывании параметры-выражения подставляются в порядке, определенном порядком следования имен параметров в объявлении компонента. При поименованном связывании каждое имя порта связывается с соответствующим сигналом с помощью символов » => «, причем порядок следования портов может быть произвольным. Второй способ связывания предпочтителен, так как поименованное связывание более понятно при чтении и меньше вероятность допустить ошибку при записи. Неподключенные порты с режимом 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). Синтаксис связывания настроечной константы аналогичен синтаксису связывания порта. При таком связывании настроечная константа, обозначающая, например, разрядность шин, объем памяти, задержку элемента, передается из объекта проекта более высокого уровня в объект более низкого уровня, который становится компонентом. Другими словами, при связывании настроечных констант выполняется настройка в некотором смысле обобщенного объекта до компонента с конкретными параметрами. Все компиляторы – синтезаторы поддерживают настроечные константы целого типа. 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);
Анатолий Сергиенко |
Назад | Cодержание | Следующая |