Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2012 №10

Разработка VHDL-описаний цифровых устройств, проектируемых на основе ПЛИС фирмы Xilinx, с использованием шаблонов САПР ISE Design Suite

Зотов Валерий


Продолжение. Начало в № 2`2010
В тридцать третьей части статьи завершается представление шаблонов записи директив, предназначенных для управления процессами синтеза и реализации разрабатываемого устройства. Здесь же рассмотрены образцы синтезируемых конструкций, которые можно использовать при создании законченных описаний различных элементов проектируемых устройств.

В каталоге RAM Inference Styles раздела Synthesis собраны шаблоны различных вариантов записи директивы RAM_STYLE, которые определяют способ последующей реализации макросов ОЗУ, формируемых средствами синтеза XST. Подробная структура этого каталога показана на рис. 529.

Структура каталога RAM Inference Styles раздела Synthesis

Рис. 529. Структура каталога RAM Inference Styles раздела Synthesis

В состав каталога RAM Inference Styles входит четыре подкаталога — Auto, Block, Distributed и Pipe_Distributed. Каждый из этих подкаталогов соответствует определенному методу синтеза и последующей реализации элементов оперативной памяти в кристаллах программируемой логики с архитектурой FPGA. В подкаталоге Auto расположены образцы вариантов записи атрибута RAM_STYLE, при использовании которых средства синтеза XST для каждого идентифицированного макроса ОЗУ автоматически выбирают тип памяти ПЛИС, обеспечивающий его оптимальную реализацию.

Auto/Entity (RAM_STYLE) содержит шаблон варианта записи атрибута RAM_STYLE, разрешающего автоматический выбор ресурсов кристалла программируемой логики в процессе синтеза заданного объекта описания для последующей реализации макросов элементов оперативной памяти:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <entity_name>: entity is “AUTO”;

После включения этой конструкции в состав создаваемого VHDL-модуля следует вместо entity_name указать имя соответствующего объекта описания.

Auto/Signal (RAM_STYLE) представляет собой образец варианта использования атрибута RAM_STYLE, предназначенного для автоматического выбора способа последующей реализации идентифицированных макросов ОЗУ при синтезе указанного сигнала:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <signal_name>: signal is “AUTO”;

В подкаталоге Block находятся шаблоны вариантов записи атрибута RAM_STYLE, предписывающих выполнить процесс синтеза макросов элементов оперативной памяти с учетом их последующей реализации на базе модулей Block RAM.

Block/Entity (RAM_STYLE) является образцом варианта использования атрибута RAM_STYLE для синтеза заданного объекта описания с учетом последующей реализации макросов ОЗУ на основе ресурсов блочной памяти кристалла программируемой логики:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <entity_name>: entity is “BLOCK”;

Block/Signal (RAM_STYLE) включает в себя шаблон варианта записи атрибута RAM_STYLE, позволяющего учитывать в процессе синтеза определенного сигнала реализацию макросов элементов оперативной памяти на базе модулей Block RAM:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <signal_name>: signal is “BLOCK”;

Подкаталог Distributed объединяет образцы вариантов применения директивы RAM_STYLE для реализации синтезированных макросов ОЗУ на основе ресурсов распределенной памяти ПЛИС.

Distributed/Entity (RAM_STYLE) предоставляет шаблон варианта записи атрибута RAM_STYLE, предписывающего проведение синтеза указанного объекта описания с учетом последующей реализации макросов оперативных запоминающих устройств на базе таблиц преобразования LUT кристалла программируемой логики:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <entity_name>: entity is “DISTRIBUTED”;

Distributed/Signal (RAM_STYLE) демонстрирует образец варианта использования атрибута RAM_STYLE для осуществления синтеза заданного сигнала с поддержкой реализации макросов ОЗУ на основе ресурсов распределенной памяти ПЛИС:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <signal_name>: signal is “DISTRIBUTED”;

В подкаталоге Pipe_Distributed сгруппированы шаблоны вариантов записи директивы RAM_STYLE, применяемых для выполнения процесса синтеза проектируемого устройства, обеспечивающего последующую реализацию макросов ОЗУ на базе распределенной памяти ПЛИС с использованием регистров.

Pipe_Distributed/Entity (RAM_STYLE) содержит образец варианта применения атрибута RAM_STYLE для синтеза определенного объекта описания с поддержкой реализации макросов элементов оперативной памяти на основе таблиц преобразования LUT кристалла программируемой логики с привлечением дополнительных регистров:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <entity_name>: entity is “PIPE_DISTRIBUTED”;

Pipe_Distributed/Signal (RAM_STYLE) представляет собой шаблон варианта записи атрибута RAM_STYLE, предписывающего проведение синтеза указанного сигнала с учетом последующей реализации макросов ОЗУ на базе распределенной памяти ПЛИС и регистров:

attribute RAM_STYLE : string;
attribute RAM_STYLE of <signal_name>: signal is “PIPE_DISTRIBUTED”;

В каталоге Register Balancing расположены образцы различных вариантов использования директивы REGISTER_BALANCING, которая предоставляет возможность повышения производительности разрабатываемого устройства за счет перемещения триггеров относительно логических ресурсов в процессе синтеза. Детальная структура этого каталога изображена на рис. 530.

Структура каталога Register Balancing

Рис. 530. Структура каталога Register Balancing раздела Synthesis

Структуру каталога Register Balancing образуют четыре подкаталога — Backward, Forward, No и Yes. В подкаталоге Backward находятся шаблоны вариантов записи атрибута REGISTER_BALANCING, допускающих только обратную перестановку триггеров в процессе синтеза, при которой триггер на выходе LUT-таблицы преобразуется в серию триггеров на ее входах. Рис. 531 наглядно поясняет процедуру обратного перемещения триггеров в процессе оптимизации синтезируемого описания.

Обратная перестановка триггеров

Рис. 531. Обратная перестановка триггеров при оптимизации синтезируемого описания

Backward/Entity (REGISTER_BALANCING) является образцом варианта применения атрибута REGISTER_BALANCING, разрешающего перестановку триггеров при синтезе определенного объекта описания только в обратном направлении:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <entity_name>: entity is “BACKWARD”;

Backward/Signal (REGISTER_BALANCING) включает в себя шаблон варианта записи атрибута REGISTER_BALANCING, предписывающего только обратное перемещение триггеров при синтезе заданного сигнала:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <signal_name>: signal is “BACKWARD”;

В подкаталоге Forward представлены образцы вариантов использования атрибута REGISTER_BALANCING для разрешения перемещения триггеров только в прямом направлении, при котором триггеры на входах таблицы преобразования LUT заменяются триггером на ее выходе. На рис. 532 представлена процедура прямого перемещения триггеров в процессе оптимизации синтезируемого описания.

Прямая перестановка триггеров

Рис. 532. Прямая перестановка триггеров при оптимизации синтезируемого описания

Forward/Entity (REGISTER_BALANCING) предоставляет шаблон варианта записи атрибута REGISTER_BALANCING, допускающего только прямое перемещение триггеров при синтезе указанного объекта описания:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <entity_name>: entity is “FORWARD”;

Forward/Signal (REGISTER_BALANCING) демонстрирует образец варианта применения атрибута REGISTER_BALANCING для разрешения перестановки триггеров при синтезе определенного сигнала только в прямом направлении:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <signal_name>: signal is “FORWARD”;

Подкаталог No объединяет шаблоны вариантов записи атрибута REGISTER_BALANCING, запрещающих перемещение триггеров в процессе синтеза проектируемого устройства.

No/Entity (REGISTER_BALANCING) содержит образец варианта использования атрибута REGISTER_BALANCING для запрета перестановки триггеров при синтезе заданного объекта описания:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <entity_name>: entity is “NO”;

No/Signal (REGISTER_BALANCING) представляет собой шаблон варианта записи атрибута REGISTER_BALANCING, запрещающего изменение расположения триггеров по отношению к таблицам преобразования LUT в процессе синтеза соответствующего сигнала:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <signal_name>: signal is “NO”;

В подкаталоге Yes размещаются образцы применения директивы REGISTER_BALANCING для разрешения перестановки триггеров в процессе синтеза разрабатываемого устройства как в прямом, так и в обратном направлении.

Yes/Entity (REGISTER_BALANCING) включает в себя шаблон варианта записи атрибута REGISTER_BALANCING, допускающего перемещение триггеров относительно таблиц преобразования LUT при синтезе указанного объекта описания как в прямом, так и в обратном направлении:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <entity_name>: entity is “YES”;

Yes/Signal (REGISTER_BALANCING) является образцом варианта использования атрибута REGISTER_BALANCING для разрешения перестановки триггеров в любом направлении при синтезе определенного сигнала:

attribute REGISTER_BALANCING : string;
attribute REGISTER_BALANCING of <signal_name>: signal is “YES”;

В каталоге Register Duplication находится шаблон варианта записи одноименной директивы, которая разрешает или запрещает средствам синтеза дублирование регистров при временной оптимизации и сокращении количества разветвлений цепей. В состав этого каталога входит единственный подкаталог Yes, который содержит приведенный ниже шаблон (рис. 530).

Yes/Entity (REGISTER_DUPLICATION) демонстрирует образец варианта применения атрибута REGISTER_DUPLICATION, разрешающего дублирование регистров в процессе синтеза указанного объекта описания:

attribute REGISTER_DUPLICATION : string;
attribute REGISTER_DUPLICATION of <entity_name>: entity is “YES”;

В каталоге Signal Encoding раздела Synthesis расположены образцы различных вариантов использования одноименной директивы, которые позволяют указать метод кодирования внутренних сигналов в процессе синтеза разрабатываемого устройства. Развернутая структура этого каталога приведена на рис. 533.

Структура каталога Signal Encoding

Рис. 533. Структура каталога Signal Encoding раздела Synthesis

Структуру каталога Signal Encoding составляют три подкаталога — Auto, One-Hot и User. В подкаталоге Auto собраны шаблоны вариантов записи атрибута SIGNAL_ENCODING, предоставляющих возможность автоматического выбора средствами синтеза наилучшего метода кодирования сигналов.

Auto/Component (SIGNAL_ENCODING) включает в себя образец варианта применения атрибута SIGNAL_ENCODING, позволяющего автоматически выбрать оптимальный метод кодирования сигналов при синтезе указанного компонента:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <component_name>: component is “AUTO”;

При практическом использовании приведенной конструкции необходимо заменить component_name идентификатором соответствующего компонента.

Auto/Entity (SIGNAL_ENCODING) содержит шаблон варианта записи атрибута SIGNAL_ENCODING, обеспечивающего автоматический выбор наилучшего способа кодирования сигналов при синтезе определенного объекта описания:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <entity_name>: entity is “AUTO”;

Auto/Label (SIGNAL_ENCODING) демонстрирует образец варианта использования атрибута SIGNAL_ENCODING для выбора наилучшего метода кодирования сигналов при синтезе заданного блока:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <label_name>: label is “AUTO”;

В этой конструкции label_name заменяется меткой соответствующего блока VHDL-кода.

Auto/Signal (SIGNAL_ENCODING) представляет собой шаблон варианта записи атрибута SIGNAL_ENCODING, обеспечивающего возможность автоматического выбора оптимального метода кодирования указанного сигнала:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <signal_name>: signal is “AUTO”;

Подкаталог One-Hot объединяет в себе образцы применения директивы SIGNAL_ENCODING для выбора одноименного метода кодирования сигналов.

One-Hot/Component (SIGNAL_ENCODING) является шаблоном варианта записи атрибута SIGNAL_ENCODING, предписывающего использование метода кодирования сигналов One-Hot в процессе синтеза заданного компонента:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <component_name>: component is “ONE-HOT”;

One-Hot/Entity (SIGNAL_ENCODING) включает в себя образец варианта применения атрибута SIGNAL_ENCODING для установки метода кодирования сигналов One-Hot при синтезе определенного объекта описания:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <entity_name>: entity is “ONE-HOT”;

One-Hot/Label (SIGNAL_ENCODING) содержит шаблон варианта записи атрибута SIGNAL_ENCODING, обеспечивающего кодирование сигналов в соответствии с методом One-Hot в процессе синтеза указанного блока:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <label_name>: label is “ONE-HOT”;

One-Hot/Signal (SIGNAL_ENCODING) демонстрирует образец варианта применения атрибута SIGNAL_ENCODING для выбора в процессе синтеза соответствующего сигнала метода кодирования One-Hot:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <signal_name>: signal is “ONE-HOT”;

В подкаталоге User размещены шаблоны вариантов записи директивы SIGNAL_ENCODING, предписывающих средствам синтеза использовать метод кодирования сигналов, представленный в файле исходного описания.

User/Component (SIGNAL_ENCODING) предоставляет образец варианта записи атрибута SIGNAL_ENCODING, разрешающего при синтезе указанного компонента в качестве способа кодирования сигналов применение пользовательского метода:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <component_name>: component is “USER”;

User/Entity (SIGNAL_ENCODING) является шаблоном варианта записи атрибута SIGNAL_ENCODING, допускающего применение пользовательского метода кодирования сигналов в процессе синтеза заданного объекта описания:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <entity_name>: entity is “USER”;

User/Label (SIGNAL_ENCODING) включает в себя образец варианта использования атрибута SIGNAL_ENCODING, позволяющего применять метод кодирования сигналов, представленный в файле исходного описания, при синтезе соответствующего блока:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <label_name>: label is “USER”;

User/Signal (SIGNAL_ENCODING) содержит шаблон варианта записи атрибута SIGNAL_ENCODING, предоставляющего возможность применения в процессе синтеза указанного сигнала пользовательского метода кодирования:

attribute SIGNAL_ENCODING : string;
attribute SIGNAL_ENCODING of <signal_name>: signal is “USER”;

Каталог Use DSP48 раздела Synthesis папки Attributes объединяет образцы вариантов записи одноименной директивы, предназначенной для управления при использовании ресурсов аппаратных секций цифровой обработки сигналов в кристаллах программируемой логики с архитектурой FPGA семейств Virtex-4 LX, Virtex-4 SX, Virtex-4 FX, Virtex-5 LX, Virtex-5 LXT, Virtex-5 SXT, Virtex-5 FXT, Virtex-6 LXT, Virtex-6 CXT, Virtex-6 SXT, Virtex-6 HXT, Spartan-3A DSP, Spartan-6 LX и Spartan-6 LXT. Детализиро-ванная структура этого каталога показана на рис. 533. В подкаталоге Yes расположены шаблоны различных вариантов записи директивы USE_DSP48, предписывающих выполнение процесса синтеза проектируемого устройства с учетом последующей реализации различных элементов на базе секций цифровой обработки сигналов.

Component (USE_DSP48) демонстрирует образец варианта применения атрибута USE_DSP48, разрешающего реализацию определенного компонента на основе ресурсов аппаратных секций цифровой обработки сигналов в ПЛИС перечисленных семейств:

attribute USE_DSP48 : string;
attribute USE_DSP48 of <component_name>: component is “YES”;

Entity (USE_DSP48) представляет собой шаблон варианта записи атрибута USE_DSP48, допускающего использование ресурсов аппаратных блоков цифровой обработки сигналов для реализации указанного объекта описания:

attribute USE_DSP48 : string;
attribute USE_DSP48 of <entity_name>: entity is “YES”;

Signal (USE_DSP48) является образцом варианта использования атрибута USE_DSP48 для разрешения реализации соответствующей цепи на базе секций цифровой обработки сигналов в кристаллах программируемой логики с архитектурой FPGA указанных выше семейств:

attribute USE_DSP48 : string;
attribute USE_DSP48 of <signal_name>: signal is “YES”;

В разделе Timing папки Attributes собраны шаблоны различных вариантов записи директив, устанавливающих временные ограничения для определенных цепей (сигналов) в процессе синтеза разрабатываемого устройства.

Period constraint Mhz (PERIOD) включает в себя образец варианта записи атрибута PERIOD, определяющего предельное значение частоты сигнала синхронизации для указанной цепи проектируемого устройства:

attribute PERIOD : string;
attribute PERIOD of <signal_name>: signal is “<value> Mhz”;

Значение атрибута PERIOD накладывает ограничение на время распространения сигналов по цепям и логике, подключенных между выходом одного и входом другого синхронного элемента (триггера, регистра или ОЗУ), которые тактируются одним и тем же сигналом синхронизации. На рис. 534 показан пример, наглядно поясняющий назначение атрибута PERIOD.

Пример использования атрибута PERIOD

Рис. 534. Пример использования атрибута PERIOD

При практическом использовании рассматриваемого шаблона следует вместо signal_name вставить идентификатор соответствующего сигнала синхронизации, а вместо value — значение частоты этого сигнала в мегагерцах.

Period constraint ns (PERIOD) содержит шаблон варианта записи атрибута PERIOD, устанавливающего предельное значение периода сигнала синхронизации для соответствующей цепи разрабатываемого устройства:

attribute PERIOD : string;
attribute PERIOD of <signal_name>: signal is “<value> ns”;

В приведенной конструкции значение периода указывается в наносекундах.

Timing ignore a net (TIG) демонстрирует образец варианта применения атрибута TIG, позволяющего исключить определенные цепи разрабатываемого устройства при выполнении временного анализа проекта:

attribute TIG : string;
attribute TIG of <signal_name>: signal is “TRUE”;

Рассматриваемый атрибут позволяет не учитывать в процессе временного анализа не только цепь, идентификатор которой записывается вместо signal_name, но и последующий маршрут распространения сигнала. Использование атрибута TIG поясняет схема, изображенная на рис. 535.

Пример использования атрибута TIG

Рис. 535. Пример использования атрибута TIG

В папке Coding Examples раздела Synthesis Constructs сосредоточены шаблоны синтезируемых конструкций, которые можно использовать при создании законченных описаний различных элементов разрабатываемых устройств. Развернутая структура этой папки приведена на рис. 536.

Структура папки Coding Examples

Рис. 536. Структура папки Coding Examples раздела Synthesis Constructs

В состав папки Coding Examples входят 17 каталогов, в каждом из которых собраны образцы описаний элементов соответствующего функционального назначения. В каталоге Accumulators находятся образцы конструкций, предназначенные для формирования описаний аккумуляторов.

Accumulators/Async Reset & CE предоставляет шаблон описания аккумулятора с асинхронным сбросом и разрешением синхронизации:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
--
process (<clock>, <reset>)
begin
if <reset>=’1’ then
<accumulate_out> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<accumulate_out> <= <accumulate_out> + <accumulate_in>;
end if;
end if;
end process;

Для подготовки законченного описания аккумулятора на основе приведенной конструкции необходимо вместо clock и reset указать идентификаторы сигнала (или порта) синхронизации и асинхронного сброса соответственно, а вместо clock_enable — идентификатор сигнала (порта) разрешения синхронизации. Кроме того, следует заменить accumulate_in и accumulate_out идентификаторами входной и выходной шин данных аккумулятора.

Accumulators/Async Reset, CE & Sync Load является образцом описания аккумулятора с асинхронным сбросом, разрешением синхронизации и синхронной загрузкой:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
--
process (<clock>, <reset>)
begin
if <reset>=’1’ then
<accumulate_out> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
if <load_enable>=’1’ then
<accumulate_out> <= <load_value>;
else
<accumulate_out> <= <accumulate_out> + <accumulate_in>;
end if;
end if;
end if;
end process;

При формировании законченного описания аккумулятора на основе приведенной конструкции необходимо выполнить действия, перечисленные при рассмотрении предыдущего шаблона, а также вместо load_enable и load_value вставить идентификатор сигнала разрешения синхронной загрузки и загружаемое значение соответственно.

Accumulators/Example Code включает в себя пример полного описания 4-разрядного аккумулятора с синхронным сбросом:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--
entity accumulators_1 is
port(CLK, CLR : in std_logic;
D : in std_logic_vector(3 downto 0);
Q : out std_logic_vector(3 downto 0));
end accumulators_1;
--
architecture archi of accumulators_1 is
signal tmp: std_logic_vector(3 downto 0);
begin
--
process (CLK)
begin
if (CLK’event and CLK=’1’) then
if (CLR=’1’) then
tmp <= “0000”;
else
tmp <= tmp + D;
end if;
end if;
end process;
--
Q <= tmp;
--
end archi;

В представленном описании аккумулятора используется следующая система условных обозначений входных и выходных портов:

  • CLK — вход сигнала синхронизации;
  • CLR — вход синхронного сброса;
  • D — входная 4-разрядная шина данных;
  • Q — выходная 4-разрядная шина данных.

Условный графический образ 4-разрядного аккумулятора, формируемого с помощью шаблона Accumulators/Example Code, показан на рис. 537.

Oбраз аккумулятора, формируемого с помощью шаблона Accumulators/Example Code

Рис. 537. Условный графический образ аккумулятора, формируемого с помощью шаблона Accumulators/Example Code

Accumulators/Sync Reset & CE содержит шаблон описания аккумулятора с синхронным сбросом и разрешением синхронизации:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’1’ then
<accumulate_out> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
<accumulate_out> <= <accumulate_out> + <accumulate_in>;
end if;
end if;
end process;

Accumulators/Sync Reset, CE & Sync Load демонстрирует образец описания аккумулятора с синхронным сбросом, разрешением синхронизации и синхронной загрузкой:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’1’ then
<accumulate_out> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
if <load_enable>=’1’ then
<accumulate_out> <= <load_value>;
else
<accumulate_out> <= <accumulate_out> + <accumulate_in>;
end if;
end if;
end if;
end process;

В каталоге Arithmetic папки Coding Examples расположены шаблоны синтезируемых описаний элементов, выполняющих основные арифметические функции (сложение, вычитание и умножение). Эти шаблоны распределены в четыре подкаталога в соответствии с реализуемой функцией. В подкаталоге Add/Sub находится образец описания сумматора/вычитающего устройства.

Simple Adder/Subtrator представляет собой шаблон описания элемента, выполняющего функции сложения и вычитания двух операндов:

process (<input1>, <input2>)
begin
if <add_sub> = ‘1’ then
<addsub_output> <= <input1> + <input2>;
else
<addsub_output> <= <input1> - <input2>;
end if;
end process;

После включения приведенного кода в состав формируемого VHDL-описания нужно вместо input1 и input2 указать идентификаторы сигналов (шин), определяющих значения первого и второго операндов соответственно, а вместо addsub_output — идентификатор выходной шины данных, на которой отображается результат выполнения операции. Затем необходимо заменить add_sub идентификатором сигнала выбора реализуемой операции.

В подкаталоге Adder каталога Arithmetic собраны образцы конструкций, предназначенных для подготовки синтезируемых описаний различных вариантов сумматоров.

Adder with Carry In является шаблоном описания элемента, выполняющего операцию сложения двух операндов с учетом входного переноса:

<output> <= <input1> + <input2> + <one_bit_carry_in>;

При практическом использовании этого выражения нужно заменить output идентификатором шины, которая представляет результат выполнения операции суммирования, а one_bit_carry_in — идентификатором сигнала входного переноса.

Adder with Carry Out включает в себя образец описания сумматора с возможностью использования сигнала выходного переноса:

<temp_value> <= <input1> + <input2>;
<output_sum> <= <temp_value>((<adder_width>-1) downto 0);
<carry_out> <= <temp_value>(<adder_width>);

При создании законченного описания сумматора на основе представленной конструкции необходимо, кроме действий, указанных при рассмотрении предыдущего шаблона, вместо temp_value вставить идентификатор внутренней шины данных, представляющей полное значение суммы входных операндов, а вместо output_sum — идентификатор выходной шины данных, на которой отображается результат выполнения операции сложения в виде двоичного кода с разрядностью, указываемой вместо adder_width. Кроме того, следует заменить carry_out идентификатором сигнала выходного переноса.

Adder/Example Code содержит пример законченного описания 8-разрядного сумматора:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--
entity adders_1 is
port(A,B : in std_logic_vector(7 downto 0);
SUM : out std_logic_vector(7 downto 0));
end adders_1;
--
architecture archi of adders_1 is
begin
--
SUM <= A + B;
--
end archi;

Система условных обозначений, используемых в описании интерфейса сумматора, формируемого с помощью представленного шаблона, включает в себя следующие идентификаторы входных и выходных портов:

  • A — входная 8-разрядная шина данных, совокупность сигналов которой определяет значение первого слагаемого;
  • B — входная 8-разрядная шина данных, совокупность сигналов которой определяет значение второго слагаемого;
  • SUM — выходная 8-разрядная шина данных, представляющая значение суммы.

На рис. 538 изображен условный графический образ сумматора, создаваемого на основе шаблона Adder/Example Code.

Jбраз сумматора, создаваемого на основе шаблона Adder/Example Code

Рис. 538. Условный графический образ сумматора, создаваемого на основе шаблона Adder/Example Code

Simple Adder демонстрирует шаблон описания простейшего сумматора:

<output> <= <input1> + <input2>;

Подкаталог Multipliers каталога Arithmetic объединяет образцы конструкций, применяемых для формирования синтезируемых описаний различных умножителей.

Synchronous Multiplier предоставляет шаблон описания синхронного умножителя:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
<output> <= <input1> * <input2>;
end if;
end process;

Asynchronous Multiplier является образцом описания асинхронного умножителя:

<output> <= <input1> * <input2>;

Multipliers/Example Code включает в себя пример законченного описания асинхронного умножителя, вычисляющего произведение 8-разрядного и 4-разрядного сомножителей:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--
entity multipliers_1 is
port(A : in std_logic_vector(7 downto 0);
B : in std_logic_vector(3 downto 0);
RES : out std_logic_vector(11 downto 0));
end multipliers_1;
--
architecture beh of multipliers_1 is
begin
RES <= A * B;
end beh;

В состав системы условных обозначений, используемых в описании интерфейса асинхронного умножителя, создаваемого с помощью представленного шаблона, входят следующие идентификаторы входных и выходных портов:

  • A — входная 8-разрядная шина данных, совокупность сигналов которой определяет значение первого сомножителя;
  • B — входная 4-разрядная шина данных, совокупность сигналов которой определяет значение второго сомножителя;
  • RES — выходная 12-разрядная шина данных, представляющая значение произведения.

На рис. 539 показан условный графический образ умножителя, формируемого с помощью шаблона Multipliers/Example Code.

Oбраз умножителя, формируемого с помощью шаблона Multipliers/Example Code

Рис. 539. Условный графический образ умножителя, формируемого с помощью шаблона Multipliers/Example Code

В подкаталоге Subtrator каталога Arithmetic размещены шаблоны конструкций, предназначенных для подготовки описаний вычитающих устройств.

Subtrator/Example Code содержит пример законченного описания 8-разрядного вычитающего устройства, условный графический образ которого представлен на рис. 540:

Oбраз вычитающего устройства, создаваемого с помощью шаблона Subtrator/Example Code

Рис. 540. Условный графический образ вычитающего устройства, создаваемого с помощью шаблона Subtrator/Example Code
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--
entity adders_1 is
port(A,B : in std_logic_vector(7 downto 0);
RES : out std_logic_vector(7 downto 0));
end adders_1;
--
architecture archi of adders_1 is
begin
--
RES <= A - B;
--
end archi;

Simple Subtrator демонстрирует образец описания простейшего вычитающего устройства:

<output> <= <input1> - <input2>;

Подкаталог Comparators объединяет шаблоны конструкций, которые предназначены для формирования синтезируемых описаний цифровых компараторов различного типа. Развернутая структура этого подкаталога показана на рис. 541.

Структура подкаталогов Comparators и Counters

Рис. 541. Структура подкаталогов Comparators и Counters папки Coding Examples

Comparators/Equal представляет собой образец описания компаратора, определяющего равенство входных операндов:

process(<clock>)
begin
if (<clock>’event and <clock> =’1’) then
if ( <input1> = <input2> ) then
<output> <= ‘1’;
else
<output> <= ‘0’;
end if;
end if;
end process;

Comparators/Example Code является примером законченного описания 8-разрядного компаратора, который формирует высокий уровень сигнала на выходе CMP, если значение кода на первой входной шине данных (A) больше или равно значению кода на второй входной шине данных (B):

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--
entity comparator_1 is
port(A,B : in std_logic_vector(7 downto 0);
CMP : out std_logic);
end comparator_1;
--
architecture archi of comparator_1 is
begin
--
CMP <= ‘1’ when A >= B else ‘0’;
--
end archi;

Условный графический образ компаратора, создаваемого с помощью приведенного шаблона, изображен на рис. 542.

Oбраз компаратора, создаваемого с помощью шаблона Comparators/Example Code

Рис. 542. Условный графический образ компаратора, создаваемого с помощью шаблона Comparators/Example Code

Comparators/Greater-Than включает в себя шаблон описания компаратора, вырабатывающего активный уровень сигнала на выходе, когда значение первого операнда превосходит значение второго операнда:

process(<clock>)
begin
if (<clock>’event and <clock> =’1’) then
if ( <input1> > <input2> ) then
<output> <= ‘1’;
else
<output> <= ‘0’;
end if;
end if;
end process;

Comparators/Greater-Than or Equal содержит образец описания цифровой схемы сравнения, формирующей активный уровень сигнала на выходе в том случае, если значение второго операнда не превышает значения первого операнда:

process(<clock>)
begin
if (<clock>’event and <clock> =’1’) then
if ( <input1> >= <input2> ) then
<output> <= ‘1’;
else
<output> <= ‘0’;
end if;
end if;
end process;

Comparators/Less-Than демонстрирует шаблон описания компаратора, который вырабатывает активный уровень выходного сигнала, когда значение первого операнда меньше значения второго операнда:

process(<clock>)
begin
if (<clock>’event and <clock> =’1’) then
if ( <input1> < <input2> ) then
<output> <= ‘1’;
else
<output> <= ‘0’;
end if;
end if;
end process;

Comparators/Less-Than or Equal предоставляет образец описания цифровой схемы сравнения, формирующей активный уровень сигнала в том случае, если значение первого операнда не превосходит значения второго операнда:

process(<clock>)
begin
if (<clock>’event and <clock> =’1’) then
if ( <input1> <= <input2> ) then
<output> <= ‘1’;
else
<output> <= ‘0’;
end if;
end if;
end process;

Comparators/Not Equal является шаблоном описания компаратора, фиксирующего несовпадение значений входных операндов:

process(<clock>)
begin
if (<clock>’event and <clock> =’1’) then
if ( <input1> /= <input2> ) then
<output> <= ‘1’;
else
<output> <= ‘0’;
end if;
end if;
end process;

В подкаталоге Counters находятся образцы конструкций, используемых при подготовке синтезируемых описаний счетчиков различных типов. В состав структуры этого подкаталога входят три подкаталога следующего уровня, каждый из которых соответствует определенному типу счетчиков. В подкаталоге Binary собраны шаблоны, предназначенные для формирования описаний двоичных счетчиков, которые распределены в три папки — Down Counters, Up Counters и Up/Down Counters. В папке Down Counters расположены образцы конструкций, применяемых при создании описаний элементов, осуществляющих счет на уменьшение.

Down Counters/w CE включает в себя шаблон описания двоичного декрементного счетчика с разрешением счета:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<count> <= <count> - 1;
end if;
end if;
end process;

При практическом использовании этой конструкции нужно заменить clock идентификатором тактового сигнала, clock_enable — идентификатором сигнала разрешения счета, а count — условным обозначением двунаправленной шины, на которой отображается состояние соответствующих разрядов счетчика.

Down Counters/w CE and Async Active High Reset содержит образец описания двоичного декрементного счетчика с разрешением счета и асинхронным сбросом, выполняемым при высоком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<count> <= <count> - 1;
end if;
end if;
end process;

Down Counters/w CE and Async Active Low Reset демонстрирует шаблон описания двоичного декрементного счетчика с разрешением счета и асинхронным сбросом, осуществляемым при низком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<count> <= <count> - 1;
end if;
end if;
end process;

Down Counters/w CE and Sync Active High Reset представляет собой образец описания двоичного декрементного счетчика с разрешением счета и синхронным сбросом, выполняемым при высоком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
<count> <= <count> - 1;
end if;
end if;
end process;

Down Counters/w CE and Sync Active Low Reset является шаблоном описания двоичного декрементного счетчика с разрешением счета и синхронным сбросом, осуществляемым при низком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
<count> <= <count> - 1;
end if;
end if;
end process;

Down Counters/w Load, CE and Async Active High Reset включает в себя образец описания двоичного декрементного счетчика с разрешением счета, параллельной загрузкой и асинхронным сбросом, выполняемым при высоком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> - 1;
end if;
end if;
end if;
end process;

После включения этой конструкции в состав создаваемого модуля VHDL-описания кроме действий, перечисленных выше при рассмотрении предыдущих шаблонов, следует вместо load_enable указать идентификатор сигнала разрешения загрузки, а вместо input — идентификатор входной шины, на которую подается записываемое значение.

Down Counters/w Load, CE and Async Active Low Reset содержит шаблон описания двоичного декрементного счетчика с разрешением счета, параллельной загрузкой и асинхронным сбросом, осуществляемым при низком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> - 1;
end if;
end if;
end if;
end process;

Down Counters/w Load, CE and Sync Active High Reset демонстрирует образец описания двоичного декрементного счетчика с разрешением счета, параллельной загрузкой и синхронным сбросом, выполняемым при высоком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> - 1;
end if;
end if;
end if;
end process;

Down Counters/w Load, CE and Sync Active Low Reset предоставляет шаблон описания двоичного декрементного счетчика с разрешением счета, параллельной загрузкой и синхронным сбросом, осуществляемым при низком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> - 1;
end if;
end if;
end if;
end process;

Down Counters/Simple Counter является образцом описания простейшего двоичного декрементного счетчика:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
<count> <= <count> - 1;
end if;
end process;

В папке Up Counters находятся шаблоны конструкций, предназначенных для подготовки описаний элементов, выполняющих счет на увеличение.

Up Counters/w CE включает в себя образец описания двоичного инкрементного счетчика со входом разрешения счета:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<count> <= <count> + 1;
end if;
end if;
end process;

Up Counters/w CE and Async Active High Reset содержит шаблон описания двоичного инкрементного счетчика с разрешением счета и асинхронным сбросом, выполняемым при высоком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<count> <= <count> + 1;
end if;
end if;
end process;

Up Counters/w CE and Async Active Low Reset демонстрирует образец описания двоичного инкрементного счетчика с разрешением счета и асинхронным сбросом, осуществляемым при низком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
<count> <= <count> + 1;
end if;
end if;
end process;

Up Counters/w CE and Sync Active High Reset представляет собой шаблон описания двоичного инкрементного счетчика с разрешением счета и синхронным сбросом, выполняемым при высоком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
<count> <= <count> + 1;
end if;
end if;
end process;

Up Counters/w CE and Sync Active Low Reset является образцом описания двоичного инкрементного счетчика с разрешением счета и синхронным сбросом, осуществляемым при низком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
<count> <= <count> + 1;
end if;
end if;
end process;

Up Counters/w Load, CE and Async Active High Reset включает в себя шаблон описания двоичного инкрементного счетчика с разрешением счета, параллельной загрузкой и асинхронным сбросом, выполняемым при высоком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> + 1;
end if;
end if;
end if;
end process;

Up Counters/w Load, CE and Async Active Low Reset содержит образец описания двоичного инкрементного счетчика с разрешением счета, параллельной загрузкой и асинхронным сбросом, осуществляемым при низком уровне сигнала сброса:

-- Usage of Asynchronous resets may negatively impact FPGA resources
-- and timing. In general faster and smaller FPGA designs will
-- result from not using Asynchronous Resets. Please refer to
-- the Synthesis and Simulation Design Guide for more information.
process (<clock>, <reset>)
begin
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock>=’1’ and <clock>’event then
if <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> + 1;
end if;
end if;
end if;
end process;

Up Counters/w Load, CE and Sync Active High Reset демонстрирует шаблон описания двоичного инкрементного счетчика с разрешением счета, параллельной загрузкой и синхронным сбросом, выполняемым при высоком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’1’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> + 1;
end if;
end if;
end if;
end process;

Up Counters/w Load, CE and Sync Active Low Reset предоставляет образец описания двоичного инкрементного счетчика с разрешением счета, параллельной загрузкой и синхронным сбросом, осуществляемым при низком уровне сигнала сброса:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
if <reset>=’0’ then
<count> <= (others => ‘0’);
elsif <clock_enable>=’1’ then
if <load_enable>=’1’ then
<count> <= <input>;
else
<count> <= <count> + 1;
end if;
end if;
end if;
end process;

Up Counters/Simple Counter является шаблоном описания простейшего двоичного инкрементного счетчика:

process (<clock>)
begin
if <clock>=’1’ and <clock>’event then
<count> <= <count> + 1;
end if;
end process;

Примечание. Полный список литературы смотрите в предыдущих частях статьи.

Продолжение следует

Другие статьи по данной теме:

Сообщить об ошибке