Постоянная оптимизация множителя, чтобы уменьшать область

Этот пример показывает, как выполнить оптимизацию области уровня проекта в HDL Coder путем преобразования постоянных множителей в сдвиги и добавляет методы канонической цифры со знаком (CSD) использования.

Введение

Этот пример показывает, как использование представления канонической цифры со знаком (CSD) констант множителя (например, в коэффициентах усиления или коэффициентах фильтра) может значительно уменьшать область аппаратной реализации.

Представление Канонической цифры со знаком (CSD)

Представление цифры со знаком (SD) является увеличенным бинарным представлением с весами 0,1 и-1.

где

Например, вот несколько представлений цифры со знаком для 93:

Обратите внимание на то, что представление цифры со знаком является групповым. Представление канонической цифры со знаком (CSD) является представлением SD с минимальным количеством ненулевых элементов.

Вот некоторые свойства чисел CSD:

  1. Никакие два последовательных бита в номере CSD не являются ненулевыми

  2. Представление CSD, как гарантируют, будет иметь минимальное количество ненулевых битов

  3. Представление CSD номера уникально

Множитель CSD

Давайте смотреть, как представление CSD может привести к реализации, требующей минимального количества сумматоров.

Давайте посмотрим на пример CSD:

y = 231 * x
  = (11100111) * x                    % 231 in binary form
  = (1001'01001') * x                 % 231 in signed digit form
  = (256 - 32 + 8 - 1) * x            %
  = (x << 8) - (x << 5) + (x << 3) -x % cost of CSD: 3 Adders

Множитель FCSD

Комбинация факторизации и представление CSD постоянного множителя могут привести к дальнейшему сокращению затрат на оборудование (количество сумматоров).

FCSD может далее сократить количество сумматоров в вышеупомянутом постоянном множителе:

y  = 231 * x
y  = (7 * 33) * x
y_tmp = (x << 5) + x
y  = (y_tmp << 3) - y_tmp          % cost of FCSD: 2 Adders

Затраты CSD/FCSD

Эта таблица показывает затраты (C) всех 8-битных множителей.

Проект MATLAB®

Код MATLAB, используемый в этом примере, реализует простой КИХ-фильтр. Пример также показывает испытательный стенд MATLAB, который осуществляет фильтр.

design_name = 'mlhdlc_csd';
testbench_name = 'mlhdlc_csd_tb';
  1. Проект: mlhdlc_csd

  2. Испытательный стенд: mlhdlc_csd_tb

Создайте новую папку и скопируйте соответствующие файлы

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

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_csd'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Моделируйте проект

Моделируйте проект с испытательным стендом до генерации кода, чтобы убедиться, что нет никаких ошибок периода выполнения.

mlhdlc_csd_tb

Создайте объект конфигурации преобразования фиксированной точки

Чтобы выполнить преобразование фиксированной точки, вам нужен 'fixpt' объект конфигурации.

Создайте 'fixpt' объект конфигурации и задайте свое имя испытательного стенда:

close all;
fixptcfg = coder.config('fixpt');
fixptcfg.TestBenchName = 'mlhdlc_csd_tb';

Создайте объект конфигурации генерации HDL-кода

Чтобы сгенерировать код, необходимо создать 'hdl' объект конфигурации и определить имя испытательного стенда:

hdlcfg = coder.config('hdl');
hdlcfg.TestBenchName = 'mlhdlc_csd_tb';

Сгенерируйте код без постоянной оптимизации множителя

hdlcfg.ConstantMultiplierOptimization = 'None';

Включите, 'Разворачивают Циклы' опция, чтобы встроить константы множителя.

hdlcfg.LoopOptimization = 'UnrollLoops';
codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_csd

Исследуйте сгенерированный код.

Смотрите на отчет ресурса для сумматора и использования множителя без оптимизации CSD.

Сгенерируйте код с оптимизацией CSD

hdlcfg.ConstantMultiplierOptimization = 'CSD';

Включите, 'Разворачивают Циклы' опция, чтобы встроить константы множителя.

hdlcfg.LoopOptimization = 'UnrollLoops';
codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_csd

Исследуйте сгенерированный код.

Исследуйте код с комментариями, которые обрисовывают в общих чертах кодирование CSD для всех постоянных множителей.

Посмотрите на отчет ресурса и заметьте, что с оптимизацией CSD, количество множителей сокращено к нулю, и множители заменяются сдвигами и сумматорами.

Сгенерируйте код с оптимизацией FCSD

hdlcfg.ConstantMultiplierOptimization = 'FCSD';

Включите, 'Разворачивают Циклы' опция, чтобы встроить константы множителя.

hdlcfg.LoopOptimization = 'UnrollLoops';
codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_csd

Исследуйте сгенерированный код.

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

Если вы выберете опцию 'Auto', HDL Coder автоматически выберет между CSD и опциями FCSD для лучшего результата.

Очистите Сгенерированные Файлы

Запустите следующие команды, чтобы очистить временную папку проекта.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_csd'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');