В этом примере показано, как выполнить оптимизацию области уровня проекта в 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
Чтобы выполнить преобразование фиксированной точки, вам нужен 'fixpt' объект конфигурации.
Создайте 'fixpt' объект конфигурации и задайте свое имя испытательного стенда:
close all; fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'mlhdlc_csd_tb';
Чтобы сгенерировать код, необходимо создать 'hdl' объект конфигурации и определить имя испытательного стенда:
hdlcfg = coder.config('hdl'); hdlcfg.TestBenchName = 'mlhdlc_csd_tb';
hdlcfg.ConstantMultiplierOptimization = 'None';
Включите, 'Разворачивают Циклы' опция, чтобы встроить константы множителя.
hdlcfg.LoopOptimization = 'UnrollLoops'; codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_csd
Исследуйте сгенерированный код.
Смотрите на отчет ресурса для сумматора и использования множителя без оптимизации CSD.
hdlcfg.ConstantMultiplierOptimization = 'CSD';
Включите, 'Разворачивают Циклы' опция, чтобы встроить константы множителя.
hdlcfg.LoopOptimization = 'UnrollLoops'; codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_csd
Исследуйте сгенерированный код.
Исследуйте код с комментариями, которые обрисовывают в общих чертах кодирование CSD для всех постоянных множителей.
Посмотрите на отчет ресурса и заметьте, что с оптимизацией CSD, количество множителей сокращено к нулю, и множители заменяются сдвигами и сумматорами.
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');