Моделирование эффективных операций умножения и деления для целеустремленности FPGA

Эти инструкции иллюстрируют рекомендуемые настройки при использовании Divide и Product блоков в вашей модели для улучшения области и времени на целевом FPGA. Каждое руководство имеет уровень серьезности, который указывает на уровень податливостей. Для получения дополнительной информации см. HDL-руководства по моделированию уровней серьезности.

Разработка мультипликаторов и аддеров для эффективного отображения блоков DSP на FPGA

Идентификатор руководства

2.7.1

Серьезность

Очень рекомендуем

Описание

Алгоритмы цифровой обработки сигналов (DSP) используют несколько умножителей и аккумуляторов. Устройства FPGA, предоставляемые такими поставщиками, как Xilinx ® и Intel ®, содержат специальные срезы DSP. Эти небольшие срезы DSP размера, высокой скорости содержат несколько умножителей и аккумуляторов, которые делают устройства FPGA наиболее подходящими для приложений DSP.

Архитектура срезов DSP сильно варьируется у различных поставщиков FPGA и у различных семейств устройств, предоставляемых одним и тем же поставщиком. Чтобы сопоставить вашу модель Simulink ®, содержащую сумматоры, умножители и задержки с срезами DSP, адаптируйте вашу модель к архитектуре срезов DSP с учетом:

  • Расположение триггеров, сумматоров и умножителей в срезе DSP.

  • Настройки округления и насыщения.

  • Ширина битов сумматоров и умножителей. Для эффективного отображения используйте в модели битовые ширины, которые меньше или равны битовым ширинам модуля DSP.

Когда ширина битов в вашей модели становится больше, чем ширина битов DSP, ваш проект не помещается на один DSP. В этом случае требуется несколько DSP или дополнительная логика.

Можно сопоставить эти блоки в модели с блоками DSP на FPGA:

  • Сложение и суммирование

  • Задержка

  • Продукт

  • Умножение-Добавление

  • Умножение-Накопление

Этот рисунок иллюстрирует архитектуру Xilinx DSP. FPGA серии Xilinx 7 имеют специальные срезы DSP, которые используют эту архитектуру. Архитектура DSP состоит из входа регистров, предаддера, 25x18 умножителя, промежуточных регистров, постаддера и выхода регистра.

Для получения дополнительной информации см. DSP48E1 «Обзор срезов» в документации Xilinx.

Этот рисунок иллюстрирует архитектуру Intel DSP. Эта архитектура DSP для устройств Stratix ® V является архитектурой DSP переменной точности. Блоки DSP могут иметь ширины битов 9, 18, 27 и 36 бит и комплексное умножение 18x25 для БПФ.

Для получения дополнительной информации см. раздел «Архитектура блоков DSP» в документации Intel.

Чтобы узнать, как вы можете спроектировать свой алгоритм, чтобы сопоставить этот модуль DSP, откройте модель hdlcoder_multiplier_adder_dsp.slx

open_system('hdlcoder_multiplier_adder_dsp')
set_param('hdlcoder_multiplier_adder_dsp', 'SimulationCommand', 'Update')

Модель состоит из двух подсистем dsp_subsys1 и dsp_subsys2, которые реализуют операцию C + ((A + D) * B. Можно также реализовать эту операцию с помощью блоков Multiply-Add или Multiply-Accumulate, как показано подсистемами DSP_MultAdd и DSP_MultAcc.

dsp_subsys1 реализует операцию C + ((A + D) * B с помощью битовых ширин, которые равны DSP на FPGA серии Xilinx 7. Если вы открываете HDL Workflow Advisor и развертываете эту подсистему на Xilinx Virtex ® 7 FPGA, весь проект помещается в точности на одном срезе DSP.

dsp_subsys2 реализует ту же операцию с помощью битовых ширин, которые больше, чем DSP на Xilinx FPGA. Если вы развертываете эту подсистему на FPGA Xilinx Virtex 7, то видите, что весь проект помещается на один срез DSP и использует дополнительную логику срезов.

Установите ConstMultiplierOptimization HDL- Свойства в auto для Gain блока

Идентификатор руководства

2.7.2

Серьезность

Очень рекомендуем

Описание

Когда вы используете блок Gain в своем проекте, чтобы достичь наиболее эффективной по площади реализации, задайте свойство блока ConstMultiplierOptimization HDL равным auto. Генератор кода выбирает между CSD и FCSD реализации, которые дают наименьший размер схемы и генерируют HDL-код, не используя оператор умножения (*).

Вы можете использовать эту настройку, чтобы избежать целевого использования ресурсов DSP и уменьшить количество логических схем в Intel® Куарт® Прайм при синтезе вашего проекта на целевой FPGA. Для примера в этой таблице показан сгенерированный HDL-код для блока Gain в зависимости от настроек свойства HDL-блока для блока ConstMultiplierOptimization.

ConstMultiplierOptimization settings for Gain block for optimized area-efficient implementation.

Настройки ConstMultiplierOptimization и влияние на сгенерированный HDL-код

ConstMultiplierOptimization НастройкаОперацииСгенерированный HDL-код
CSD

Приводит входные данные параллельно и добавляет или вычитает результаты.

CSD implementation of Gain block.

Этот код показывает сгенерированный VHDL код.

-- CSD Encoding(231): 1001'01001'; Cost (Adders) = 3 
DOUT_mul_temp <= ((resize(DIN & '0' & '0' & '0' & '0' 
& '0' & '0' & '0' & '0', 21) - resize(DIN & '0' & '0'
& '0' & '0' & '0', 21)) + resize(DIN & '0' & '0' & 
'0', 21)) - resize(DIN, 21); 
DOUT <= DOUT_mul_temp(19 DOWNTO 0); 

Этот код показывает сгенерированный код Verilog.

// CSD Encoding (231) : 1001'01001'; Cost (Adders) = 3 
assign Gain_1 = {DIN[11], {DIN, 8'b00000000}}; 
assign Gain_2 = {{4{DIN[11]}}, {DIN, 5'b00000}}; 
assign Gain_3 = {{6{DIN[11]}}, {DIN, 3'b000}}; 
assign Gain_4 = {{9{DIN[11]}}, DIN}; 
assign DOUT_mul_temp = ((Gain_1 - Gain_2) + Gain_3) - Gain_4; 
assign DOUT = DOUT_mul_temp[19:0]; 

 
FCSD

Добавляет входные данные и их приведенные данные в каждом каскаде.

FCSD implementation of Gain block.

Этот код показывает сгенерированный VHDL код.

-- FCSD for 231 = 33 X 7; Total Cost = 2 
-- CSD Encoding (33) : 0100001; Cost (Adders) = 1 
Gain_factor <= resize(DIN & '0' & '0' & '0' & 
'0' & '0', 21) + resize(DIN, 21); 

-- CSD Encoding (7) : 1001'; Cost (Adders) = 1 
DOUT_mul_temp <= resize(Gain_factor & '0' & 
'0' & '0', 21) - Gain_factor; 
DOUT <= DOUT_mul_temp(19 DOWNTO 0);

Этот код показывает сгенерированный код Verilog.

// FCSD for 231 = 33 X 7; Total Cost = 2 
// CSD Encoding (33) : 0100001; Cost (Adders) = 1 
assign Gain_3 = {{4{DIN[11]}}, {DIN, 5'b00000}}; 
assign Gain_4 = {{9{DIN[11]}}, DIN}; 
assign Gain_factor = Gain_3 + Gain_4; 

// CSD Encoding (7) : 1001'; Cost (Adders) = 1 
assign Gain_1 = {Gain_factor, 3'b000}; 
assign Gain_2 = Gain_1[20:0]; 
assign DOUT_mul_temp = Gain_2 - Gain_factor; 
assign DOUT = DOUT_mul_temp[19:0];  

 
autoВыбирает CSD или реализацию FCSD, которая использует меньше аддеров.Сгенерированный HDL-код аналогичен реализации CSD или FCSD.
noneИспользует оператор умножения (*).

Этот код показывает сгенерированный VHDL код.

DOUT_mul_temp <= to_signed(2#011100111#, 9) * DIN; 
DOUT <= DOUT_mul_temp(19 DOWNTO 0); 

Этот код показывает сгенерированный код Verilog.

assign DOUT_mul_temp = 231 * DIN; 
assign DOUT = DOUT_mul_temp[19:0];  

Использование ShiftAdd Архитектура Divide блока для фиксированных точек

Идентификатор руководства

2.7.3

Серьезность

Рекомендуется

Описание

Когда вы используете типы данных с фиксированной точкой как входами к блоку Divide, задайте HDL- Архитектуры блока следующим ShiftAdd а затем установите для свойства Блоков UsePipelines значение on. В этой архитектуре блок вычисляет результат с помощью нескольких операций shift и add. Операции конвейеризованы, чтобы достичь более высоких тактовых частот на целевом устройстве FPGA.

Когда вы используете типы данных с плавающей точкой как входы для блока Divide, оставьте Архитектуру HDL до значения по умолчанию Linear и установите IP-библиотеку с плавающей точкой на Native Floating Point.

См. также

Функции

Блоки

Похожие темы