Сгенерируйте совместимые с HDL замены функции интерполяционной таблицы с помощью 'coder.approximate'

Этот пример показывает генерацию кода MATLAB из проекта MATLAB® с плавающей точкой, который не готов к генерации кода. Мы используем функцию 'coder.approximate', чтобы сгенерировать основанную на интерполяционной таблице функцию MATLAB. Эта недавно сгенерированная функция готова к генерации HDL-кода (не показанный в этой демонстрации).

Введение

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

Проект MATLAB

design_name = 'mlhdlc_approximate_sigmoid';
testbench_name = 'mlhdlc_approximate_sigmoid_tb';

Позволяет взгляду на Проект Sqrt

dbtype(design_name)
1     function y = mlhdlc_approximate_sigmoid( x )
2     %
3     
4     %   Copyright 2014-2015 The MathWorks, Inc.
5     
6         y = 1./(1+exp(-x));
7     end

Симулируйте проект

Это всегда - хорошая практика, чтобы симулировать проект с испытательным стендом до генерации кода, чтобы убедиться, что нет никаких ошибок периода выполнения.

mlhdlc_approximate_sigmoid_tb

  1. Проект MATLAB: mlhdlc_approximate_sigmoid

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

Мы можем использовать coder.approximate, чтобы сгенерировать основанную на интерполяционной таблице заменяющую функцию для 'mlhdlc_approximate_sigmoid'

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

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

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

% 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, [design_name,'_design.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

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

repCfg = coder.approximation('Function','mlhdlc_approximate_sigmoid','CandidateFunction',@mlhdlc_approximate_sigmoid,...
                          'NumberOfPoints',50,'InputRange',[-10,10],'FunctionNamePrefix','repsig_');
coder.approximate(repCfg);

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

### Generating approximation for 'sigmoid' : repsiglookuptable.m
### Generating testbench for 'sigmoid' : repsiglookuptable_tb.m
### LookupTable replacement for function 'sigmoid' used 50 data points

Это должно сгенерировать файлы MATLAB 'repsig_lookuptable_tb', и 'repsig_lookuptable', содержащий испытательный стенд, и спроектировать соответственно.

Протестируйте заменяющие функции

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

repsig_lookuptable_tb();

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

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

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