В этом примере показано, как использовать addSpecification
метод fxpOptimizationOptions
класс, чтобы достигнуть лучше отображения для продукта блокируется на срезах DSP для целей FPGA. Используйте addSpecification
задавать известные типы данных в системе. После определения этих известных параметров, когда вы оптимизируете типы данных в системе, процесс оптимизации не изменяет заданный тип данных параметров блоков.
Много плат FPGA имеют конкретный, умножаются - накапливают аппаратные акселераторы, названные срезами DSP, которые ускоряют выполнение функций обработки сигналов. Срезы DSP отличаются по размеру в зависимости от поставщика. Чтобы получить выгоду аппаратного ускорения от срезов DSP, распространено в проекте FPGA сопоставить, умножают и накапливают операции в алгоритме на эти срезы.
В этом примере оптимизируйте типы данных для семейств на 3 дес. ложки плат Xilinx®, а также для дженерика 18x18 битный вход. Используйте addSpecification
метод, чтобы достигнуть хорошего отображения между продуктом блокируется в проекте и целевых срезах DSP.
Этот пример делает следующие предположения:
Только продукт и блоки Усиления предназначены для отображения со срезами DSP. Можно обработать другие блоки подобным способом.
Блоки продукта имеют только 2 входных параметров.
Блоки драйверов (блоки, которые предшествуют продукту или блокам Усиления) имеют OutDataTypeStr
в качестве параметра.
Только блоки, которые не имеют свойства HDL DSPStyle, устанавливают на off
предназначены.
Чтобы начаться, откройте систему, для которой вы хотите оптимизировать типы данных. В этом примере типы данных оптимизированы для автоматического алгоритма управления усиления.
model = 'mQAMAGC'; sud = [model '/Automatic Gain Control']; open_system(model);
Инициализируйте QAM Tx подсистема.
initQAM;
Создайте массив структур, который описывает свойства целевого среза DSP. dspStyle
функция, включенная в этот пример, предоставляет информацию об общих срезах Xilinx® DSP включая DSP48A1 (18x18 подписанный бит), DSP48E1 (18x25 подписанный бит), и DSP48E2 (18x27 подписанный бит). Это также обеспечивает пример дженерика 18x18 подписанный срез DSP.
dspStyle = getDSPStyle('DSP48E2');
В этом примере только продукт и блоки Усиления предназначены для отображения со срезами DSP. Найдите весь продукт и блоки Усиления в системе в соответствии с проектом, которые не имеют набора свойства DSPStyle блока HDL к 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);
Позвольте инструментированию регистрировать минимум, максимум и данные о переполнении в процессе моделирования для блоков продукта и блоков драйверов, которые предшествуют блокам продукта. Симулируйте модель, чтобы собрать области значений.
c = DataTypeWorkflow.Converter(sud,'TopModel',model); c.CurrentRunName = 'RangeCollection'; c.simulateSystem('MinMaxOverflowLogging','MinMaxAndOverflow');
Для эффективного отображения блоков продукта к доступным срезам DSP рассмотрите требования области значений блоков продукта. Создайте массив структур, чтобы сохранить симуляцию минимальные и максимальные значения для блоков продукта, собранных во время запущенного набора области значений.
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
Сохраните эти известные технические требования параметра для блоков продукта в 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
Получите технические требования для блоков, предшествующих блокам продукта. Обратите внимание на то, что этот пример принимает, что блоки продукта имеют два входных параметров.
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));
Сохраните известные технические требования параметра для блоков Усиления в 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;
Получите технические требования для выхода блоков Усиления.
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));
Получите технические требования для блоков, предшествующих блокам Усилений, и присвойте это первой настройке 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));
Получите технические требования для параметра Усиления системы в соответствии с проектом и присвойте это значение второй настройке 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
метод, чтобы задать технические требования для продукта и блоков Усиления.
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);
+ 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 tolerances. - Evaluating new solution: cost 250, does not meet the tolerances. - Evaluating new solution: cost 300, does not meet the tolerances. - Evaluating new solution: cost 350, does not meet the tolerances. - Evaluating new solution: cost 400, does not meet the tolerances. - Evaluating new solution: cost 450, does not meet the tolerances. - Evaluating new solution: cost 500, meets the tolerances. - Updated best found solution, cost: 500 - Evaluating new solution: cost 494, meets the tolerances. - Updated best found solution, cost: 494 - Evaluating new solution: cost 492, meets the tolerances. - Updated best found solution, cost: 492 - Evaluating new solution: cost 490, does not meet the tolerances. - Evaluating new solution: cost 486, does not meet the tolerances. - Evaluating new solution: cost 490, meets the tolerances. - Updated best found solution, cost: 490 - Evaluating new solution: cost 488, meets the tolerances. - Updated best found solution, cost: 488 - Evaluating new solution: cost 478, meets the tolerances. - Updated best found solution, cost: 478 - Evaluating new solution: cost 474, meets the tolerances. - Updated best found solution, cost: 474 - Evaluating new solution: cost 470, meets the tolerances. - Updated best found solution, cost: 470 - Evaluating new solution: cost 466, meets the tolerances. - Updated best found solution, cost: 466 - Evaluating new solution: cost 462, meets the tolerances. - Updated best found solution, cost: 462 - Evaluating new solution: cost 458, meets the tolerances. - Updated best found solution, cost: 458 - Evaluating new solution: cost 452, meets the tolerances. - Updated best found solution, cost: 452 - Evaluating new solution: cost 450, meets the tolerances. - Updated best found solution, cost: 450 - Evaluating new solution: cost 448, does not meet the tolerances. - Evaluating new solution: cost 444, does not meet the tolerances. - Evaluating new solution: cost 448, meets the tolerances. - Updated best found solution, cost: 448 - Evaluating new solution: cost 446, meets the tolerances. - Updated best found solution, cost: 446 - Evaluating new solution: cost 436, meets the tolerances. - Updated best found solution, cost: 436 - Evaluating new solution: cost 432, meets the tolerances. - Updated best found solution, cost: 432 - Evaluating new solution: cost 428, meets the tolerances. - Updated best found solution, cost: 428 - Evaluating new solution: cost 424, meets the tolerances. - Updated best found solution, cost: 424 - Evaluating new solution: cost 420, meets the tolerances. - Updated best found solution, cost: 420 - Evaluating new solution: cost 416, meets the tolerances. - Updated best found solution, cost: 416 - Evaluating new solution: cost 410, meets the tolerances. - Updated best found solution, cost: 410 - Evaluating new solution: cost 408, meets the tolerances. - Updated best found solution, cost: 408 - Evaluating new solution: cost 406, does not meet the tolerances. - Evaluating new solution: cost 402, does not meet the tolerances. - Evaluating new solution: cost 406, meets the tolerances. - Updated best found solution, cost: 406 - Evaluating new solution: cost 404, meets the tolerances. - Updated best found solution, cost: 404 - Evaluating new solution: cost 394, meets the tolerances. - Updated best found solution, cost: 394 - Evaluating new solution: cost 390, meets the tolerances. - Updated best found solution, cost: 390 - Evaluating new solution: cost 386, meets the tolerances. - Updated best found solution, cost: 386 - Evaluating new solution: cost 382, meets the tolerances. - Updated best found solution, cost: 382 - Evaluating new solution: cost 378, meets the tolerances. - Updated best found solution, cost: 378 - Evaluating new solution: cost 374, meets the tolerances. - Updated best found solution, cost: 374 - Evaluating new solution: cost 368, does not meet the tolerances. - Evaluating new solution: cost 372, meets the tolerances. - Updated best found solution, cost: 372 - Evaluating new solution: cost 370, does not meet the tolerances. - Evaluating new solution: cost 366, does not meet the tolerances. - Evaluating new solution: cost 370, meets the tolerances. - Updated best found solution, cost: 370 - Evaluating new solution: cost 368, meets the tolerances. - Updated best found solution, cost: 368 - Evaluating new solution: cost 358, does not meet the tolerances. - Evaluating new solution: cost 364, meets the tolerances. - Updated best found solution, cost: 364 - Evaluating new solution: cost 360, meets the tolerances. - Updated best found solution, cost: 360 - Evaluating new solution: cost 356, meets the tolerances. - Updated best found solution, cost: 356 - Evaluating new solution: cost 352, meets the tolerances. - Updated best found solution, cost: 352 - Evaluating new solution: cost 348, meets the tolerances. - Updated best found solution, cost: 348 - Evaluating new solution: cost 342, does not meet the tolerances. - Evaluating new solution: cost 346, meets the tolerances. - Updated best found solution, cost: 346 + Optimization has finished. - Neighborhood search complete. - Maximum number of iterations completed. + Fixed-point implementation that met the tolerances found. - Total cost: 346 - Maximum absolute difference: 0.006126 - Use the explore method of the result to explore the implementation.
Используйте explore
метод OptimizationResult
объект, result
, запустить Инспектора Данных моделирования и исследовать проект.
explore(result)
ans = OptimizationSolution with properties: Cost: 346 Pass: 1 MaxDifference: 0.0061 RunID: 28653 RunName: {'solution_a5b8ac6dbb7bff4abce5d3519508121c380dbb14_1'}