В этом примере показано, как проверять, сгенерируйте и проверьте 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 для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Когда проект уже находится в фиксированной точке, мы не должны выполнять автоматическое преобразование.
Запустите Советника по вопросам HDL и выберите 'Keep original types' на опции 'Преобразование Фиксированной точки':.
Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по 'Code Generation', продвигаются и выбирают опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию 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] Литий, Y. и Чу, W. (1996) "Новый Алгоритм Квадратного корня Невосстановления и Его Реализации VLSI". Международная конференция IEEE по вопросам Компьютерного дизайна: VLSI в Компьютерах и Процессорах, ICCD '96 Остина, Техас США (7-9 октября 1996), стр 538-544. doi: 10.1109/ICCD.1996.563604