В этом примере показано, как проверить, сгенерировать и проверить код HDL из кода MATLAB ®, который создает экземпляр не восстанавливаемого объекта системы с квадратным корнем.
Код MATLAB, используемый в этом примере, представляет собой не восстанавливающий механизм квадратного корня, подходящий для реализации в FPGA или ASIC. Механизм использует реализацию минимальной области без умножения, основанную на сверточном декодировании решения [1], реализованном как системный объект. В этом примере также показан испытательный стенд MATLAB, который тестирует двигатель.
design_name = 'mlhdlc_sysobj_nonrestsqrt.m'; testbench_name = 'mlhdlc_sysobj_nonrestsqrt_tb.m'; sysobj_name = 'mlhdlc_msysobj_nonrestsqrt.m';
Рассмотрим дизайн MATLAB.
type(design_name);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB design: Non-restoring Square Root
%
% Key Design pattern covered in this example:
% (1) Using a user-defined system object
% (2) The 'step' method can be called only per system object in a design iteration
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Q_o,Vld_o] = mlhdlc_sysobj_nonrestsqrt(D_i, Init_i)
% Copyright 2014-2015 The MathWorks, Inc.
persistent hSqrt;
if isempty(hSqrt)
hSqrt = mlhdlc_msysobj_nonrestsqrt();
end
[Q_o,Vld_o] = step(hSqrt, D_i,Init_i);
end
type(testbench_name);
% Nonrestoring Squareroot Testbench
% Copyright 2014-2015 The MathWorks, Inc.
% Generate some random data
rng('default'); % set the random number generator to a consistent state
nsamp = 100; %number of samples
nbits = 32; % fixed-point word length
nfrac = 31; % fixed-point fraction length
data_i = fi(rand(1,nsamp), numerictype(0,nbits,nfrac));
% clear any persistent variables in the HDL function
clear mlhdlc_sysobj_nonrestsqrt
% Determine the "golden" sqrt results
data_go = sqrt(data_i);
% Commands for the sqrt engine
LOAD_DATA = true;
CALC_DATA = false;
% Pre-allocate the result array
data_o = zeros(1,nsamp, 'like', data_go);
% Load in a sample, then iterate until the results are ready
cyc_cnt = 0;
for i = 1:nsamp
% Load the new sample into the sqrt engine
[~, vld] = mlhdlc_sysobj_nonrestsqrt(data_i(i),LOAD_DATA);
cyc_cnt = cyc_cnt + 1;
while(vld == false)
% Iterate until the result has been found
[data_o(i), vld] = mlhdlc_sysobj_nonrestsqrt(data_i(i),CALC_DATA);
cyc_cnt = cyc_cnt + 1;
end
end
% find the integer representation of the result data
idt = numerictype(0,ceil(nbits/2),0);
% find the error in terms of integer bits
ierr = abs(double(reinterpretcast(data_o,idt))-double(reinterpretcast(data_go,idt)));
% find the error in terms of real-world values
derr = abs(double(data_o)- double(data_go));
pct_err = 100*derr ./ double(data_go);
fprintf('Maximum Error: %d (%0.3f %%)\n', max(derr), max(pct_err));
fprintf('Maximum Error (as unsigned integer): %d\n', max(ierr));
fprintf('Number of cycles: %d ( %d per sample)\n', cyc_cnt, cyc_cnt / nsamp);
%EOF
Выполните следующие строки кода, чтобы скопировать необходимые файлы примеров во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_so_nonrestsqrt']; % 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), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, testbench_name), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, sysobj_name), mlhdlc_temp_dir);
Перед созданием кода смоделируйте проект с помощью средства тестирования, чтобы убедиться в отсутствии ошибок во время выполнения.
mlhdlc_sysobj_nonrestsqrt_tb
Maximum Error: 3.051758e-05 (0.028 %) Maximum Error (as unsigned integer): 1 Number of cycles: 2000 ( 20 per sample)
Этот алгоритм реализует операцию квадратного корня в минимальной области, используя единственный сумматор/вычитатель без мультиплексора (по сравнению с алгоритмом восстановления, который требует мультиплексора). Квадратный корень вычисляется с использованием ряда сдвигов и сложений/под, поэтому не использует множителей (по сравнению с другими реализациями, которые требуют множителя).
Общая архитектура алгоритма показана ниже, как описано в [1].

Эта реализация алгоритма использует подход минимальной площади, который требует нескольких циклов для вычисления каждого результата. Общее время вычисления может быть аппроксимировано как [Длина входного слова/2] с несколькими циклами служебных данных для загрузки входящих данных.
Для создания нового проекта введите следующую команду:
coder -hdlcoder -new mlhdlc_nonrestsqrt
Затем добавьте файл «mlhdlc _ sysobj _ nonrestsqrt.m» в проект в качестве функции MATLAB и «mlhdlc _ sysobj _ nonrestsqrt _ tb.m» в качестве тестового стенда MATLAB.
Для получения более полного руководства по созданию и заполнению проектов кодера MATLAB HDL см. раздел Начало работы с MATLAB в Workflow-процессе HDL.
Поскольку конструкция уже находится в фиксированной точке, нам не нужно выполнять автоматическое преобразование.
Запустите HDL Advisor и выберите «Сохранить исходные типы» для параметра «Преобразование фиксированных точек:».

Запустите помощник по рабочим процессам. В помощнике по рабочим процессам щелкните правой кнопкой мыши шаг «Создание кода» и выберите опцию «Выполнить до выбранной задачи», чтобы выполнить все шаги от начала до создания кода HDL.
Проверьте сгенерированный код HDL, щелкнув ссылки в окне журнала.
Список системных объектов, поддерживаемых для генерации кода HDL, см. в разделе Стандартные системные объекты, поддерживаемые для генерации кода HDL.
Выполните следующие команды для очистки временной папки проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_so_nonrestsqrt']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');
[1] Li, Y. and Chu, W. (1996) «Новый алгоритм невосстановления квадратного корня и его реализации VLSI». Международная конференция IEEE по компьютерному дизайну: VLSI in Computers and Processors, ICCD '96 Austin, Texas USA (7-9 октября 1996), pp. 538-544. дои: 10.1109/ICCD.1996.563604