exponenta event banner

Оптимизация постоянного множителя для уменьшения площади

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

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

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

$X_{10} = \sum_{r=0}^{B-1} x_r \cdot 2^r$

где

$x_r = 0, 1, -1 (\overline{1})$

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

$X_{10} = 64 + 16 + 13 = 01011101$

$X_{10} = 128 - 32 - 2 - 1 = 10\overline{1}000\overline{1}\overline{1}$

Обратите внимание, что представление цифры со знаком не является уникальным. Представление канонической цифры со знаком (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

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

В традиционном внедрении УОК количество 1373 представлен как:

1373 = 0101'01'01'001'01

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

В реализации CSD кодера HDL номер 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, используемый в этом примере, реализует простой фильтр FIR. В примере также показан испытательный стенд 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 для всех постоянных множителей. В этом конкретном примере сгенерированный код идентичен с точки зрения ресурсов области для констант множителя. Однако взгляните на факторизации констант в сгенерированном коде.

При выборе опции «Авто» кодер HDL автоматически выбирает для наилучшего результата опции 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');