Оптимизируйте типы данных для FPGA со срезами DSP

В этом примере показано, как использовать addSpecification метод fxpOptimizationOptions класс, чтобы достигнуть лучше отображения для продукта блокируется на срезах DSP для целей FPGA. Используйте addSpecification задавать известные типы данных в системе. После определения этих известных параметров, когда вы оптимизируете типы данных в системе, процесс оптимизации не изменяет заданный тип данных параметров блоков.

Много плат FPGA имеют конкретный, умножаются - накапливают аппаратные акселераторы, названные срезами DSP, которые ускоряют выполнение функций обработки сигналов. Срезы DSP отличаются по размеру в зависимости от поставщика. Чтобы получить выгоду аппаратного ускорения от срезов DSP, распространено в проекте FPGA сопоставить, умножают и накапливают операции в алгоритме на эти срезы.

В этом примере оптимизируйте типы данных для семейств на 3 дес. ложки плат Xilinx®, а также для дженерика 18x18 битный вход. Используйте addSpecification метод, чтобы достигнуть хорошего отображения между продуктом блокируется в проекте и целевых срезах DSP.

Этот пример делает следующие предположения:

  1. Только продукт и блоки Усиления предназначены для отображения со срезами DSP. Можно обработать другие блоки подобным способом.

  2. Блоки продукта имеют только 2 входных параметров.

  3. Блоки драйверов (блоки, которые предшествуют продукту или блокам Усиления) имеют OutDataTypeStr в качестве параметра.

  4. Только блоки, которые не имеют свойства 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'}