
- •3. Оператор generate порождающей схемы if Оператора generate порождающей схемы if имеет такой синтаксис:
- •Как видно из рис.2, схема счетчика помимо регулярного блока (Regular block) содержит в своем составе и особые места, где регулярность в соединениях и по составу компонент нарушается.
- •Примечание:
- •Последний механизм позволяет вкладывать проекты имеющих регулярных структур и формировать многомерные массивы из компонентов.
- •Оператором Generic( ) имеет такой синтаксис:
- •Временная диаграмма работы проекта
Оператором Generic( ) имеет такой синтаксис:
generic(generic_interface_list);
где: generic_interface_list представляет собой список глобальных настроечных параметров проекта. При чем глобальные параметры в списке отделяются друг от друга символом точка с запятой ( ; ).
В справочном руководстве по языку VHDL об операторе Generic( ); сказано следующее:
1. Оператор Generic( ); предназначен для задания значений глобальных параметров программным объектам данных типа signal (port). С его помощью очень удобно задавать в проекте разрядность порта, тактовую частоту работы процессора. Очень часто этот оператор называют константой интерфейса. Оператор Generic( ) может быть объявлен также в теле оператора block, в теле объявления component ( ) или объявления проектируемого объекта (entity). Другими словами, оператор Generic( ) обеспечивают канал для статических (постоянных) данных, которые будут сообщены создаваемому проекту (блоку) снаружи (из окружающей среды). В отличие от программных данных типа constant (констант), значения общих параметров может быть инициализировано внешним образом, или в операторе реализации (внедрения) компонента или в спецификации конфигурации.
2. Оператор Generic(…) поддерживает также статическую (постоянную) информацию необходимую для работы других операторов проекта подобным образом, как и программные данные типа constant. В отличие от constant, значения данных содержащихся в операторе generic(...) могут быть инициализированы внешним образом. Подобно оператору port(…), оператор generic(... ) может быть объявлен в подразделе объявлений проектируемого объекта (в entity) и объявлениях component( ). Однако, оператор generic(...) всегда должен объявляться перед оператором port(…).
Значения общих параметров настройки, содержащиеся в теле оператора generic( ), который объявлен в теле оператора entity (в подразделе объявления проектируемого объекта) видимы и в entity( ) проекта и в теле архитектуры, связанной с этим entity( ). В частности, как говорилось выше, оператор generic( ), может использоваться, чтобы:
определить разрядность (ширину) портов (пример 1),
число подкомпонентов внутри блока,
частотные характеристики синхронизации блока (пример 2),
физические характеристики проекта,
ширину (разрядногсть) векторов внутри тела архитектуры,
число итераций цикла и т.д.
Примеры:
Пример 1
entity CPU is
generic (BusWidth : Integer := 16);
port(DataBus : inout Std_Logic_Vector(BusWidth-1 downto 0));
. . .
В объявлении проекта entity CPU оператор generic(BusWidth : Integer := 16), с параметром BusWidth : Integer := 16 используется, чтобы объявить разрядность порта DataBus. Этот параметр может быть успешно применен во всех объявлениях сигналов (шин) в теле связанной с проектом архитектуры. Этим способом конструктор может обеспечить только значение для одного общего параметра, действие которого распространяется на весь проект.
Пример 2
entity Gen_Gates is
generic (Delay : Time := 10 ns);
port (In1, In2 : in Std_Logic;
Output : out Std_Logic);
end Gen_Gates;
architecture Gates of Gen_Gates is
begin
. . .
Output <= In1 or In2 after Delay;
. . .
end Gates;
В объявлении проекта entity Gen_Gates оператор generic (Delay : Time := 10 ns); определяет временную задержку Delay : Time := 10 ns проектируемого устройства или задержку для назначения значений сигналу Output.
Пример 3
--Проект управляемого генератора вырабатывающего заданное
--количество импульсов с управляемыми из внешней среды
-- параметрами периода и скважности
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity clk_generic is
generic ( lenght0 : Time := 15 ns; lenght1 : Time := 35 ns);
port( A : in integer;
clk1 : out std_logic);
end clk_generic;
architecture clk_generic_ar of clk_generic is
begin
process
begin
if A = 0 then
clk1 <= '0';
else
for i in 1 to A loop
clk1 <= '1';
wait for lenght1;
clk1 <= '0';
wait for lenght0;
end loop;
end if;
wait on A;
end process;
end clk_generic_ar;