exponenta event banner

Преобразование с плавающей запятой в фиксированную

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

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

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

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

Рабочий процесс с плавающей запятой и фиксированной запятой в настоящее время интегрирован в помощник по рабочим процессам HDL, как описано в разделе Начало работы с потоком операций MATLAB-HDL.

Введение

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

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

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

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

  4. Проверьте созданную конструкцию с фиксированной точкой.

  5. Сравните численную точность сгенерированного кода с фиксированной запятой с исходным кодом с плавающей запятой.

Проектирование MATLAB

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

design_name = 'mlhdlc_df2t_filter';
testbench_name = 'mlhdlc_df2t_filter_tb';

Проверьте конструкцию MATLAB.

type(design_name);
%#codegen
function y = mlhdlc_df2t_filter(x)

%   Copyright 2011-2015 The MathWorks, Inc.

persistent z;
if isempty(z)
    % Filter states as a column vector
    z = zeros(2,1);
end

% Filter coefficients as constants
b = [0.29290771484375   0.585784912109375  0.292907714843750];
a = [1.0                0.0                0.171600341796875];

y    =  b(1)*x + z(1);
z(1) = (b(2)*x + z(2)) - a(2) * y;
z(2) =  b(3)*x - a(3) * y;

end

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

Дополнительные сведения о требованиях к проектированию с плавающей запятой и тестовым инструментам см. в разделе Структура структуры конструирования с плавающей запятой раздела Работа с сгенерированными файлами с фиксированной запятой.

type(testbench_name);

%

%   Copyright 2011-2015 The MathWorks, Inc.


Fs = 256;              % Sampling frequency
Ts = 1/Fs;             % Sample time
t = 0:Ts:1-Ts;         % Time vector from 0 to 1 second
f1 = Fs/2;             % Target frequency of chirp set to Nyquist
in = sin(pi*f1*t.^2);  % Linear chirp from 0 to Fs/2 Hz in 1 second
out = zeros(size(in)); % Output the same size as the input

for ii=1:length(in)
    out(ii) = mlhdlc_df2t_filter(in(ii));
end

% Plot
figure('Name', [mfilename, '_plot']);
subplot(2,1,1);
plot(in);
xlabel('Time')
ylabel('Amplitude')
title('Input Signal (with Noise)')

subplot(2,1,2);
plot(out);
xlabel('Time')
ylabel('Amplitude')
title('Output Signal (filtered)')

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

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

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

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

Создание нового проекта кодера HDL

Для создания нового проекта введите следующую команду:

coder -hdlcoder -new flt2fix_project

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

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

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

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

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

  • Предлагать типы фиксированных точек на основе данных моделирования и параметров длины слов

  • Разрешить пользователю вручную корректировать предлагаемые типы фиксированных точек

  • Проверка предлагаемых типов фиксированных точек

  • Убедитесь, что сгенерированный код MATLAB с фиксированной точкой имеет требуемую числовую точность

Шаг 1: Запуск помощника по рабочим процессам

  1. Нажмите кнопку «Помощник по рабочим процессам», чтобы запустить помощник по рабочим процессам HDL.

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

Шаг 2: Определение типов ввода

На этом шаге можно определить типы ввода вручную или путем указания и запуска средства тестирования.

  1. Для выполнения этого шага нажмите кнопку «Выполнить».

После моделирования обратите внимание, что входная переменная «» x «» определена как скалярная двойная «» double (1x1)

Шаг 3: Запустить моделирование

  1. Щелкните на шаге «Преобразование фиксированных точек».

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

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

  1. Нажмите кнопку «Анализ».

Обратите внимание, что таблицы «Sim Min» и «Sim Max» теперь заполнены диапазонами моделирования. Типы с фиксированной точкой предлагаются на основе настроек длины слова по умолчанию.

На этом этапе на основе вычисленных диапазонов моделирования для всех переменных можно вычислить:

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

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

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

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

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

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

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

Можно также включить опцию «Log histogram data» в меню кнопки «Analyze», чтобы включить регистрацию данных гистограммы.

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

Шаг 4: Проверка типов

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

  1. Нажмите кнопку «Validate Types» (проверить типы).

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

Шаг 5: Номера тестов

  1. Нажмите кнопку «Test Numerics».

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

Если включить опцию «Log all inputs and outputs for comparison plots» на панели «Test Numerics», то для каждого скалярного выхода будет создан дополнительный график, показывающий результаты с плавающей и фиксированной точками, а также разницу между ними. Для нескалярных выходов отображается только информация об ошибках.

Шаг 6: Выполнить итерацию результатов

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

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

Очистка созданных файлов

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

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