В этом примере показано, как выполнить оптимизацию области на уровне конструкции в Coder™ HDL путем преобразования постоянных множителей в сдвиги и добавления с использованием методов канонических цифр со знаком (CSD). Представление CSD постоянных множителей, например, в коэффициентах усиления или коэффициентах фильтра) значительно уменьшает область реализации аппаратных средств.
Представление со знаком цифры (SD) является дополненным двоичным представлением с весами 0,1 и -1. -1 представлен в генерируемом кодере HDL как 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 использует реализацию CSD, которая отличается от традиционной реализации CSD. Эта реализация предпочтительно выбирает сумматоры по сравнению с вычитателями при использовании представления со знаком цифры. В этом представлении иногда два последовательных бита в номере CSD могут быть ненулевыми. Однако аналогично реализации CSD реализация кодера HDL использует минимальное количество ненулевых цифр. Например:
В традиционном внедрении УОК количество 1373 представлен как:
1373 = 0101'01'01'001'01
Эта реализация не имеет двух последовательных ненулевых цифр в представлении. Стоимость этой реализации составляет 1 сумматор и 4 вычитатели.
В реализации CSD кодера HDL номер 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, используемый в этом примере, реализует простой фильтр FIR. В примере также показан испытательный стенд 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 для всех постоянных множителей. В этом конкретном примере сгенерированный код идентичен с точки зрения ресурсов области для констант множителя. Однако взгляните на факторизации констант в сгенерированном коде.
При выборе опции «Авто» кодер 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');