Этот пример показывает, как выполнить оптимизацию площади уровня проектирования в HDL- Coder™ путем преобразования постоянных умножителей в сдвиги и добавляет с использованием методов канонической цифры со знаком (CSD). Представление CSD констант умножения, например, в коэффициентах усиления или коэффициентах фильтрации) значительно уменьшает площадь аппаратной реализации.
Представление со знаком (SD) является дополненным двоичным представлением с весами 0,1 и -1. -1 представлен в коде, сгенерированном HDL Coder, как 1 '.
где
Например, вот пара представлений со знаком для 93:
Обратите внимание, что представление цифр со знаком не является уникальным. Представление канонической цифры со знаком (CSD) является представлением SD с минимальным количеством ненулевых элементов.
Вот некоторые свойства номеров CSD:
Нет два последовательных бит в номере CSD, ненулевых
В представлении 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
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
вычитатель, который показывает, что сумматоры предпочтительны вычитателям.
Комбинация факторизации и представления 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
В этой таблице показаны затраты (C) всех 8-битных умножителей.
Код MATLAB, используемый в этом примере, реализует простой конечная импульсная характеристика. Пример также показывает испытательный стенд MATLAB, который упражняет фильтр.
design_name = 'mlhdlc_csd'; testbench_name = 'mlhdlc_csd_tb';
Проект: mlhdlc_csd
Испытательный стенд: 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 'fixpt'.
Создайте объект config 'fixpt' и укажите имя испытательного стенда:
close all; fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'mlhdlc_csd_tb';
Чтобы сгенерировать код, необходимо создать объект 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.
hdlcfg.ConstantMultiplierOptimization = 'CSD';
Включите опцию 'Unroll Loops' для встроенного умножения констант.
hdlcfg.LoopOptimization = 'UnrollLoops'; codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_csd
Исследуйте сгенерированный код.
Исследуйте код с комментариями, которые очерчивают кодировку CSD для всех постоянных умножителей.
Посмотрите на отчет о ресурсе и заметьте, что при оптимизации CSD количество умножителей уменьшается до нуля и умножители заменяются сдвигами и сумматорами.
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');