В этом примере показано, как достичь требуемой числовой точности при преобразовании кода MATLAB ® с фиксированной запятой в код с плавающей запятой с помощью помощника по рабочим процессам HDL.
Поток операций преобразования с плавающей запятой в фиксированную в Coder™ HDL включает в себя следующие шаги:
Убедитесь, что конструкция с плавающей запятой совместима с созданием кода.
Вычислять типы фиксированных точек на основе моделирования testbench.
Создание читаемого и отслеживаемого кода MATLAB ® с фиксированной точкой.
Проверьте созданную конструкцию с фиксированной точкой.
В этом учебном пособии используется фильтр Калмана, подходящий для создания кода HDL, для иллюстрации некоторых ключевых аспектов процесса преобразования с фиксированной точкой, в частности шагов 2 и 3 из приведенного выше списка.
Код MATLAB, используемый в этом примере, реализует простой фильтр Калмана. В этом примере также содержится тестовое средство MATLAB, выполняющее фильтр.
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

Для создания нового проекта введите следующую команду:
coder -hdlcoder -new flt2fix_project
Затем добавьте файл «mlhdlc _ kalman _ hdl.m» в проект в качестве функции MATLAB и «mlhdlc _ kalman _ hdl _ tb.m» в качестве испытательного стенда MATLAB.
Для получения более полного руководства по созданию и заполнению проектов кодера MATLAB HDL см. раздел Начало работы с MATLAB в Workflow-процессе HDL.
Перед переходом к шагу предложения типа с фиксированной точкой выполните следующие задачи:
Нажмите кнопку «Помощник по рабочим процессам», чтобы запустить помощник по рабочим процессам HDL.
Выберите «Преобразовать в фиксированную точку во время построения» для параметра «Преобразование фиксированной точки».
Нажмите кнопку «Run» (Выполнить), чтобы определить типы входных данных для проекта из испытательного стенда.
Выберите шаг рабочего процесса «Преобразование фиксированных точек».
Нажмите кнопку «Анализ», чтобы выполнить инструментальное моделирование с плавающей запятой.
Дополнительные сведения об этих шагах см. в разделе Преобразование с плавающей точкой на фиксированную.
После того как инструментальное моделирование с плавающей запятой завершится, на основе результатов моделирования будет показано предложение типов фиксированных точек.
На этом этапе преобразования предлагаются типы с фиксированной запятой для каждой переменной в конструкции на основе записанных значений min/max переменных с плавающей запятой и пользовательского ввода.
На этом этапе для всех переменных можно (повторно) вычислить и предложить:
Длины дробей для заданного параметра фиксированной длины слова или
Длины слов для заданного параметра фиксированной длины дроби.
При запуске конструкции с плавающей запятой и первом переходе от плавающей точки к фиксированной точке рекомендуется сначала задать параметр «Длина слова по умолчанию» на основе наибольшего динамического диапазона всех переменных конструкции.
В этом примере мы начинаем с длины слова по умолчанию 22 и выполняем шаг «Предложить типы фиксированных точек».

Таблица типов содержит следующую информацию для каждой переменной, упорядоченной по функциям, существующим в конструкции MATLAB с плавающей запятой:
Sim Min: минимальное значение, назначенное переменной во время моделирования.
Sim Max: максимальное значение, назначенное переменной во время моделирования.
Целое число: являются ли все значения, назначенные во время моделирования, целыми.
Шаг предложения типа использует вышеуказанную информацию и объединяет ее с заданными пользователем настройками длины слова, чтобы предложить тип с фиксированной точкой для каждой переменной.
Для вычисления производных диапазонов можно также использовать «Вычислить анализ производных диапазонов», который подробно рассматривается в данном учебном пособии «Преобразование типов фиксированных точек» и «Производные диапазоны».
На основе значений диапазона моделирования (min & max) и значения длины слова по умолчанию для каждой переменной предлагается числовой тип.
В следующей таблице представлены предложения числового типа для «длины слова по умолчанию», равной 22 битам.

Изучите типы, предложенные в приведенной выше таблице для переменных, используемых в конструкции верхнего уровня.
Диапазон с плавающей запятой для переменной «B»:
Сведения о моделировании: SimMin: 0, SimMax: 896.74.., Целое число: нет
Предлагаемый тип: числовой тип (0,22,12) (Подпись: Без подписи, WordLength: 22, FracureLength: 12)
Диапазон с плавающей запятой:
Имеет то же количество битов, что и «Default word length».
Использует минимальное количество битов для полного представления диапазона.
Использует остальные биты для представления точности.
Целочисленный диапазон для переменной «A»:
Сведения о моделировании: SimMin: 0, SimMax: 1, Целое число: Да
Предлагаемый тип: числовой тип (0,1,0) (Подпись: Без подписи, WordLength: 1, FracureLength: 0)
Диапазон целых чисел:
Имеет минимальное количество битов для представления целого диапазона.
Не имеет дробных битов.
Вся информация в таблице доступна для редактирования, сохраняется в итерациях и сохраняется в проекте создания кода.
Основываясь на числовых типах, предлагаемых для длины слова по умолчанию 22, продолжайте генерирование кода с фиксированной точкой и этапы проверки и наблюдайте за графиками.
Нажмите кнопку «Validate Types» (Проверить типы), чтобы применить вычисленные типы с фиксированной точкой.
Затем выберите опцию «Log inputs and outputs for comparison plots», а затем нажмите кнопку «Test Numerics», чтобы повторно запустить тестовые инструменты для кода с фиксированной точкой.
График слева генерируется из testbench во время моделирования кода с плавающей запятой, а справа - из моделирования сгенерированного кода с фиксированной запятой. Обратите внимание, что графики не совпадают.

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

Одним из способов уменьшения ошибки является увеличение длины слова по умолчанию и повторение преобразования с фиксированной точкой.
В этом примере конструкции, когда выбирается длина слова 22 бита, при представлении точности возникает много ошибок усечения. Для уменьшения ошибок усечения справа от двоичной точки требуется больше битов.
Теперь увеличим длину слова по умолчанию до 28 бит и повторим предложение типа и шаги проверки.
Выберите значение «Длина слова по умолчанию», равное 28.
Изменение длины слова по умолчанию автоматически инициирует шаг предложения типа, и новые типы с фиксированной точкой предлагаются на основе новой настройки длины слова. Также обратите внимание на необходимость повторного запуска проверки типа и повторной проверки числовых значений.
Нажмите кнопку «Validate Types» (проверить типы).
Нажмите кнопку «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');