В этом примере показано, как использовать addSpecification
метод fxpOptimizationOptions
Класс для достижения лучшего отображения блоков продуктов на DSP срезов для целевых объектов FPGA. Использование addSpecification
для задания известных типов данных в системе. После определения этих известных параметров, когда вы оптимизируете типы данных в системе, процесс оптимизации не изменяет заданный тип данных параметров блоков.
Многие платы FPGA имеют специфические аппаратные ускорители умножения-накопления, называемые срезами DSP, которые ускоряют выполнение функций обработки сигналов. Срезы DSP варьируются в размере в зависимости от поставщика. Чтобы получить преимущества аппаратного ускорения срезов DSP, в проекте FPGA обычно сопоставлять умножение и накопление операций в алгоритме на эти срезы.
В этом примере оптимизируйте типы данных для 3 семейства DSP плат Xilinx ®, а также для типового входа 18x18 бит. Используйте addSpecification
метод для достижения хорошего отображения между блоками Product в проекте и целевыми срезами DSP.
Этот пример делает следующие допущения:
Для отображения с срезами DSP предназначены только блоки Product и Gain. Аналогично можно обрабатывать другие блоки.
Блоки продуктов имеют только 2 входы.
Блоки драйверов (блоки, которые предшествуют блокам Product или Gain) имеют OutDataTypeStr
как параметр.
Только блоки, для которых не задано свойство HDL DSPStyle off
являются целевыми.
Чтобы начать, откройте систему, для которой вы хотите оптимизировать типы данных. В этом примере типы данных оптимизированы для автоматического алгоритма управления усилением.
model = 'mQAMAGC'; sud = [model '/Automatic Gain Control']; open_system(model);
Инициализируйте подсистему QAM Tx.
initQAM;
Создайте массив структур, который описывает свойства целевого среза DSP. The dspStyle
Функция, включенная в этот пример, предоставляет информацию об общих срезах Xilinx ® DSP, включая DSP48A1 (18x18 бит со знаком), DSP48E1 (18x25 бит со знаком) и DSP48E2 (18x27 бит со знаком). Это также является примером типового среза DSP с подписью 18x18.
dspStyle = getDSPStyle('DSP48E2');
В этом примере только блоки Product и Gain предназначены для отображения с срезами DSP. Найдите все блоки Product и Gain в проектируемой системе, для которых не задано свойство HDL-блока DSPStyle off
. Для получения дополнительной информации см. DSPStyle (HDL Coder).
productBlocks = find_system(sud,'LookUnderMasks','on','BlockType','Product'); hasDSPOff = cellfun(@(x)(isequal(hdlget_param(x,'DSPStyle'),'off')), productBlocks); productDSP = productBlocks(~hasDSPOff); gainBlocks = find_system(sud,'LookUnderMasks','on','BlockType','Gain'); hasDSPOff = cellfun(@(x)(isequal(hdlget_param(x,'DSPStyle'),'off')), productBlocks); gainDSP = gainBlocks(~hasDSPOff);
Включите инструментирование для регистрации минимальных, максимальных и переполненных данных во время симуляции для блоков Product и блоков драйверов, которые предшествуют блокам Product. Симулируйте модель, чтобы собрать области значений.
c = DataTypeWorkflow.Converter(sud,'TopModel',model); c.CurrentRunName = 'RangeCollection'; c.simulateSystem('MinMaxOverflowLogging','MinMaxAndOverflow');
Для эффективного отображения блоков Продукта на доступные фрагменты DSP учитывайте требования области значений блоков Продукта. Создайте массив структур, чтобы хранить минимальные и максимальные значения симуляции для блоков Product, собранных во время запуска набора областей значений.
specs = struct('Block',productDSP{1},'Drivers',[],'Min',[],'Max',[]); %#ok<*SAGROW> r = c.results(c.CurrentRunName,@(x)(strcmp(x.ResultName,productDSP{1}))); specs.Min = r.SimMin; specs.Max = r.SimMax; predecessorBlocks = predecessors(productDSP{1}); for pIndex = 1:numel(predecessorBlocks) pBlkObj = get_param(predecessorBlocks{pIndex},'Object'); specs.Drivers(pIndex) = pBlkObj.Handle; r = c.results(c.CurrentRunName,@(x)(strcmp(x.ResultName,pBlkObj.getFullName()))); specs.Min(pIndex+1) = r.SimMin; specs.Max(pIndex+1) = r.SimMax; end
Сохраните эти известные спецификации параметров для блоков Product в Simulink.Simulation.BlockParameter
объект.
bpProductBlock = Simulink.Simulation.BlockParameter.empty(0,3); fout = fi(max([abs(specs.Min(1)) abs(specs.Max(1))]),dspStyle.sout,dspStyle.wout); bpProductBlock(1) = Simulink.Simulation.BlockParameter(specs.Block, ... 'OutDataTypeStr', ... sprintf('fixdt(%i,%i,%i)',dspStyle.sout,dspStyle.wout,fout.FractionLength));
Присвойте самый большой тип наибольшей области значений блоков драйверов. Это гарантирует, что самый большой тип данных, доступный на целевом компьютере, применяется к блоку с самым большим требованием к области значений.
dMax1 = max([abs(specs.Min(2)) abs(specs.Max(2))]); dMax2 = max([abs(specs.Min(3)) abs(specs.Max(3))]); if dMax1 < dMax2 win_1 = dspStyle.win_1; sin_1 = dspStyle.sin_1; win_2 = dspStyle.win_2; sin_2 = dspStyle.sin_2; if dspStyle.win_1 >= dspStyle.win_2 win_1 = dspStyle.win_2; sin_1 = dspStyle.sin_2; win_2 = dspStyle.win_1; sin_2 = dspStyle.sin_1; end else win_1 = dspStyle.win_2; sin_1 = dspStyle.sin_2; win_2 = dspStyle.win_1; sin_2 = dspStyle.sin_1; if dspStyle.win_1 >= dspStyle.win_2 win_1 = dspStyle.win_1; sin_1 = dspStyle.sin_1; win_2 = dspStyle.win_2; sin_2 = dspStyle.sin_2; end end
Получите спецификации для блоков, предшествующих блокам Product. Обратите внимание, что этот пример принимает, что блоки Product имеют два входов.
fin1 = fi(dMax1, sin_1, win_1); blkObj = get_param(specs.Drivers(1), 'Object'); bpProductBlock(2) = Simulink.Simulation.BlockParameter(blkObj.getFullName, ... 'OutDataTypeStr', ... sprintf('fixdt(%i, %i, %i)', sin_1, win_1, fin1.FractionLength)); fin2 = fi(dMax2, sin_2, win_2); blkObj = get_param(specs.Drivers(2), 'Object'); bpProductBlock(3) = Simulink.Simulation.BlockParameter(blkObj.getFullName, ... 'OutDataTypeStr', ... sprintf('fixdt(%i, %i, %i)', sin_2, win_2, fin2.FractionLength));
Сохраните известные спецификации параметров для блоков Gain в Simulink.Simulation.BlockParameter
объект.
bpGainBlock = Simulink.Simulation.BlockParameter.empty(0,3); specs = struct('Block',gainDSP{1},'Drivers',[],'Min',[],'Max',[]); %#ok<*SAGROW> r = c.results(c.CurrentRunName,@(x)(strcmp(x.ResultName,gainDSP{1}))); specs.Min = r.SimMin; specs.Max = r.SimMax; predecessorBlocks = predecessors(gainDSP{1}); pBlkObj = get_param(predecessorBlocks{1},'Object'); specs.Drivers(1) = pBlkObj.Handle; r = c.results(c.CurrentRunName,@(x)(strcmp(x.ResultName,pBlkObj.getFullName()))); specs.Min(2) = r.SimMin; specs.Max(2) = r.SimMax;
Получите спецификации для выхода блоков Gain.
fout = fi(max(abs([specs.Min(1) specs.Max(1)])),dspStyle.sout,dspStyle.wout); bpGainBlock(1) = Simulink.Simulation.BlockParameter(gainDSP{1}, ... 'OutDataTypeStr', ... sprintf('fixdt(%i, %i, %i)',dspStyle.sout,dspStyle.wout,fout.FractionLength));
Получите спецификации для блоков, предшествующих блокам Gains, и присвойте это первому строению Simulink.Simulation.BlockParameter
bpGainBlock объекта
.
blkObj = get_param(specs.Drivers(1),'Object'); fin = fi(max(abs([specs.Min(2) specs.Max(2)])),dspStyle.sin_1,dspStyle.win_1); bpGainBlock(2) = Simulink.Simulation.BlockParameter(blkObj.getFullName, ... 'OutDataTypeStr', ... sprintf('fixdt(%i,%i,%i)',dspStyle.sin_1,dspStyle.win_1,fin.FractionLength));
Получите спецификации для параметра Gain проектируемой системы и присвойте это значение второго строения bpGainBlock
.
paramValue = str2double(get_param(sud,'AGC_Gain')); fParam = fi(paramValue,dspStyle.sin_2,dspStyle.win_2); bpGainBlock(3) = Simulink.Simulation.BlockParameter(gainDSP{1}, ... 'ParamDataTypeStr', ... sprintf('fixdt(%i,%i,%i)',dspStyle.sin_2,dspStyle.win_2,fParam.FractionLength));
Создайте fxpOptimizationOptions
объект для определения ограничений и допусков. Задайте допустимые размеры слова от 8 бит до 32 бит.
options = fxpOptimizationOptions('AllowableWordLengths',8:2:32);
Используйте addTolerance
метод для определения допусков для различий между исходным поведением системы и поведением с помощью оптимизированных типов данных с фиксированной точкой.
addTolerance(options,sud,1,'RelTol',1e-2); addTolerance(options,sud,2,'RelTol',1e-2); addTolerance(options,sud,1,'AbsTol',1e-3); addTolerance(options,sud,2,'AbsTol',1e-3);
Используйте addSpecification
метод для определения спецификаций для блоков Product и Gain.
addSpecification(options,'BlockParameter',bpProductBlock); % set the specifications for the product block addSpecification(options,'BlockParameter',bpGainBlock); % set the specifications for the gain block showSpecifications(options);
Index Name BlockPath Value _____ ________________ _____________________________________________ __________________ 1 OutDataTypeStr mQAMAGC/Automatic Gain Control/LoopGain 'fixdt(1, 45, 53)' 2 ParamDataTypeStr mQAMAGC/Automatic Gain Control/LoopGain 'fixdt(1,27,35)' 3 OutDataTypeStr mQAMAGC/Automatic Gain Control/LoopGainDriver 'fixdt(1,18,16)' 4 OutDataTypeStr mQAMAGC/Automatic Gain Control/Product 'fixdt(1,45,43)' 5 OutDataTypeStr mQAMAGC/Automatic Gain Control/ProductDriverA 'fixdt(1, 27, 25)' 6 OutDataTypeStr mQAMAGC/Automatic Gain Control/ProductDriverB 'fixdt(1, 18, 17)'
Используйте fxpopt
функция для запуска оптимизации. Программа анализирует области значений объектов в проектируемой системе и ограничения, указанные в fxpOptimizationOptions
объект для применения гетерогенных типов данных к системе с минимизацией общей ширины битов. Известные спецификации параметров, включенные в addSpecification
метод не зависит от процесса оптимизации.
result = fxpopt(model,sud,options);
+ Starting data type optimization... + Checking for unsupported constructs. + Preprocessing + Modeling the optimization problem - Constructing decision variables + Running the optimization solver - Evaluating new solution: cost 200, does not meet the behavioral constraints. - Evaluating new solution: cost 250, does not meet the behavioral constraints. - Evaluating new solution: cost 300, does not meet the behavioral constraints. - Evaluating new solution: cost 350, does not meet the behavioral constraints. - Evaluating new solution: cost 400, does not meet the behavioral constraints. - Evaluating new solution: cost 450, does not meet the behavioral constraints. - Evaluating new solution: cost 500, meets the behavioral constraints. - Updated best found solution, cost: 500 - Evaluating new solution: cost 494, meets the behavioral constraints. - Updated best found solution, cost: 494 - Evaluating new solution: cost 492, meets the behavioral constraints. - Updated best found solution, cost: 492 - Evaluating new solution: cost 490, does not meet the behavioral constraints. - Evaluating new solution: cost 486, does not meet the behavioral constraints. - Evaluating new solution: cost 490, meets the behavioral constraints. - Updated best found solution, cost: 490 - Evaluating new solution: cost 488, meets the behavioral constraints. - Updated best found solution, cost: 488 - Evaluating new solution: cost 478, meets the behavioral constraints. - Updated best found solution, cost: 478 - Evaluating new solution: cost 474, meets the behavioral constraints. - Updated best found solution, cost: 474 - Evaluating new solution: cost 470, meets the behavioral constraints. - Updated best found solution, cost: 470 - Evaluating new solution: cost 466, meets the behavioral constraints. - Updated best found solution, cost: 466 - Evaluating new solution: cost 462, meets the behavioral constraints. - Updated best found solution, cost: 462 - Evaluating new solution: cost 458, meets the behavioral constraints. - Updated best found solution, cost: 458 - Evaluating new solution: cost 452, meets the behavioral constraints. - Updated best found solution, cost: 452 - Evaluating new solution: cost 450, meets the behavioral constraints. - Updated best found solution, cost: 450 - Evaluating new solution: cost 448, does not meet the behavioral constraints. - Evaluating new solution: cost 444, does not meet the behavioral constraints. - Evaluating new solution: cost 448, meets the behavioral constraints. - Updated best found solution, cost: 448 - Evaluating new solution: cost 446, meets the behavioral constraints. - Updated best found solution, cost: 446 - Evaluating new solution: cost 436, meets the behavioral constraints. - Updated best found solution, cost: 436 - Evaluating new solution: cost 432, meets the behavioral constraints. - Updated best found solution, cost: 432 - Evaluating new solution: cost 428, meets the behavioral constraints. - Updated best found solution, cost: 428 - Evaluating new solution: cost 424, meets the behavioral constraints. - Updated best found solution, cost: 424 - Evaluating new solution: cost 420, meets the behavioral constraints. - Updated best found solution, cost: 420 - Evaluating new solution: cost 416, meets the behavioral constraints. - Updated best found solution, cost: 416 - Evaluating new solution: cost 410, meets the behavioral constraints. - Updated best found solution, cost: 410 - Evaluating new solution: cost 408, meets the behavioral constraints. - Updated best found solution, cost: 408 - Evaluating new solution: cost 406, does not meet the behavioral constraints. - Evaluating new solution: cost 402, does not meet the behavioral constraints. - Evaluating new solution: cost 406, meets the behavioral constraints. - Updated best found solution, cost: 406 - Evaluating new solution: cost 404, meets the behavioral constraints. - Updated best found solution, cost: 404 - Evaluating new solution: cost 394, meets the behavioral constraints. - Updated best found solution, cost: 394 - Evaluating new solution: cost 390, meets the behavioral constraints. - Updated best found solution, cost: 390 - Evaluating new solution: cost 386, meets the behavioral constraints. - Updated best found solution, cost: 386 - Evaluating new solution: cost 382, meets the behavioral constraints. - Updated best found solution, cost: 382 - Evaluating new solution: cost 378, meets the behavioral constraints. - Updated best found solution, cost: 378 - Evaluating new solution: cost 374, meets the behavioral constraints. - Updated best found solution, cost: 374 - Evaluating new solution: cost 368, does not meet the behavioral constraints. - Evaluating new solution: cost 372, meets the behavioral constraints. - Updated best found solution, cost: 372 - Evaluating new solution: cost 370, does not meet the behavioral constraints. - Evaluating new solution: cost 366, does not meet the behavioral constraints. - Evaluating new solution: cost 370, meets the behavioral constraints. - Updated best found solution, cost: 370 - Evaluating new solution: cost 368, meets the behavioral constraints. - Updated best found solution, cost: 368 - Evaluating new solution: cost 358, does not meet the behavioral constraints. - Evaluating new solution: cost 364, meets the behavioral constraints. - Updated best found solution, cost: 364 - Evaluating new solution: cost 360, meets the behavioral constraints. - Updated best found solution, cost: 360 - Evaluating new solution: cost 356, meets the behavioral constraints. - Updated best found solution, cost: 356 - Evaluating new solution: cost 352, meets the behavioral constraints. - Updated best found solution, cost: 352 - Evaluating new solution: cost 348, meets the behavioral constraints. - Updated best found solution, cost: 348 - Evaluating new solution: cost 342, does not meet the behavioral constraints. + Optimization has finished. - Neighborhood search complete. - Maximum number of iterations completed. + Fixed-point implementation that satisfies the behavioral constraints found. The best found solution is applied on the model. - Total cost: 348 - Maximum absolute difference: 0.006126 - Use the explore method of the result to explore the implementation.
Используйте explore
метод OptimizationResult
объект, result
, чтобы запустить Данные моделирования Inspector и исследовать проект.
explore(result)
ans = OptimizationSolution with properties: Cost: 348 Pass: 1 MaxDifference: 0.0061 RunID: 21632 RunName: {'solution_61d4a5478350738e21dfd31a47760c2cbf2e4794_1'}