Преобразование фиксированной точки и выведенные области значений

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

Введение

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

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

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

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

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

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

Этот пример использует симметричный КИХ-фильтр, выходной сигнал которого интегрируется в зависимости от времени.

Проект MATLAB

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

design_name = 'mlhdlc_dti';
testbench_name = 'mlhdlc_dti_tb';
  1. Проект MATLAB: mlhdlc_dti

  2. Испытательный стенд MATLAB: mlhdlc_dti_tb

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

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

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

% 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_dti_tb

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

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

coder -hdlcoder -new flt2fix_project_dmm

Затем добавьте файл 'mlhdlc_dti.m' в проект как функция MATLAB и 'mlhdlc_dti_tb.m' как Испытательный стенд MATLAB.

Обратитесь к Началу работы с MATLAB к Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.

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

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

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

  2. Выберите 'Convert to fixed-point at build time' для 'Опции' преобразования Фиксированной точки.

  3. Нажмите кнопку 'Run' к входным define типам для проекта от испытательного стенда.

  4. Выберите шаг рабочего процесса 'Fixed-Point Conversion'.

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

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

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

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

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

Наблюдайте область значений симуляции переменной 'is_clipped' в функции 'mlhdlc_dti'. Вы заметите, что область значений симуляции этой переменной является постоянным значением 0. Однако, если можно наблюдать, что код видит, что переменная может принять значения от-1 до-1.

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

Ввод областей значений проекта и вычисление выведенных областей значений

На этом шаге можно указать диапазоны проекта и вычислить выведенные области значений через статический анализ. Включите выведенный анализ области значений путем нажатия на флажок 'analyze ranges using derived range analysis' в меню кнопки 'Analyze'. Инструмент затем предложит вам указать диапазоны проекта для входных переменных в Статический Min и Статические столбцы Max.

Существует несколько способов, которыми можно ввести области значений проекта.

  1. Можно вручную отредактировать 'Статический Min' и 'Статический Max' записи в таблице и указать диапазоны проекта.

  2. Можно скопировать Сима Мин и Сима Макса для переменной через щелчок правой кнопкой по ячейке таблицы (или)

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

Если все необходимые диапазоны проекта указаны, можно нажать на кнопку 'Analyze', чтобы использовать выведенный анализ области значений.

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

Недостаточные области значений проекта

Иногда указывание диапазонов для одних только входных переменных не может быть достаточным для определенных проектов. Например, в проекте MATLAB, реализующем счетчик с помощью персистентной переменной, область значений переменной зависит от числа раз, которым называется проект. В таких ситуациях вы будете видеть вычисленный, вывел статические области значений для переменной, о которой сообщают как-Inf или +Inf. Когда эти неточные области значений появятся, рассмотрите указывающие диапазоны для таких персистентных переменных.

Очистите Сгенерированные Файлы

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

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');