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

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

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

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

Код 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

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

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

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

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

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

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

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

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

hdlcfg.ConstantMultiplierOptimization = 'None';

Включите опцию 'Unroll Loops' для встроенного умножения констант.

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

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

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

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

hdlcfg.ConstantMultiplierOptimization = 'CSD';

Включите опцию 'Unroll Loops' для встроенного умножения констант.

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

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

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

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

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

hdlcfg.ConstantMultiplierOptimization = 'FCSD';

Включите опцию 'Unroll Loops' для встроенного умножения констант.

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');