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

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

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

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

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

  1. Для отображения с срезами DSP предназначены только блоки Product и Gain. Аналогично можно обрабатывать другие блоки.

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

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

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