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

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

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

Представление цифры со знаком (SD) является увеличенным бинарным представлением с весами 0,1 и-1.-1 представлен в сгенерированном коде HDL Coder как 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

Реализация CSD HDL Coder

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

В традиционной реализации CSD, номер 1373 представлен как:

1373 = 0101'01'01'001'01

Эта реализация не имеет двух последовательных ненулевых цифр в представлении. Стоимостью этой реализации является 1 сумматор и 4 вычитающие устройства.

В реализации CSD HDL Coder, номер 1373 представлен как:

1373 = 00101011001'01

Эта реализация имеет две последовательных ненулевых цифры в представлении, но использует то же количество ненулевых цифр как предыдущая реализация CSD. Стоимостью этой реализации является 4 сумматоры и 1 вычитающее устройство, которое показывает, что сумматоры предпочтены вычитающим устройствам.

Множитель 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');