Реализация HDL цифрового понижающего преобразователя для LTE

В этом примере показано, как спроектировать цифровой понижающий преобразователь (DDC) для приложений радиосвязи, таких как LTE и сгенерировать HDL-код.

Введение

DDCs широко используются в приемниках цифровой связи, чтобы преобразовать радиочастоту (RF) или сигналы промежуточной частоты (IF) к основной полосе. Операция DDC переключает сигнал к более низкой частоте и уменьшает ее частоту дискретизации, чтобы упростить последующие этапы обработки. DDC в этом примере выполняет комплексный перевод частоты, сопровождаемый преобразованием частоты дискретизации с помощью четырехэтапной цепи фильтра. Пример запускается путем разработки DDC с функциями DSP System Toolbox™ в плавающей точке. Затем каждый этап преобразуется в фиксированную точку и используется в модели Simulink®, которая генерирует синтезируемый HDL-код. Пример использует эти два тестовых сигнала, чтобы продемонстрировать и проверить операцию DDC:

  • Синусоида, которая модулируется на несущую IF на 32 МГц.

  • Сигнал нисходящего канала LTE с полосой пропускания 1,4 МГц, которая модулируется на несущую IF на 32 МГц.

Пример сравнивает качество сигнала при выходе DDC с плавающей точкой с качеством сигнала при выходе DDC фиксированной точки.

Наконец, пример представляет реализацию цепи фильтра для FPGAs и результаты синтеза.

Этот пример использует DDCTestUtils, класс помощника, который содержит функции для генерации стимула и анализа DDC выход. Для получения дополнительной информации смотрите DDCTestUtils.m файл.

Структура DDC

DDC состоит из генератора с программным управлением (NCO), микшера, и десятикратно уменьшающий цепь фильтра. Цепь фильтра состоит из CIC decimator, коррекции усиления CIC, компенсация CIC decimator (КИХ), полуполоса FIR decimator и итоговый КИХ decimator.

Полный ответ цепи фильтра эквивалентен тому из одного децимирующего фильтра с той же спецификацией. Однако разделение фильтра в несколько этапов децимации приводит к более эффективному проекту, который использует меньше аппаратных ресурсов.

Каскадная расческа интегратора (CIC) decimator обеспечивает большой начальный фактор децимации, который позволяет последующим фильтрам работать на более низких уровнях. Компенсация CIC decimator улучшает спектральный ответ путем компенсации свисания CIC при десятикратном уменьшении на два. Полуполоса является промежуточным звеном decimator, и финал decimator реализует точный Fpass и Fstop характеристики DDC. Чем более низкие частоты дискретизации около конца цепочечного среднего значения, тем более поздние фильтры могут оптимизировать использование ресурса путем совместного использования множителей.

Этот рисунок показывает блок-схему DDC.

Частота дискретизации входа к DDC является 122.88 членами Шотландского парламента, и выходная частота дискретизации является 1.92 членами Шотландского парламента. Эти уровни дают полный фактор децимации 64. Приемники LTE используют 1.92 членов Шотландского парламента в качестве типичной частоты дискретизации для поиска ячейки и восстановления основного блока информации (MIB). Фильтры DDC спроектированы, чтобы удовлетворить этому приложению. DDC оптимизирован, чтобы запуститься на тактовой частоте 122,88 МГц.

Проект DDC

Этот раздел объясняет, как спроектировать DDC с помощью операций с плавающей точкой и функций создания фильтра в MATLAB®.

Параметры DDC

Этот пример проектирует характеристики фильтра DDC, чтобы соответствовать этим желаемым значениям отклика для данной входной частоты дискретизации и несущей частоты.

FsIn = 122.88e6;    % Sampling rate of DDC input
FsOut = 1.92e6;     % Sampling rate of DDC output
Fc = 32e6;          % Carrier frequency
Fpass = 540e3;      % Passband frequency, equivalent to 36x15kHz LTE subcarriers
Fstop = 700e3;      % Stopband frequency
Ap = 0.1;           % Passband ripple
Ast = 60;           % Stopband attenuation

CIC Decimator

Первый этап фильтра является CIC decimator из-за его способности эффективно реализовать большой фактор децимации. Ответ CIC-фильтра похож на каскад фильтров скользящего среднего значения, но CIC-фильтр не использует умножения или деления. В результате CIC-фильтр имеет большое усиление DC.

cicParams.DecimationFactor = 8;
cicParams.DifferentialDelay = 1;
cicParams.NumSections = 3;
cicParams.FsOut = FsIn/cicParams.DecimationFactor;

cicFilt = dsp.CICDecimator(cicParams.DecimationFactor, ...
    cicParams.DifferentialDelay,cicParams.NumSections) %#ok<*NOPTS>
cicGain = gain(cicFilt)
cicFilt = 

  dsp.CICDecimator with properties:

      DecimationFactor: 8
     DifferentialDelay: 1
           NumSections: 3
    FixedPointDataType: 'Full precision'


cicGain =

   512

Поскольку усиление CIC является степенью двойки, аппаратная реализация может легко откорректировать для фактора усиления при помощи операции сдвига. В аналитических целях пример представляет коррекцию усиления в MATLAB с dsp.FIRFilter с одним касанием Система object™.

cicGainCorr = dsp.FIRFilter('Numerator',1/cicGain)
cicGainCorr = 

  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: 0.0020
    InitialConditions: 0

  Use get to show all properties

Отобразите ответ величины CIC-фильтра с и без коррекции усиления при помощи fvtool. Для анализа, комбинируют CIC-фильтр, и коррекция усиления фильтруют в dsp.FilterCascade Системный объект. CIC-фильтры используют вычисления с фиксированной точкой внутренне, таким образом, fvtool графики и квантованные и неквантованные ответы.

ddcPlots.cicDecim = fvtool(...
    cicFilt, ...
    dsp.FilterCascade(cicFilt,cicGainCorr), ...
    'Fs',[FsIn,FsIn]);
DDCTestUtils.setPlotNameAndTitle('CIC Decimator');
legend(...
    'CIC No Correction: Quantized', ...
    'CIC No Correction: Reference', ...
    'CIC With Gain Correction: Quantized', ...
    'CIC With gain correction: Reference');

Фильтр компенсации свисания CIC

Поскольку ответ величины CIC-фильтра имеет значительное свисание в области полосы пропускания, пример использует основанный на КИХ фильтр компенсации свисания, чтобы сгладить ответ полосы пропускания. Компенсатор свисания имеет те же свойства как CIC decimator. Этот фильтр реализует децимацию на коэффициент два, таким образом, необходимо также задать bandlimiting характеристики для фильтра. Используйте design функционируйте, чтобы возвратить Системный объект фильтра с заданными характеристиками.

compParams.R = 2;                                % CIC compensation decimation factor
compParams.Fpass = Fstop;                        % CIC compensation passband frequency
compParams.FsOut = cicParams.FsOut/compParams.R; % New sampling rate
compParams.Fstop = compParams.FsOut - Fstop;     % CIC compensation stopband frequency
compParams.Ap = Ap;                              % Same passband ripple as overall filter
compParams.Ast = Ast;                            % Same stopband attenuation as overall filter

compSpec = fdesign.decimator(compParams.R,'ciccomp', ...
    cicParams.DifferentialDelay, ...
    cicParams.NumSections, ...
    cicParams.DecimationFactor, ...
    'Fp,Fst,Ap,Ast', ...
    compParams.Fpass,compParams.Fstop,compParams.Ap,compParams.Ast, ...
    cicParams.FsOut);
compFilt = design(compSpec,'SystemObject',true)
compFilt = 

  dsp.FIRDecimator with properties:

    DecimationFactor: 2
     NumeratorSource: 'Property'
           Numerator: [-0.0398 -0.0126 0.2901 0.5258 0.2901 -0.0126 -0.0398]
           Structure: 'Direct form'

  Use get to show all properties

Постройте объединенный ответ CIC-фильтра (с коррекцией усиления) и компенсация свисания.

ddcPlots.cicComp = fvtool(...
    dsp.FilterCascade(cicFilt,cicGainCorr,compFilt), ...
    'Fs',FsIn,'Legend','off');
DDCTestUtils.setPlotNameAndTitle('CIC Decimation and Droop Compensation');

Полуполоса Decimator

Полуленточный фильтр обеспечивает эффективную децимацию два. Полуленточные фильтры эффективны, потому что приблизительно половина их коэффициентов равна нулю, и те множители исключены из аппаратной реализации.

hbParams.FsOut = compParams.FsOut/2;
hbParams.TransitionWidth = hbParams.FsOut - 2*Fstop;
hbParams.StopbandAttenuation = Ast;

hbSpec = fdesign.decimator(2,'halfband',...
    'Tw,Ast', ...
    hbParams.TransitionWidth, ...
    hbParams.StopbandAttenuation, ...
    compParams.FsOut);
hbFilt = design(hbSpec,'SystemObject',true)
hbFilt = 

  dsp.FIRDecimator with properties:

    DecimationFactor: 2
     NumeratorSource: 'Property'
           Numerator: [0.0089 0 -0.0565 0 0.2977 0.5000 0.2977 0 -0.0565 ... ]
           Structure: 'Direct form'

  Use get to show all properties

Постройте ответ DDC до полуленточного фильтра выход.

ddcPlots.halfbandFIR = fvtool(...
    dsp.FilterCascade(cicFilt,cicGainCorr,compFilt,hbFilt), ...
    'Fs',FsIn,'Legend','off');
DDCTestUtils.setPlotNameAndTitle('CIC Decimation, Droop Compensation, and Halfband FIR');

Итоговый КИХ Decimator

Итоговый КИХ реализует подробную полосу пропускания и характеристики полосы задерживания DDC. Этот фильтр имеет больше коэффициентов, чем более ранние КИХ-фильтры, но потому что он действует на более низкой частоте дискретизации, он может использовать разделение ресурсов для эффективной аппаратной реализации.

Добавьте 3 дБ высоты к затуханию в полосе задерживания так, чтобы DDC все еще выполнил спецификации после квантования фиксированной точки. Это значение было найдено опытным путем при помощи fvtool.

finalSpec = fdesign.decimator(2,'lowpass', ...
    'Fp,Fst,Ap,Ast',Fpass,Fstop,Ap,Ast+3,hbParams.FsOut);
finalFilt = design(finalSpec,'equiripple','SystemObject',true)
finalFilt = 

  dsp.FIRDecimator with properties:

    DecimationFactor: 2
     NumeratorSource: 'Property'
           Numerator: [9.3365e-04 0.0013 9.3466e-04 -5.3189e-04 -0.0022 ... ]
           Structure: 'Direct form'

  Use get to show all properties

Визуализируйте полный ответ величины DDC.

ddcFilterChain = dsp.FilterCascade(cicFilt,cicGainCorr, ...
    compFilt,hbFilt,finalFilt);
ddcPlots.overallResponse = fvtool(ddcFilterChain, ...
    'Fs',FsIn,'Legend','off');
DDCTestUtils.setPlotNameAndTitle('Overall DDC Filter Chain');

Преобразование фиксированной точки

Частотная характеристика цепи фильтра DDC с плавающей точкой теперь выполняет спецификации. Затем квантуйте каждый этап фильтра, чтобы использовать фиксированные точки и анализировать их, чтобы подтвердить, что цепь фильтра все еще выполняет спецификации.

Отфильтруйте квантование

Этот пример использует 16-битные коэффициенты, которые достаточны, чтобы выполнить спецификации. Используя меньше чем 18 битов для коэффициентов минимизирует количество блоков DSP, которые требуются для реализации FPGA. Вход к цепи фильтра DDC является 16-битными данными с 15 дробными битами. Выходные параметры фильтра являются 18-битными значениями, которые обеспечивают дополнительную высоту и точность в промежуточных сигналах.

Для CIC decimator, выбор 'Minimum section word lengths' опция типа данных с фиксированной точкой автоматически оптимизирует внутренний wordlengths на основе выхода wordlength и других параметров CIC.

cicFilt.FixedPointDataType = 'Minimum section word lengths';
cicFilt.OutputWordLength = 18;

Сконфигурируйте свойства фиксированной точки коррекции усиления и основанных на КИХ Системных объектов. Объект использует RoundingMethod по умолчанию и OverflowAction значения свойств ('Floor' и 'Wrap' соответственно).

% CIC Gain Correction
cicGainCorr.FullPrecisionOverride = false;
cicGainCorr.CoefficientsDataType = 'Custom';
cicGainCorr.CustomCoefficientsDataType = numerictype(fi(cicGainCorr.Numerator,1,16));
cicGainCorr.OutputDataType = 'Custom';
cicGainCorr.CustomOutputDataType = numerictype(1,18,16);

% CIC Droop Compensation
compFilt.FullPrecisionOverride = false;
compFilt.CoefficientsDataType = 'Custom';
compFilt.CustomCoefficientsDataType = numerictype([],16,15);
compFilt.ProductDataType = 'Full precision';
compFilt.AccumulatorDataType = 'Full precision';
compFilt.OutputDataType = 'Custom';
compFilt.CustomOutputDataType = numerictype([],18,16);

% Halfband
hbFilt.FullPrecisionOverride = false;
hbFilt.CoefficientsDataType = 'Custom';
hbFilt.CustomCoefficientsDataType = numerictype([],16,15);
hbFilt.ProductDataType = 'Full precision';
hbFilt.AccumulatorDataType = 'Full precision';
hbFilt.OutputDataType = 'Custom';
hbFilt.CustomOutputDataType = numerictype([],18,16);

% FIR
finalFilt.FullPrecisionOverride = false;
finalFilt.CoefficientsDataType = 'Custom';
finalFilt.CustomCoefficientsDataType = numerictype([],16,15);
finalFilt.ProductDataType = 'Full precision';
finalFilt.AccumulatorDataType = 'Full precision';
finalFilt.OutputDataType = 'Custom';
finalFilt.CustomOutputDataType = numerictype([],18,16);

Анализ фиксированной точки

Смотрите эффекты квантования с fvtool. Можно анализировать фильтры индивидуально или в каскаде. fvtool показывает квантованные и неквантованные (ссылочные) ответы overlayed. Например, этот рисунок показывает эффект квантования итогового КИХ-этапа фильтра.

ddcPlots.quantizedFIR = fvtool(finalFilt, ...
    'Fs',hbParams.FsOut,'arithmetic','fixed');
DDCTestUtils.setPlotNameAndTitle('Quantized Final Filter');
legend('quantized','reference');

Переопределите ddcFilterChain расположите каскадом объект включать свойства фиксированной точки отдельных фильтров. Затем используйте fvtool анализировать целую цепь фильтра и подтвердить, что квантованный DDC все еще выполняет спецификации.

ddcFilterChain = dsp.FilterCascade(cicFilt, ...
    cicGainCorr,compFilt,hbFilt,finalFilt);
ddcPlots.quantizedDDCResponse = fvtool(ddcFilterChain, ...
    'Fs',FsIn,'Arithmetic','fixed');
DDCTestUtils.setPlotNameAndTitle('Quantized DDC Filter Chain');
legend('quantized','reference');

Оптимизированная HDL модель Simulink

Следующий шаг в процессе проектирования должен реализовать DDC в блоках использования Simulink та генерация HDL-кода поддержки.

Настройка модели

Модель использует переменные в рабочем пространстве MATLAB, чтобы сконфигурировать блоки и настройки. Это использует те же переменные цепи фильтра, заданные ранее в примере. Затем задайте характеристики NCO и входной сигнал. Пример использует эти характеристики, чтобы сконфигурировать блок NCO.

Задайте желаемое разрешение частоты. Вычислите количество двоичных разрядов аккумулятора, которые требуются, чтобы достигать нужного разрешения, и затем задавать количество квантованных двоичных разрядов аккумулятора. NCO использует квантованный выход аккумулятора, чтобы обратиться к интерполяционной таблице синуса. Также вычислите шаг фазы, который NCO должен использовать, чтобы сгенерировать заданную несущую частоту. NCO применяет dither фазы к тем двоичным разрядам аккумулятора, которые удалены во время квантования.

nco.Fd = 1;
nco.AccWL = nextpow2(FsIn/nco.Fd)+1;
nco.QuantAccWL = 12;
nco.PhaseInc = round((-Fc*2^nco.AccWL)/FsIn);
nco.NumDitherBits = nco.AccWL-nco.QuantAccWL;

Вход к DDC прибывает из ddcIn переменная. На данный момент присвойте фиктивное значение для ddcIn так, чтобы модель могла вычислить свои типы данных. Во время тестирования, ddcIn предоставляет входные данные модели.

ddcIn = 0; %#ok<NASGU>

Структура модели

Этот рисунок показывает верхний уровень модели DDC Simulink. Модель импортирует ddcIn переменная из рабочего пространства MATLAB при помощи блока Signal From Workspace, преобразует входной сигнал в 16-битные значения и применяет сигнал к DDC. Можно сгенерировать HDL-код от HDL_DDC подсистема.

modelName = 'DDCHDLImplementation';
open_system(modelName);
set_param(modelName,'SimulationCommand','Update');
set_param(modelName,'Open','on');

Реализация DDC в HDL_DDC подсистема. Блок NCO HDL Optimized генерирует комплексный фазовращатель в несущей частоте. Этот сигнал переходит к микшеру, который умножает фазовращатель с входным сигналом. Затем выход микшера передан цепи фильтра и подкошен 1.92 членам Шотландского парламента.

set_param([modelName '/HDL_DDC'],'Open','on');

Параметры блоков NCO

Блок NCO в модели сконфигурирован параметрами, заданными в nco структура. Этот рисунок показывает обе вкладки HDL NCO Оптимизированное диалоговое окно параметров блоков.

Децимация CIC и коррекция усиления

Первый этап фильтра является CIC Decimator, который реализован с блоком CIC Decimation HDL Optimized. Параметры блоков установлены в cicParams значения структуры. Чтобы реализовать коррекцию усиления, модель выбирает параметр коррекции Усиления.

Модель конфигурирует фильтры при помощи свойств соответствующих Системных объектов. Компенсация CIC, децимация полуполосы и финал cecimation фильтры действуют на уровне эффективных частот дискретизации, которые ниже, чем тактовая частота факторами 8, 16, и 32, соответственно. Модель реализует эти частоты дискретизации при помощи допустимого входного сигнала, чтобы указать, какие выборки допустимы на каждом уровне. Сигналы в цепи фильтра у всех есть тот же шаг расчета Simulink.

Компенсация CIC, децимация полуполосы и итоговые децимирующие фильтры каждый реализованы блоком MATLAB function и двумя Дискретными КИХ-HDL Фильтра Оптимизированные блоки в многофазном разложении. Многофазное разложение реализует функцию преобразования$H(z) = H_{0}(z) + z^{-1}H_{1}(z)$, где$H(z) = a_{0} + a_{1}z^{-1} + a_{2}z^{-2} + a_{3}z^{-3} + ...$$H_{0}(z) = a_{0} + a_{2}z^{-2} + ...$, и$H_{1}(z) = a_{1} + a_{3}z^{-3} + ...$. Многофазное разложение является эффективным с точки зрения ресурсов способом реализовать децимирующие фильтры. Блок MATLAB function содержит два входа, производит каждые два цикла и передает их одновременно параллельной паре Дискретного КИХ-HDL Фильтра Оптимизированные блоки,$H_{0}(z)$ и$H_{1}(z)$. Более низкий подфильтр $H_{1}(z)$и верхний подфильтр$H_{0}(z)$, каждый содержит половину коэффициентов фильтра и процесса половина входных данных.

Например, CIC Compensation Decimation подсистема реализует фильтр с семью коэффициентами. Верхний подфильтр$H_{0}(z)$, имеет четыре коэффициента и более низкий подфильтр$H_{1}(z)$, имеет три коэффициента. Каждый фильтр получает выборку и генерирует выход каждые 16 циклов. Поскольку каждый фильтр обрабатывает одну выборку каждые 16 циклов, блоки подфильтра могут совместно использовать аппаратные ресурсы вовремя. Чтобы оптимизировать аппаратные ресурсы таким образом, оба из подфильтров имеют набор параметров структуры Фильтра к Partly serial systolic.

Этот рисунок показывает CIC Compensation Decimation подсистема. Halfband Decimation и Final Decimation подсистемы используют ту же структуру.

Модель конфигурирует все блоки фильтра при помощи параметров, заданных в их соответствующих структурах. Например, этот рисунок показывает параметры блоков для блока CIC Compensation Decimation. Количество параметра циклов является минимальным количеством циклов между входными выборками. Частотой дискретизации входа с блоком CIC Compensation Decimation является cicParams.DecimationFactor*compParams.R, который является одной выборкой каждые 16 циклов для каждого подфильтра.

Последовательная реализация фильтра снова использует множители вовремя по количеству тактов, которые вы задаете. Без этой оптимизации, CIC Compensation Decimation подсистема с комплексными входными данными использует 14 множителей. После того, как оптимизация$H_{0}(z)$ и$H_{1}(z)$ каждое использование используют два множителя для в общей сложности четырех. Точно так же Halfband Decimation и Final Decimation подсистемы используют четыре множителя каждый.

Синусоида на тесте несущей и верификации

Чтобы протестировать DDC, модулируйте синусоиду на 40 кГц на несущую частоту и передайте модулируемую синусоиду через DDC. Затем измерьте свободный от паразитных составляющих динамический диапазон (SFDR) получившегося тона и SFDR NCO выход. Постройте SFDR NCO и DDC фиксированной точки выход.

% Initialize random seed before executing any simulations.
rng(0);

% Generate a 40 kHz test tone, modulated onto the carrier.
ddcIn = DDCTestUtils.GenerateTestTone(40e3,Fc);

% Demodulate the test signal with the floating-point DDC.
ddcOut = DDCTestUtils.DownConvert(ddcIn,FsIn,Fc,ddcFilterChain);
release(ddcFilterChain);

% Demodulate the test signal by running the Simulink model.
out = sim(modelName);

% Measure the SFDR of the NCO, floating-point DDC outputs, and fixed-point
% DDC outputs.
results.sfdrNCO = sfdr(real(out.ncoOut),FsIn);
results.sfdrFloatDDC = sfdr(real(ddcOut),FsOut);
results.sfdrFixedDDC = sfdr(real(out.ddcOut),FsOut);

disp('SFDR Measurements');
disp(['   Floating-point DDC SFDR: ',num2str(results.sfdrFloatDDC) ' dB']);
disp(['   Fixed-point NCO SFDR: ',num2str(results.sfdrNCO) ' dB']);
disp(['   Optimized fixed-point DDC SFDR: ',num2str(results.sfdrFixedDDC) ' dB']);
fprintf(newline);

% Plot the SFDR of the NCO and fixed-point DDC outputs.
ddcPlots.ncoOutSDFR = figure;
sfdr(real(out.ncoOut),FsIn);
DDCTestUtils.setPlotNameAndTitle(['NCO Output Signal ' get(gca,'Title').String]);

ddcPlots.OptddcOutSFDR = figure;
sfdr(real(out.ddcOut),FsOut);
DDCTestUtils.setPlotNameAndTitle(['Optimized Fixed-Point DDC Output Signal ' get(gca,'Title').String]);
SFDR Measurements
   Floating-point DDC SFDR: 291.3403 dB
   Fixed-point NCO SFDR: 83.0249 dB
   Optimized fixed-point DDC SFDR: 108.8419 dB

Тест сигнала LTE

Можно использовать тестовый сигнал LTE, чтобы выполнить более строгое тестирование DDC. Сгенерируйте стандартную совместимую форму волны LTE при помощи функций LTE Toolbox™. Затем downconvert форма волны с моделью DDC. Используйте функции LTE Toolbox, чтобы измерить величину вектора ошибок (EVM) получившихся сигналов.

rng(0);
% Execute this test only if you have the LTE Toolbox product.
if license('test','LTE_Toolbox')

    % Generate a modulated LTE test signal by using the LTE Toolbox functions.
    [ddcIn,sigInfo] = DDCTestUtils.GenerateLTETestSignal(Fc);

    % Downconvert the signal with the floating-point DDC.
    ddcOut = DDCTestUtils.DownConvert(ddcIn,FsIn,Fc,ddcFilterChain);
    release(ddcFilterChain);

    % Downconvert the signal with the Simulink model.
    % Pad the input with zeros to represent propagation latency and return the complete result.
    ddcIn = [ddcIn;zeros(320,1)];
    out = sim(modelName);

    results.evmFloat = DDCTestUtils.MeasureEVM(sigInfo,ddcOut);
    results.evmFixed = DDCTestUtils.MeasureEVM(sigInfo,out.ddcOut);

    disp('LTE Error Vector Magnitude (EVM) Measurements');
    disp(['   Floating-point DDC RMS EVM: '  num2str(results.evmFloat.RMS*100,3) '%']);
    disp(['   Floating-point DDC Peak EVM: ' num2str(results.evmFloat.Peak*100,3) '%']);
    disp(['   Fixed-point HDL-optimized DDC RMS EVM: '     num2str(results.evmFixed.RMS*100,3) '%']);
    disp(['   Fixed-point HDL-optimized DDC Peak EVM: '    num2str(results.evmFixed.Peak*100,3) '%']);
    fprintf(newline);

end
LTE Error Vector Magnitude (EVM) Measurements
   Floating-point DDC RMS EVM: 0.633%
   Floating-point DDC Peak EVM: 2.44%
   Fixed-point HDL-optimized DDC RMS EVM: 0.731%
   Fixed-point HDL-optimized DDC Peak EVM: 2.69%

Генерация HDL-кода и реализация FPGA

Чтобы сгенерировать HDL-код для этого примера, у вас должен быть продукт HDL Coder™. Используйте makehdl и makehdltb команды, чтобы сгенерировать HDL-код и испытательный стенд HDL для HDL_DDC подсистема. DDC синтезировался на оценочной плате Xilinx® Zynq®-7000 ZC706. Таблица показывает результаты использования ресурса места-и-маршрута сообщения. Проект соответствовал синхронизации с тактовой частотой 313 МГц.

T = table(...
    categorical({'LUT'; 'LUTRAM'; 'FF'; 'BRAM'; 'DSP'}), ...
    categorical({'2660'; '318'; '5951'; '1.0'; '18'}), ...
    'VariableNames',{'Resource','Usage'})
T =

  5x2 table

    Resource    Usage
    ________    _____

     LUT        2660 
     LUTRAM     318  
     FF         5951 
     BRAM       1.0  
     DSP        18