В этом примере показано, как начать с проекта с плавающей точкой в MATLAB, итерационно сходиться по эффективному проекту с фиксированной точкой в MATLAB и проверить числовую точность сгенерированного проекта с фиксированной точкой.
Приложения обработки сигналов для реконфигурируемых платформ требуют алгоритмов, которые обычно задаются с помощью операций с плавающей точкой. Однако по причинам степени, стоимости и эффективности они обычно реализуются с операциями с фиксированной точкой либо в программном обеспечении для ядер DSP, либо в качестве специального оборудования в FPGA. Преобразование с фиксированной точкой может быть очень сложным и длительным, обычно требующим от 25 до 50 процентов от общего времени проекта и реализации. Автоматизированные инструменты могут упростить и ускорить процесс преобразования.
Для реализаций программного обеспечения цель состоит в том, чтобы задать оптимизированную спецификацию с фиксированной точкой, которая минимизирует размер кода и время выполнения для заданного ограничения точности расчетов. Эта оптимизация достигается путем изменения двоичного местоположения точки (для масштабирования) и выбора размера слова данных в соответствии с различными типами данных, поддерживаемыми целевым процессором.
Для аппаратных реализаций можно оптимизировать полную архитектуру. Эффективная реализация сведет к минимуму как используемую область, так и потребление степени. Таким образом, цель процесса преобразования обычно фокусируется вокруг минимизации размера слова оператора.
Рабочий процесс с плавающей точкой и фиксированной точкой в настоящее время интегрирован в HDL Workflow Advisor, как описано в разделе Начало работы с MATLAB в HDL.
Рабочий процесс преобразования из плавающей запятой в фиксированную запятую в HDL- Coder™ включает следующие шаги:
Проверьте, что проект с плавающей точкой совместим с генерацией кода.
Вычислите фиксированные точки на основе симуляции теста.
Сгенерируйте считываемый и отслеживаемый код 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 Coder см. в разделе «Начало работы с MATLAB в HDL».
Рабочий процесс преобразования из плавающей запятой в фиксированную запятую позволяет вам:
Проверьте, что проект с плавающей точкой совместим с генерацией кода
Предложите фиксированные точки на основе данных моделирования и настроек размера слова
Разрешить пользователю вручную настроить предлагаемые фиксированные точки
Проверьте предлагаемые фиксированные точки
Проверьте, что сгенерированный код MATLAB с фиксированной точностью имеет желаемую числовую точность
Нажмите кнопку Workflow Advisor, чтобы запустить HDL Workflow Advisor.
Выберите 'Преобразовать в фиксированную точку во время сборки' для опции 'Преобразование с фиксированной точкой'.
На этом шаге можно задать типы входа вручную или путем определения и выполнения теста.
Нажмите 'Run', чтобы выполнить этот шаг.
После заметки симуляции, что входная переменная 'x' задана как скалярный двойной 'double (1x1)'
Щелкните на шаге 'Fixed-Point Conversion'.
Проект компилируется с входными типами, определенными на предыдущем шаге, и после успешного компиляции в таблице переменных показаны предполагаемые типы для всех функций в проекте.
На этом этапе исходная конструкция инструментируется так, чтобы минимальное и максимальное значения для всех переменных в проекте были собраны во время симуляции.
Нажмите кнопку 'Analyze'.
Заметьте, что таблицы 'Sim Min' и 'Sim Max' теперь заполнены областями значений симуляции. Фиксированные точки предлагаются на основе настроек размера слова по умолчанию.
На данном этапе, основываясь на вычисленных областях значений симуляции для всех переменных, можно вычислить:
Длины дробей для заданной настройки фиксированного размера слова, или
Размеры слова для заданного значения фиксированной длины дроби.
Таблица типов содержит следующую информацию для каждой переменной, существующей в проекте MATLAB с плавающей точкой, организованной по функциям:
Sim Min: Минимальное значение, присвоенное переменной во время симуляции.
Sim Max: Максимальное значение, присвоенное переменной во время симуляции.
Целое число: Все ли значения, назначенные во время симуляции, являются целыми числами.
Шаг предложения типа использует вышеуказанную информацию и объединяет ее с пользовательскими настройками размера слова, чтобы предложить тип фиксированной точки для каждой переменной.
Можно также включить опцию 'Log histogram data' в меню кнопки 'Analyze', чтобы включить регистрацию данных гистограммы.
Представление гистограммы кратко предоставляет информацию о динамической области значений данных моделирования для переменной. Ось X соответствует весам битов, а ось Y представляет количество вхождений. Предлагаемая информация о числовом типе накладывается поверх этого графика и может редактироваться. Перемещение ограничивающего белого прямоугольника влево или вправо изменяет положение двоичной точки. Перемещение правых или левых краев соответственно изменяет длину дроби или словосочетание. Все изменения, внесенные в предлагаемый тип, сохраняются в проекте.
На этом этапе фиксированные точки из предыдущего шага используются, чтобы сгенерировать проект MATLAB с фиксированной точкой из исходной реализации с плавающей точкой.
Нажмите кнопку 'Validate Types'.
Сгенерированный код и другие программные продукты преобразования доступны через гиперссылки в выходе. Фиксированные точки явно показаны в сгенерированном коде MATLAB.
Нажмите кнопку 'Test Numerics'.
На этом этапе сгенерированный код с фиксированной точкой выполняется с использованием MATLAB Coder.
Если вы включите опцию 'Log all inputs and outputs for comparison plots' на панели 'Test Numerics', генерируется дополнительный график для каждого скалярного выхода, который показывает результаты с плавающей и фиксированной точками, а также различие между ними. Для некалярных выходов показана только информация об ошибке.
Если числовые результаты не соответствуют вашей желаемой точности после симуляции с фиксированной точкой, можно вернуться к шагу 'Propose Fixed-Point Types' в Рабочем процессе Advisor. Настройте настройки размера слова или индивидуально измените типы по мере необходимости и повторите оставшиеся шаги в рабочем процессе, пока вы не достигнете желаемых результатов.
Дополнительные сведения о том, как выполнить итерацию и уточнение цифр алгоритма в сгенерированном коде с фиксированной точкой, см. в разделе Преобразование и уточнение типа фиксированной точки.
Выполните следующие команды, чтобы очистить временную папку проекта.
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');