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

В этом примере показано, как достичь желаемой числовой точности при преобразовании кода 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 Coder см. в разделе «Начало работы с MATLAB в HDL».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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