В этом примере показано, как начать с конструкции с плавающей запятой в MATLAB, итеративно сходиться на эффективной конструкции с фиксированной запятой в MATLAB и проверить численную точность созданной конструкции с фиксированной запятой.
Приложения обработки сигналов для реконфигурируемых платформ требуют алгоритмов, которые обычно задаются с использованием операций с плавающей запятой. Однако по причинам мощности, стоимости и производительности они обычно реализуются с операциями с фиксированной точкой либо в программном обеспечении для ядер DSP, либо в качестве специального аппаратного обеспечения в FPGA. Преобразование с фиксированной точкой может быть очень сложным и трудоемким, обычно требующим от 25 до 50 процентов от общего времени проектирования и внедрения. Автоматизированные инструменты позволяют упростить и ускорить процесс преобразования.
Для программных реализаций целью является определение оптимизированной спецификации с фиксированной точкой, которая минимизирует размер кода и время выполнения для данного ограничения точности вычислений. Эта оптимизация достигается посредством модификации местоположения двоичной точки (для масштабирования) и выбора длины слова данных в соответствии с различными типами данных, поддерживаемыми целевым процессором.
Для аппаратных реализаций полная архитектура может быть оптимизирована. Эффективная реализация сведет к минимуму как используемую площадь, так и энергопотребление. Таким образом, цель процесса преобразования обычно фокусируется вокруг минимизации длины слова оператора.
Рабочий процесс с плавающей запятой и фиксированной запятой в настоящее время интегрирован в помощник по рабочим процессам HDL, как описано в разделе Начало работы с потоком операций MATLAB-HDL.
Поток операций преобразования с плавающей запятой в фиксированную в Coder™ HDL включает в себя следующие шаги:
Убедитесь, что конструкция с плавающей запятой совместима с генерацией кода.
Вычислять типы фиксированных точек на основе моделирования testbench.
Создание считываемого и отслеживаемого кода 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

Для создания нового проекта введите следующую команду:
coder -hdlcoder -new flt2fix_project
Затем добавьте файл «mlhdlc _ filter.m» в проект в качестве функции MATLAB и «mlhdlc _ filter _ tb.m» в качестве тестового стенда MATLAB.
Более подробное руководство по созданию и заполнению проектов кодера MATLAB HDL см. в разделе Начало работы с MATLAB в Workflow-процессе HDL.
Рабочий процесс преобразования с плавающей запятой в фиксированную позволяет:
Убедитесь, что конструкция с плавающей запятой совместима с созданием кода
Предлагать типы фиксированных точек на основе данных моделирования и параметров длины слов
Разрешить пользователю вручную корректировать предлагаемые типы фиксированных точек
Проверка предлагаемых типов фиксированных точек
Убедитесь, что сгенерированный код MATLAB с фиксированной точкой имеет требуемую числовую точность
Нажмите кнопку «Помощник по рабочим процессам», чтобы запустить помощник по рабочим процессам HDL.
Выберите «Преобразовать в фиксированную точку во время построения» для параметра «Преобразование фиксированной точки».

На этом шаге можно определить типы ввода вручную или путем указания и запуска средства тестирования.
Для выполнения этого шага нажмите кнопку «Выполнить».
После моделирования обратите внимание, что входная переменная «» x «» определена как скалярная двойная «» double (1x1)
Щелкните на шаге «Преобразование фиксированных точек».
Конструкция компилируется с входными типами, определенными на предыдущем шаге, и после успешной компиляции таблица переменных отображает выводимые типы для всех функций конструкции.
На этом этапе первоначальная конструкция создается таким образом, чтобы минимальное и максимальное значения для всех переменных в конструкции собирались во время моделирования.

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

На этом этапе на основе вычисленных диапазонов моделирования для всех переменных можно вычислить:
Длины дробей для заданного параметра фиксированной длины слова или
Длины слов для заданного параметра фиксированной длины дроби.
Таблица типов содержит следующую информацию для каждой переменной, существующей в конструкции MATLAB с плавающей запятой, упорядоченной по функциям:
Sim Min: минимальное значение, назначенное переменной во время моделирования.
Sim Max: максимальное значение, назначенное переменной во время моделирования.
Целое число: являются ли все значения, назначенные во время моделирования целыми числами.
Шаг предложения типа использует вышеуказанную информацию и объединяет ее с заданными пользователем настройками длины слова, чтобы предложить тип с фиксированной точкой для каждой переменной.
Можно также включить опцию «Log histogram data» в меню кнопки «Analyze», чтобы включить регистрацию данных гистограммы.

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

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

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

Если численные результаты не соответствуют требуемой точности после моделирования с фиксированной точкой, можно вернуться к шагу «Предложить типы с фиксированной точкой» в консультанте по рабочим процессам. Откорректируйте настройки длины слова или измените типы по отдельности, как требуется, и повторите остальные шаги в рабочем процессе до достижения требуемых результатов.
Дополнительные сведения об итерации и уточнении чисел алгоритма в сгенерированном коде с фиксированной точкой см. в разделе Преобразование и уточнение типа фиксированной точки.
Выполните следующие команды для очистки временной папки проекта.
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');