В этом примере показано, как использовать распределенную конвейерную и петлевую оптимизацию в кодере HDL для оптимизации тактовой частоты.
Распределенная конвейерная обработка - это общепроектная оптимизация, поддерживаемая кодером HDL для улучшения тактовой частоты. При включении опции «Распределить регистры конвейера» в кодере HDL кодер перераспределяет входные и выходные регистры конвейера функции верхнего уровня вместе с другими регистрами в конструкции, чтобы минимизировать комбинаторную логику между регистрами и таким образом максимизировать тактовую частоту чипа, синтезированного из сгенерированного кода HDL.
Рассмотрим следующий пример конструкции фильтра FIR. Комбинаторная логика от входа или регистра к выходу или другому регистру содержит сумму произведений. Размотка контура и распределенная конвейерная обработка перемещают выходные регистры на проектном уровне для уменьшения количества комбинаторной логики, увеличивая таким образом тактовую частоту.
Код MATLAB, используемый в примере, является простым фильтром FIR. В примере также показан испытательный стенд MATLAB с фильтром.
design_name = 'mlhdlc_fir'; testbench_name = 'mlhdlc_fir_tb';
Проектирование: mlhdlc_fir
Испытательный стенд: mlhdlc_fir_tb
Выполните следующие строки кода, чтобы скопировать необходимые файлы примеров во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_fir']; % 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_fir_tb


Для выполнения преобразования с фиксированной точкой необходим объект конфигурации «fixpt».
Создайте объект конфигурации «fixpt» и укажите имя тестового стенда:
close all; fixptcfg = coder.config('fixpt'); fixptcfg.TestBenchName = 'mlhdlc_fir_tb';
Для создания кода необходимо создать объект конфигурации 'hdl' и задать имя тестового стенда:
hdlcfg = coder.config('hdl'); hdlcfg.TestBenchName = 'mlhdlc_fir_tb';
Для увеличения тактовой частоты пользователь может задать ряд входных и выходных ступеней трубопровода для любой конструкции. В этом конкретном примере параметр Input pipelining имеет значение «1», а параметр Output pipelining имеет значение «20». Без включения дополнительных опций эти настройки добавят один входной регистр трубопровода на всех входных портах конструкции верхнего уровня и 20 выходных регистров трубопровода на каждом из выходных портов.
Если опция «Распределить регистры конвейера» включена, кодер HDL пытается изменить положение регистров для достижения наилучшей тактовой частоты.
В дополнение к перемещению входных и выходных конвейерных регистров, HDL Coder также пытается переместить регистры, смоделированные внутри конструкции, используя постоянные переменные или с системными объектами, такими как dsp. Задержка.
Дополнительные возможности для улучшений становятся доступными при распаковке циклов. Параметр «Unroll Loops» разворачивает явные for-loops в коде MATLAB в дополнение к неявным for-loops, выводимым для векторных и матричных операций. Для выполнения распределенной конвейерной обработки в этом примере необходимо «Разматывать петли».
hdlcfg.InputPipeline = 1;
hdlcfg.OutputPipeline = 20;
hdlcfg.DistributedPipelining = true;
hdlcfg.LoopOptimization = 'UnrollLoops';
Если на компьютере установлен ISE, выполните шаг логического синтеза
hdlcfg.SynthesizeGeneratedCode = true; codegen -float2fixed fixptcfg -config hdlcfg mlhdlc_fir
Просмотр отчета о результатах
edit codegen/mlhdlc_fir/hdlsrc/ise_prj/mlhdlc_fir_fixpt_syn_results.txt
В отчете о синтезе запишите тактовую частоту, сообщенную средством синтеза. При синтезировании конструкции с включенными параметрами размотки и распределенной конвейерной обработки появляется значительное увеличение тактовой частоты при включенных параметрах конвейерной обработки.
Выполните следующие команды для очистки временной папки проекта.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_fir']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');