Преобразование и уточнение типа с фиксированной точкой

В этом примере показано, как достичь желаемой числовой точности при преобразовании кода MATLAB ® с фиксированной точкой в код с плавающей точкой с помощью HDL Workflow Advisor.

Введение

Рабочий процесс преобразования из плавающей запятой в фиксированную запятую в HDL- Coder™ включает следующие шаги:

  1. Проверьте совместимость проекта с плавающей точкой для генерации кода.

  2. Вычислите фиксированные точки на основе симуляции теста.

  3. Сгенерируйте считываемый и отслеживаемый код MATLAB ® с фиксированной точкой.

  4. Проверьте сгенерированный проект с фиксированной точкой.

Это руководство использует фильтр Калмана, подходящий для генерации HDL-кода, чтобы проиллюстрировать некоторые ключевые аспекты рабочего процесса преобразования с фиксированной точкой, в частности шаги 2 и 3 в приведенном выше списке.

MATLAB- Проекта

Код MATLAB, используемый в этом примере, реализует простой фильтр Калмана. Этот пример также содержит тестовый набор MATLAB, который выполняет фильтр.

Реализация фильтра Калмана, подходящая для генерации HDL-кода

design_name = 'mlhdlc_kalman_hdl';
testbench_name = 'mlhdlc_kalman_hdl_tb';

edit('mlhdlc_kalman_hdl')
edit('mlhdlc_kalman_hdl_tb')

Создайте новую папку и скопируйте соответствующие файлы

Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_flt2fix'];

% 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_kalman_hdl_tb
Running --------> mlhdlc_kalman_hdl_tb

Current plot held
Current plot released

Создайте новый HDL Coder проект

Чтобы создать новый проект, введите следующую команду:

  coder -hdlcoder -new flt2fix_project

Затем добавьте файл 'mlhdlc _ kalman _ hdl.m' к проекту в качестве функции MATLAB и 'mlhdlc _ kalman _ hdl _ tb.m' в качестве испытательного стенда MATLAB.

Более полное руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе «Начало работы с MATLAB в HDL».

Рабочий процесс генерации кода с фиксированной точкой

Перед переходом к шагу предложения по типу с фиксированной точкой выполните следующие задачи:

  1. Нажмите кнопку 'Workflow Advisor', чтобы запустить HDL Workflow Advisor.

  2. Выберите 'Преобразовать в фиксированную точку во время сборки' для опции 'Преобразование с фиксированной точкой'.

  3. Нажмите кнопку ' Запуск', чтобы определить типы входа для проекта из теста.

  4. Выберите шаг рабочего процесса 'Преобразование фиксированной точки'.

  5. Нажмите 'Analyze', чтобы выполнить инструментальную симуляцию с плавающей точкой.

Более полное руководство по этим шагам см. в разделе Преобразовании из плавающей запятой в фиксированную запятую.

Определите начальные типы фиксированных точек

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

На этом этапе преобразования предлагаются фиксированные точки для каждой переменной в проекте на основе зарегистрированных значений min/max переменных с плавающей точкой и пользовательского ввода.

На данной точке для всех переменных можно (повторно) вычислить и предложить:

  • Длины дробей для заданной настройки фиксированного размера слова, или

  • Размеры слова для заданного значения фиксированной длины дроби.

Выбор настройки размера слова

Когда вы начинаете с проекта с плавающей точкой и впервые проходите преобразование из плавающей запятой в фиксированную запятую, рекомендуется начать с определения параметра 'Default Word Length', основанного на наибольшей динамической области значений всех переменных в проекте.

В этом примере мы начинаем с размера слова по умолчанию 22 и запускаем шаг 'Propose Fixed-Point Types'.

Исследуйте предлагаемую таблицу типов с фиксированной точкой

Таблица типов содержит следующую информацию для каждой переменной, организованной по функциям, существующей в проекте MATLAB с плавающей точкой:

  • Sim Min: Минимальное значение, присвоенное переменной во время симуляции.

  • Sim Max: Максимальное значение, присвоенное переменной во время симуляции.

  • Целое число: Все ли значения, назначенные во время симуляции, являются целым числом.

Шаг предложения типа использует вышеуказанную информацию и объединяет ее с пользовательскими настройками размера слова, чтобы предложить тип фиксированной точки для каждой переменной.

Можно также использовать 'Compute Derived Range Analysis' для вычисления производных областей значений, и это подробно описано в этом примере «Преобразование типов фиксированных точек» и «Производные области значений».

Интерпретируйте предлагаемые числовые типы для переменных

На основе значений области значений симуляции (min & max) и настройки размера слова по умолчанию для каждой переменной предлагается числовой тип.

В следующей таблице показаны предложения числовых типов для 'Default размер слова' в 22 бита.

Исследуйте типы, предложенные в приведенной выше таблице, для переменных, измеренных в проекте верхнего уровня.

Область значений с плавающей точкой для переменной 'B':

  • Информация о симуляции: SimMin: 0, SimMax: 896.74.., Весь номер: Нет

  • Предлагаемый тип: численный тип (0,22,12) (Сигнальность: Unsigned, WordLength: 22, FractionLength: 12)

Значение с плавающей точкой области значений:

  • Имеет то же количество бит, что и 'Default размер слова'.

  • Использует минимальное количество бит, чтобы полностью представлять область значений.

  • Использует оставшиеся биты, чтобы представлять точность.

Целочисленная область значений для переменной 'A':

  • Информация о симуляции: SimMin: 0, SimMax: 1, Весь номер: Да

  • Предлагаемый тип: численный тип (0,1,0) (Сигнальность: Unsigned, WordLength: 1, FractionLength: 0)

Целочисленная область значений:

  • Имеет минимальное количество бит, чтобы представлять всюсь целочисленную область значений.

  • Не имеет дробных бит.

Вся информация в таблице является редактируемой, сохраняется между итерациями и сохраняется вместе с проектом генерации кода.

Сгенерируйте код с фиксированной точкой и проверьте сгенерированный код

Основываясь на числовых типах, предложенных для размера слова по умолчанию 22, продолжите шаги генерации кода с фиксированной точкой и верификации и наблюдайте графики.

  1. Щелкните 'Validate Types', чтобы применить вычисленные фиксированные точки.

  2. Затем выберите опцию 'Log inputs and outputs for comparison plots', а затем нажмите на 'Test Numerics', чтобы перезапустить testbench на коде с фиксированной точкой.

График слева генерируется из тестбенча во время симуляции кода с плавающей точкой, график справа генерируется при симуляции сгенерированного кода с фиксированной точкой. Заметьте, графики не совпадают.

Выбрав опцию графиков сравнения, вы увидите дополнительные графики, которые сравнивают результаты симуляции с плавающей и фиксированной точками для каждой выходной переменной.

Исследуйте график ошибок для каждой выходной переменной. Он очень высок для этого конкретного проекта.

Итерация результатов

Один из способов уменьшить ошибку - увеличить 'Default размер слова' и повторить преобразование с фиксированной точкой.

В этом примере проекту, когда размер слова 22 бита выбран, существует много ошибок усечения при представлении точности. Для уменьшения ошибок усечения справа от двоичной точки требуется больше бит.

Теперь давайте увеличим размер слова по умолчанию до 28 бит и повторим предложение типа и шаги валидации.

  1. Выберите значение 'Default размера слова' 28.

Изменение размера слова по умолчанию автоматически запускает шаг предложения типа, и новые фиксированные точки предлагаются на основе новой настройки размера слова. Кроме того, обратите внимание на необходимость повторной валидации типа и повторной проверки цифр.

  1. Нажмите на 'Validate Types'.

  2. Щелкните 'Test Numerics', чтобы перезапустить тестовый набор на коде с фиксированной точкой.

Когда эти шаги будут завершены, повторно исследуйте графики сравнения и заметьте, что ошибка теперь примерно на три порядка величины меньше.

Очистка сгенерированных файлов

Выполните следующие команды, чтобы очистить временную папку проекта.

  mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
  mlhdlc_temp_dir = [tempdir 'mlhdlc_flt2fix'];
  clear mex;
  cd (mlhdlc_demo_dir);
  rmdir(mlhdlc_temp_dir, 's');