Генерация HDL-кода из невосстановляющегося Квадратный корень Системного объекта

В этом примере показано, как проверить, сгенерировать и проверить HDL-код из кода MATLAB ®, который создает экземпляр невосстановляющегося квадратного корня системы.

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].

Эта реализация алгоритма использует подход с минимальной площадью, который требует нескольких циклов, чтобы вычислить каждый результат. Общее время вычисления может быть аппроксимировано как [Input Word Length/2] с несколькими циклами накладных расходов для загрузки входящих данных.

Создайте новый HDL Coder проект

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

coder -hdlcoder -new mlhdlc_nonrestsqrt

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

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

Пропустите преобразование фиксированной точки

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

Запустите HDL Advisor и выберите 'Сохранить исходные типы' для опции 'Преобразование с фиксированной точкой:'.

Запуск генерации HDL-кода

Запустите советник по рабочим процессам. В Workflow Advisor щелкните правой кнопкой мыши шаг 'Генерация Кода' и выберите опцию 'Run to selected task', чтобы запустить все шаги от начала до генерации 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 в компьютерах и процессорах, ICCD '96 Остин, Техас США (7-9 октября 1996), стр. 538-544. doi: 10.1109/ICCD.1996.563604