HDL- Реализации цифрового преобразователя для LTE

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

Введение

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

  1. Синусоида, модулированная на несущей IF на 32 МГц.

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

Пример измеряет качество сигнала путем преобразования вниз выходных данных DUC с плавающей и фиксированной точками и сравнивает эти два. Наконец, представлены результаты реализации ПЛИС.

Примечание: Этот пример использует DUCTestUtils, класс helper, содержащий функции для генерации стимула и анализа выхода DUC. Смотрите DUCTestUtils.m файл для получения дополнительной информации.

Структура DUC

DUC состоит из интерполирующей цепи фильтров, Численно Управляемого Генератора (NCO) и смесителя. Фильтрующая цепь состоит из lowpass интерполятора, полуполосы интерполятора, CIC компенсационного интерполятора ( конечной импульсной характеристики), CIC интерполятора и коррекции усиления.

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

Первый интерполятор lowpass реализует точное Fpass и Fstop характеристики DUC. Полуполоса является промежуточным интерполятором. Из-за более низких частот дискретизации фильтры около начала цепи могут оптимизировать использование ресурсов путем совместного использования множителей. Интерполятор компенсации CIC улучшает спектральный ответ путем компенсации более позднего падения CIC при интерполяции на два. Интерполятор CIC обеспечивает большой коэффициент интерполяции, что заставляет цепь фильтров достигать требований к повышенной дискретизации. Ниже приведен блок схема DUC.

Вход DUC дискретизируется на уровне 1,92 Msps, в то время как выходная частота выборки составляет 122,88 Msps. Поэтому общий коэффициент интерполяции равен 64. 1.92 Msps является типовой частотой дискретизации, используемой приемниками LTE для выполнения поиска камеры и восстановления MIB (Master Information Block). Поэтому фильтры DUC были разработаны, чтобы соответствовать этому приложению. DUC оптимизирован для работы с тактовой частотой 122,88 МГц.

Проект DUC

В этом разделе объясняется, как спроектировать DUC с использованием операций с плавающей точкой и функций создания фильтра в MATLAB ®. Объект DUC позволяет вам задать несколько характеристик, которые задают ответ каскада для четырех фильтров, включая частоты полосы пропускания и полосы остановки, неравномерность в полосе пропускания и затухание в полосе задерживания.

Параметры DUC

Желаемая характеристика DUC определяется частотой дискретизации на входе, частотой несущей и характеристиками фильтра. Изменение этой желательной характеристики фильтра может потребовать изменений в свойствах HDL-блоков блоков фильтра в модели Simulink. Свойства блоков обсуждаются ниже в этом примере.

FsIn  = 1.92e6;     % Sampling rate at input to DUC
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

Первый Lowpass интерполятор

lowpassParams.FsIn                = FsIn;
lowpassParams.InterpolationFactor = 2;
lowpassParams.FsOut               = FsIn * lowpassParams.InterpolationFactor;

lowpassSpec = fdesign.interpolator(lowpassParams.InterpolationFactor,'lowpass',...
              'Fp,Fst,Ap,Ast',Fpass,Fstop,Ap,Ast,lowpassParams.FsOut);

lowpassFilt = design(lowpassSpec,'SystemObject',true)
lowpassFilt = 

  dsp.FIRInterpolator with properties:

        NumeratorSource: 'Property'
              Numerator: [1x69 double]
    InterpolationFactor: 2

  Use get to show all properties

Использование fvtool отображение амплитудной характеристики lowpass без коррекции усиления.

ducPlots.lowpass = fvtool(lowpassFilt,'Fs',FsIn*2,'Legend','off');

DUCTestUtils.setPlotNameAndTitle('Lowpass Interpolator');

Интерполятор Второй Полуполосы

 hbParams.FsIn                = lowpassParams.FsOut;
 hbParams.InterpolationFactor = 2;
 hbParams.FsOut               = lowpassParams.FsOut *  hbParams.InterpolationFactor;
 hbParams.TransitionWidth     = hbParams.FsIn - 2 * Fstop;
 hbParams.StopbandAttenuation = Ast;

 hbSpec = fdesign.interpolator(hbParams.InterpolationFactor,'halfband',...
          'TW,Ast',...
          hbParams.TransitionWidth,...
          hbParams.StopbandAttenuation,...
          hbParams.FsOut);

hbFilt = design(hbSpec,'SystemObject',true)
hbFilt = 

  dsp.FIRInterpolator with properties:

        NumeratorSource: 'Property'
              Numerator: [1x11 double]
    InterpolationFactor: 2

  Use get to show all properties

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

ducFilterChain           = dsp.FilterCascade(lowpassFilt,hbFilt);
ducPlots.hbFilt          = fvtool(lowpassFilt,hbFilt,ducFilterChain,...
                           'Fs',[FsIn*2,FsIn*4,FsIn*4]);

legend(...
       'Lowpass Interpolator', ...
       'Halfband Interpolator', ...
       'Lowpass+Halfband');

DUCTestUtils.setPlotNameAndTitle('Halfband Interpolator');

Интерполятор компенсации CIC

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

compParams.FsIn                 = hbParams.FsOut;
compParams.InterpolationFactor  = 2;                                                   % CIC compensation interpolation factor
compParams.FsOut                = compParams.FsIn * compParams.InterpolationFactor;    % New sampling rate
compParams.Fpass                = 1/2 * compParams.FsIn + Fpass;                       % CIC comp passband frequency
compParams.Fstop                = 1/2 * compParams.FsIn + 1/4 * compParams.FsIn;       % CIC comp stopband frequency
compParams.Ap                   = Ap;                                                  % Same Ap as overall filter
compParams.Ast                  = Ast;                                                 % Same Ast as overall filter

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

cicParams.InterpolationFactor   = 8;        % CIC interpolation factor
cicParams.DifferentialDelay     = 1;        % CIC interpolator differential delay
cicParams.NumSections           = 3;        % CIC interpolator number of integrator and comb sections

compSpec = fdesign.interpolator(compParams.InterpolationFactor,'ciccomp',...
           cicParams.DifferentialDelay,...
           cicParams.NumSections,...
           cicParams.InterpolationFactor,...
           'Fp,Fst,Ap,Ast',...
           compParams.Fpass,compParams.Fstop,compParams.Ap,compParams.Ast,...
           compParams.FsOut);


compFilt = design(compSpec,'SystemObject',true)
compFilt = 

  dsp.FIRInterpolator with properties:

        NumeratorSource: 'Property'
              Numerator: [1x36 double]
    InterpolationFactor: 2

  Use get to show all properties

Постройте график ответа CIC Компенсационного Интерполятора.

ducFilterChain           = dsp.FilterCascade(lowpassFilt,hbFilt,compFilt);
ducPlots.cicComp         = fvtool(lowpassFilt,hbFilt,compFilt,ducFilterChain,...
                           'Fs',[FsIn*2,FsIn*4,FsIn*8,FsIn*8]);

legend(...
       'Lowpass Interpolator', ...
       'Halfband Interpolator', ...
       'CIC Comp Interpolator', ...
       'Lowpass+Halfband+CIC Comp');

DUCTestUtils.setPlotNameAndTitle('CIC Comp Interpolator');

Интерполятор CIC

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

cicParams.FsIn              = compParams.FsOut;
cicParams.FsOut             = cicParams.FsIn * cicParams.InterpolationFactor;

cicFilt = dsp.CICInterpolator(cicParams.InterpolationFactor,...
          cicParams.DifferentialDelay,cicParams.NumSections) %#ok<*NOPTS>
cicFilt = 

  dsp.CICInterpolator with properties:

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

Визуализируйте величину ответ интерполяции CIC. CIC-фильтры всегда используют арифметику с фиксированной точкой внутри, поэтому fvtool строит графики как квантованных, так и неквантованных ответов.

ducFilterChain      = dsp.FilterCascade(lowpassFilt,hbFilt,compFilt,cicFilt);
ducPlots.cicInter   = fvtool(lowpassFilt,hbFilt,compFilt,cicFilt,ducFilterChain,...
                      'Fs',[FsIn*2,FsIn*4,FsIn*8,FsIn*64,FsIn*64]);

legend(...
       'First Halfband Interpolator', ...
       'Second Halfband Interpolator', ...
       'CIC Compensation Interpolator', ...
       'CIC Interpolator: Quantized',...
       'CIC Interpolator: Reference',...
       'Overall Response: Quantized',...
       'Overall Response: Reference');

DUCTestUtils.setPlotNameAndTitle('Lowpass + Halfband + CIC Comp + CIC Interpolator');

Для каждого интерполятора существует коэффициент усиления постоянного тока, определяемый его коэффициентом интерполяции. Для интерполятора CIC из-за его реализации он имеет больший коэффициент усиления, чем другие фильтры. Использование gain для получения коэффициента усиления интерполятора CIC. Полный коэффициент усиления является степенью двух, поэтому его можно легко исправить в оборудование с операцией сдвига. В целях анализа коррекция усиления представлена в MATLAB одним контактом dsp.FIRFilter Системный объект. Объедините цепь фильтров и фильтр коррекции усиления в dsp.FilterCascade Системный объект.

cicGain  = gain(cicFilt)

Gain     = lowpassParams.InterpolationFactor * hbParams.InterpolationFactor * compParams.InterpolationFactor * cicParams.InterpolationFactor * cicGain;

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

    64


GainCorr = 

  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: 2.4414e-04
    InitialConditions: 0

  Use get to show all properties

Общая цепь ответ с коррекцией усиления и без нее.

ducPlots.overallResponse = fvtool(ducFilterChain,dsp.FilterCascade(ducFilterChain,GainCorr),...
                           'Fs',[FsIn*64,FsIn*64]);

DUCTestUtils.setPlotNameAndTitle('Overall DUC Chain Response');

legend(...
       'Overall Response: No Gain Correction (Quantized)',...
       'Overall Response: No Gain Correction (Reference)',...
       'Overall Response: Gain Correction (Quantized)',...
       'Overall Response: Gain Correction (Reference)');

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

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

Квантование фильтра

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

% First Lowpass Interpolator
lowpassFilt.FullPrecisionOverride      = false;
lowpassFilt.CoefficientsDataType       = 'Custom';
lowpassFilt.CustomCoefficientsDataType = numerictype([],16,15);
lowpassFilt.ProductDataType            = 'Full precision';
lowpassFilt.AccumulatorDataType        = 'Full precision';
lowpassFilt.OutputDataType             = 'Custom';
lowpassFilt.CustomOutputDataType       = numerictype([],18,14);

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

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

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

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

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

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

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

Смотрите эффекты квантования с помощью fvtool. Фильтры могут быть проанализированы индивидуально или в каскаде. fvtool показывает квантованные и неквантованные (ссылочные) наложенные ответы. Для примера показан эффект квантования первой ступени конечной импульсной характеристики фильтра.

ducPlots.quantizedFIR = fvtool(lowpassFilt,'Fs',lowpassParams.FsIn*2,'arithmetic','fixed');

DUCTestUtils.setPlotNameAndTitle('Quantized Lowpass Interpolator');

legend(...
       'Lowpass Interpolator: Quantized', ...
       'Lowpass Interpolator: Reference');

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

ducFilterChain                = dsp.FilterCascade(lowpassFilt,hbFilt,compFilt,cicFilt,GainCorr);
ducPlots.quantizedDUCResponse = fvtool(ducFilterChain,'Fs',FsIn*64,'Arithmetic','fixed');

DUCTestUtils.setPlotNameAndTitle('Quantized DUC Filter Chain');

legend(...
       'DUC filter chain: Quantized', ...
       'DUC filter chain: Reference');

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

Следующим шагом в процессе проекта является реализация DUC в Simulink с использованием HDL Coder совместимых блоков.

Моделирование Строения

Модель полагается на переменные в рабочем пространстве MATLAB, чтобы сконфигурировать блоки и настройки. Он использует уже определенные переменные цепи фильтров. Затем задайте параметры Численно Управляемого Генератора (NCO) и входной сигнал.

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

ducIn = 0; %#ok<NASGU>

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

Показан верхний уровень модели DUC Simulink. Модель импортирует ducIn из рабочего пространства MATLAB с помощью блока Signal From Workspace преобразует его в 16-битные и затем применяет к DUC. HDL-код может быть сгенерирован из подсистемы HDL_DUC.

modelName = 'DUCforLTEHDL';
open_system(modelName);
set_param(modelName, 'Open','on');

Реализация DUC находится внутри подсистемы HDL_DUC.

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

Фильтрация Параметров блоков

Все фильтры настроены на наследование свойств соответствующих системных объектов. Каждый блок также имеет набор свойств HDL, которые используются для оптимизации полученного HDL-кода. В частности, блоки lowpass, Halfband и CIC Composition работают со частотами дискретизации, которые ниже тактовой частоты (Fclk) на коэффициенты 32, 16 и 8 соответственно. Эти блоки используют методы сериализации (совместного использования ресурсов), чтобы минимизировать использование аппаратных ресурсов. Для примера вход блока Lowpass Interpolation дискретизируется на Fclk/32, поэтому для обработки каждой входной выборки доступны 32 тактовых импульса. Когда для DUC генерируется HDL-код, HDL Coder перечисляет все SerialPartition опции, доступные для блоков фильтра, основанные на их коэффициентах. Самое большое значение в SerialPartition вектор представляет коэффициент совместного использования фильтра. В этом примере HDL Coder приводит минимальное использование множителя, когда SerialPartition блока Lowpass Interpolation установлено в 17, так что он использует 17 тактов, доступных ему. Для получения дополнительной информации см. SerialPartition (HDL Coder) и HDL Filter Architectures (HDL Coder).

Коррекция усиления

Коррекция усиления делит выход на 4096, что эквивалентно перемене вправо на 12 бит. Количество бит как на входе, так и на выходе коррекции усиления составляет 18 битов, поэтому этот сдвиг реализован простым переосмыслением типа данных, как показано.

set_param([modelName '/HDL_DUC/Gain Correction'],'Open','on');

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

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

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

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

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

Чтобы протестировать DUC, 40kHz синусоида передается через DUC и модулируется на несущей частоте. Модулированный сигнал затем демодулируется и повторно дискретизируется на конце приемника. Затем измерьте Ложную Свободную Динамическую Область значений (SFDR) полученного тонального сигнала и SFDR вывода NCO.

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

% Generate a 40kHz test tone
ducIn = DUCTestUtils.GenerateTestTone(40e3);

% Up convert the test signal with the floating point DUC.
ducTx = DUCTestUtils.UpConvert(ducIn,FsIn*64,Fc,ducFilterChain);
release(ducFilterChain);

% Down convert the output of DUC.
ducRx = DUCTestUtils.DownConvert(ducTx,FsIn*64,Fc);

% Up convert the test signal by executing the fixed-point Simulink model with the sim function.
simOut = sim(modelName);

% Downconvert the output of DUC.
simTx = simOut.ducOut;
simRx = DUCTestUtils.DownConvert(simTx,FsIn*64,Fc);

% Measure the SFDR of the NCO, floating point DUC and the fixed-point DUC outputs.
results.sfdrNCO      = sfdr(real(simOut.ncoOut),FsIn);
results.sfdrFloatDUC = sfdr(real(ducRx),FsIn);
results.sfdrFixedDUC = sfdr(real(simRx),FsIn);

disp('Spurious Free Dynamic Range (SFDR) Measurements');
disp(['   Floating point DUC SFDR: ',num2str(results.sfdrFloatDUC) ' dB']);
disp(['   Fixed-point NCO SFDR: ',num2str(results.sfdrNCO) ' dB']);
disp(['   Fixed-point DUC SFDR: ',num2str(results.sfdrFixedDUC) ' dB']);
fprintf(newline);

% Plot the SFDR of the NCO and fixed-point DUC outputs.
ducPlots.ncoOutSDFR = figure;
sfdr(real(simOut.ncoOut),FsIn);
DUCTestUtils.setPlotNameAndTitle(['NCO Out ' get(gca,'Title').String]);

ducPlots.ducOutSDFR = figure;
sfdr(real(simRx),FsIn);
DUCTestUtils.setPlotNameAndTitle(['Fixed-Point DUC Out ' get(gca,'Title').String]);
Spurious Free Dynamic Range (SFDR) Measurements
   Floating point DUC SFDR: 287.7185 dB
   Fixed-point NCO SFDR: 86.0718 dB
   Fixed-point DUC SFDR: 92.8885 dB

Тестирование и верификация LTE

Тестовый сигнал LTE используется для выполнения более строгой проверки DUC. LTE Toolbox™ используется, чтобы сгенерировать стандартную совместимую с LTE форму волны. Форма волны преобразуется вверх с DUC и затем модулируется на несущей. LTE Toolbox используется для измерения величины вектора ошибок (EVM) полученных сигналов.

% Only execute this test if an LTE Toolbox license is present.
if license('test','LTE_Toolbox')

    % Generate a LTE test signal with LTE Toolbox
    [ducIn, sigInfo] = DUCTestUtils.GenerateLTETestSignal();

    % Upconvert with a MATLAB Floating Point Model and modulate onto carrier
    ducTx = DUCTestUtils.UpConvert(ducIn,FsIn*64,Fc,ducFilterChain);
    release(ducFilterChain);

    % Add noise to transmit signal
    ducTxAddNoise = DUCTestUtils.AddNoise(ducTx);

    % Downconvert received signal
    ducRx = DUCTestUtils.DownConvert(ducTxAddNoise,FsIn*64,Fc);

    % Upconvert using Simulink model
    simOut = sim(modelName);

    % Add noise to transmit signal
    simTx = simOut.ducOut;
    simTxAddNoise = DUCTestUtils.AddNoise(simTx);

    % Downconvert received signal
    simRx = DUCTestUtils.DownConvert(simTxAddNoise,FsIn*64,Fc);

    results.evmFloat = DUCTestUtils.MeasureEVM(sigInfo,ducRx);
    results.evmFixed = DUCTestUtils.MeasureEVM(sigInfo,simRx);

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

end
LTE Error Vector Magnitude (EVM) Measurements
   Floating point DUC RMS EVM: 0.782%
   Floating point DUC Peak EVM: 2.42%
   Fixed-point DUC RMS EVM: 0.755%
   Fixed-point DUC Peak EVM: 2.76%

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

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

T = table(...
    categorical({'LUT'; 'LUTRAM'; 'FF'; 'BRAM'; 'DSP'}),...
    categorical({'3497'; '370'; '4871'; '0.5'; '10'}),...
    'VariableNames',{'Resource','Usage'})
T =

  5x2 table

    Resource    Usage
    ________    _____

     LUT        3497 
     LUTRAM     370  
     FF         4871 
     BRAM       0.5  
     DSP        10