Реализация Цепи фильтра цифрового преобразователя в HDL

В этом примере показано, как использовать DSP System Toolbox™ и Fixed-Point Designer™ для разработки трехступенчатого многоразового фильтра с фиксированной точкой, который реализует цепь фильтров цифрового понижающего преобразователя (DDC), предназначенного для соответствия спецификации Глобальной системы для мобильных устройств (GSM).

Используя Filter Design HDL Coder™ мы сгенерируем синтезируемый HDL-код для того же трехэтапного, многократного, с фиксированной точкой фильтра. Наконец, используя Simulink ® и HDL Verifier™ MS, мы совместно моделируем фильтры с фиксированной точкой, чтобы убедиться, что сгенерированный HDL-код дает те же результаты, что и эквивалентная поведенческая модель Simulink.

Цифровой преобразователь тока

Цифровые преобразователи частоты (DDC) являются ключевым компонентом цифровых радиостанций. DDC выполняет преобразование частоты, необходимое для преобразования высоких входных частот выборки, обнаруженных в цифровом радио, вниз до более низких частот дискретизации для дальнейшей и легкой обработки. В этом примере DDC работает примерно на 70 МГц и должен снизить скорость до 270 кГц.

Чтобы еще больше ограничить нашу проблему, мы смоделируем один из DDC в GC4016 Multi-Standard Quad DDC Chip от Graychip. Кроме других функций, GC4016 обеспечивает следующие фильтры: пятиступенчатый CIC-фильтр с программируемым коэффициентом десятикратного уменьшения (8-4096); 21-контактная конечная импульсная характеристика фильтр, который децимирует на 2 и имеет программируемые 16-битные коэффициенты; и 63-контактная конечная импульсная характеристика фильтр, который также децимируется на 2 и имеет программируемые 16-битовые коэффициенты.

DDC состоит из числового управляемого генератора (NCO) и смесителя для квадратурного преобразования входного сигнала в полосу частот. Затем сгенерированные модулированные сигналы фильтруют по нижним частотам с помощью фильтра Cascaded Integrator-Comb (CIC), за которым следуют две конечные импульсные характеристики децимирующих фильтра для достижения низкой частоты дискретизации приблизительно 270 кГц, готовых к дальнейшей обработке. Конечная ступень часто включает в себя ресамплер, который интерполирует или децимирует сигнал для достижения желаемой скорости дискретизации в зависимости от применения. Дополнительная фильтрация может быть также достигнута с помощью ресамплера. Ниже приведен блок схема типового DDC.

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

Спецификации GSM

Интересующая пропускная способность GSM составляет 160 кГц. Поэтому трехэтапный многоскоростной фильтр DDC должен быть плоским по этой ширине полосы пропускания в пределах неравномерности в полосе пропускания, которая должна быть менее 0,1 дБ пика до пика. Глядя на маску отторжения вне полосы, показанную ниже, мы видим, что фильтр также должен достичь 18 дБ ослабления на 100 кГц.

В сложение для GSM требуется скорость символа 270,833 Ksps. Поскольку частота дискретизации входного сигнала Graychip совпадает с тактовой частотой 69,333 МГц, мы должны снизить частоту входа до 270,833 кГц. Это требует, чтобы трехступенчатый многоскоростной фильтр децимировался на 256.

Каскадный фильтр интегратора-гребня (CIC)

CIC-фильтры многоскоростных фильтров, которые очень полезны, потому что они могут достичь высоких десятикратного уменьшения (или интерполяции) скоростей и реализованы без умножителей. CIC являются просто прямоугольными фильтрами, реализованными рекурсивно каскадированными с усилителем или понижающим усилителем. Эти характеристики делают CIC очень полезными для цифровых систем, работающих с высокими скоростями, особенно когда эти системы должны быть реализованы в ASIC или FPGA.

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

Проекты и каскад трех фильтров могут быть выполнены через графический пользовательский интерфейс Filter Designer,

но мы будем использовать функциональность командной строки.

CIC определяется следующим образом:

R    = 64; % Decimation factor
D    = 1;  % Differential delay
Nsecs = 5;  % Number of sections

OWL = 20; % Output word length

cic = dsp.CICDecimator('DecimationFactor',R,'NumSections',Nsecs,...
    'FixedPointDataType','Minimum section word lengths',...
    'OutputWordLength',OWL);

Подробные данные CIC можно просмотреть путем вызова метода info.

info(cic)
ans =

  9x56 char array

    'Discrete-Time FIR Multirate Filter (real)               '
    '-----------------------------------------               '
    'Filter Structure    : Cascaded Integrator-Comb Decimator'
    'Decimation Factor   : 64                                '
    'Differential Delay  : 1                                 '
    'Number of Sections  : 5                                 '
    'Stable              : Yes                               '
    'Linear Phase        : Yes (Type 2)                      '
    '                                                        '

Постройте и проанализируем теоретическую величину характеристику CIC-фильтра, которая будет работать на входе 69,333 МГц.

Fs_in = 69.333e6;
fvt = fvtool(cic,'Fs',Fs_in);
fvt.Color = 'White';

Первое, что следует отметить, CIC-фильтр имеет огромный коэффициент усиления полосы пропускания, который обусловлен сложениями и обратной связью внутри структуры. Мы можем нормализовать характеристику величины CIC с помощью соответствующей настройки в FVTool. Нормализация характеристики CIC-фильтра до усиления 0 дБ при постоянном токе облегчает анализ обратной характеристики фильтра следующего каскада.

fvt.NormalizeMagnitudeto1 = 'on';

Другое дело, что изменение масштаба в области полосы пропускания мы видим, что CIC имеет около -0,4 дБ ослабления (падения) на 80 кГц, что в пределах интересующей полосы. CIC-фильтр по существу является каскадом коробчатых фильтров и, следовательно, имеет синус-подобную реакцию, которая вызывает падение. Это падение должно быть компенсировано конечная импульсная характеристика на следующей стадии.

axis([0 .1 -0.8 0]);

Компенсационная конечная импульсная характеристика дециматор

Второй этап нашей цепи фильтров DDC должен компенсировать падение полосы пропускания, вызванное CIC, и децимировать на 2. Поскольку CIC имеет синус-подобный ответ, мы можем компенсировать падение с помощью lowpass, который имеет обратный синус-ответ в полосе пропускания. Этот фильтр будет работать на 1/64-й входной частоте выборки, которая составляет 69,333 МГц, поэтому его скорость 1.0833MHz. Вместо разработки lowpass с обратной характеристикой полосы пропускания с нуля, мы будем использовать консервированную функцию, которая позволяет нам проектировать дециматор с прямой характеристикой компенсации CIC (reverse-sinc).

% Filter specifications
Fs     = 1.0833e6; % Sampling frequency 69.333MHz/64
Apass  = 0.01;     % dB
Astop  = 70;       % dB
Fpass  = 80e3;     % Hz passband-edge frequency
Fstop  = 293e3;    % Hz stopband-edge frequency

% Design decimation filter. D and Nsecs have been defined above as the
% differential delay and number of sections, respectively.
compensator = dsp.CICCompensationDecimator('SampleRate',Fs,...
    'CICRateChangeFactor',R,'CICNumSections',Nsecs,...
    'CICDifferentialDelay',D,'PassbandFrequency',Fpass,...
    'StopbandFrequency',Fstop,'PassbandRipple',Apass,...
    'StopbandAttenuation',Astop);

% Now we have to define the fixed-point attributes of our multirate filter.
% By default, the fixed-point attributes of the accumulator and multipliers
% are set to ensure that full precision arithmetic is used, i.e. no
% quantization takes place. By default, 16 bits are used to represent the
% filter coefficients. Since that is what we want in this case, no changes
% from default values are required.

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

info(compensator)
ans =

  10x56 char array

    'Discrete-Time FIR Multirate Filter (real)               '
    '-----------------------------------------               '
    'Filter Structure   : Direct-Form FIR Polyphase Decimator'
    'Decimation Factor  : 2                                  '
    'Polyphase Length   : 11                                 '
    'Filter Length      : 21                                 '
    'Stable             : Yes                                '
    'Linear Phase       : Yes (Type 1)                       '
    '                                                        '
    'Arithmetic         : double                             '

Каскадирование CIC с обратным фильтром sinc, мы видим, исключили ли мы падение полосы пропускания, вызванное CIC.

cicCompCascade = cascade(cic,compensator);
fvt = fvtool(cic,compensator,cicCompCascade,'Fs',[Fs_in,Fs_in/64,Fs_in]);
fvt.Color = 'White';
fvt.NormalizeMagnitudeto1 = 'on';
axis([0 .1 -0.8 0.8]);
legend(fvt,'cic','compensator','cascade');

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

Конечная импульсная характеристика третьей ступени

Как указывалось ранее, спектральная маска GSM требует ослабления на 18 дБ при 100 кГц. Итак, для нашего третьего и последнего этапа мы можем попробовать простой фильтр lowpass equiripple. Еще раз нам нужно квантовать коэффициенты до 16 бит (по умолчанию). Этот фильтр также должен децимироваться на 2.

N = 62;       % 63 taps
Fs = 541666;  % 541.666 kHz
Fpass = 80e3;
Fstop = 100e3;

spec = fdesign.decimator(2,'lowpass','N,Fp,Fst',N,Fpass,Fstop,Fs);
% Give more weight to passband
decimator = design(spec,'equiripple','Wpass',2,'SystemObject',true);

При определении многоскоростного фильтра по умолчанию размер слова аккумулятора определяется автоматически, чтобы поддерживать полную точность. Однако, поскольку у нас есть только 20 биты для выхода, давайте установим выходной формат на размер слова 20 бит и длину фракции -12. Во-первых, мы должны изменить значение свойства FullPrecisionOverride по умолчанию с true на false.

decimator.FullPrecisionOverride = false;
decimator.OutputDataType = 'custom';
decimator.RoundingMethod = 'nearest';
decimator.OverflowAction = 'Saturate';
decimator.CustomOutputDataType = numerictype([],20,-12);

Мы можем использовать метод информации, чтобы просмотреть детали фильтра.

info(decimator)
ans =

  10x56 char array

    'Discrete-Time FIR Multirate Filter (real)               '
    '-----------------------------------------               '
    'Filter Structure   : Direct-Form FIR Polyphase Decimator'
    'Decimation Factor  : 2                                  '
    'Polyphase Length   : 32                                 '
    'Filter Length      : 63                                 '
    'Stable             : Yes                                '
    'Linear Phase       : Yes (Type 1)                       '
    '                                                        '
    'Arithmetic         : double                             '

Многоступенчатый многомерный фильтр DDC Цепи

Теперь, когда мы разработали и квантовали три фильтра, мы можем получить общую реакцию фильтра, каскадируя нормализованный CIC и две конечные импульсные характеристики фильтра. Снова, мы используем нормированную величину, чтобы убедиться, что каскадная реакция фильтра нормирована к 0 дБ.

ddc = cascade(cic,compensator,decimator);
fvt = fvtool(ddc,'Fs',Fs_in);
fvt.Color = 'White';
fvt.NormalizeMagnitudeto1 = 'on';
fvt.NumberofPoints = 8192*3;
axis([0 1 -200 10]);  % Zoom-in

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

drawgsmmask;

Мы видим, что наша общая фильтрующая реакция находится в пределах ограничений спектральной маски GSM. Мы также должны гарантировать, что неравномерность в полосе пропускания соответствует требованию, что она составляет менее 0,1 дБ от пика до пика. Мы можем проверить это, увеличив масштаб с помощью команды axis.

axis([0 .09 -0.08 0.08]);

Действительно, неравномерность в полосе пропускания намного ниже требования GSM от пика до пика на 0,1 дБ.

Сгенерируйте код VHDL

Filter Designer также поддерживает генерацию HDL-кода из диалогового окна, показанного ниже.

Из Filter Designer, а также из командной строки вы можете сгенерировать код VHDL или Verilog, а также испытательные стенды в VHDL или Verilog файлах. Кроме того, у вас есть возможность настроить сгенерированный HDL-код, указав много опций, чтобы соответствовать вашим стандартам кодирования и руководствам.

Однако здесь мы будем использовать функциональность командной строки для генерации HDL-кода.

Теперь, когда у нас есть наш фиксированный, трехэтапный, многоскоростной фильтр соответствовать спецификациям, мы готовы сгенерировать HDL-код.

Каскад CIC и две конечные импульсные характеристики и генерирует VHDL.

Чтобы избежать квантования данных с фиксированной точкой, поступающих из смесителя, который имеет размер слова 20 бит и длину фракции 18 бит (S20,18), мы зададим вход размера слова и длину фракции CIC те же значения, S20,18.

%hcas = cascade(hcic,hcfir,hpfir);
workingdir = tempname;
inT = numerictype(1,20,18);
generatehdl(ddc,'InputDataType', inT,...
    'Name','filter','TargetLanguage','VHDL',...
    'TargetDirectory',fullfile(workingdir,'hdlsrc'));
### Starting VHDL code generation process for filter: filter
### Cascade stage # 1
### Starting VHDL code generation process for filter: filter_stage1
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage1.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage1.vhd</a>
### Starting generation of filter_stage1 VHDL entity
### Starting generation of filter_stage1 VHDL architecture
### Section # 1 : Integrator
### Section # 2 : Integrator
### Section # 3 : Integrator
### Section # 4 : Integrator
### Section # 5 : Integrator
### Section # 6 : Comb
### Section # 7 : Comb
### Section # 8 : Comb
### Section # 9 : Comb
### Section # 10 : Comb
### Successful completion of VHDL code generation process for filter: filter_stage1
### Cascade stage # 2
### Starting VHDL code generation process for filter: filter_stage2
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage2.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage2.vhd</a>
### Starting generation of filter_stage2 VHDL entity
### Starting generation of filter_stage2 VHDL architecture
### Successful completion of VHDL code generation process for filter: filter_stage2
### Cascade stage # 3
### Starting VHDL code generation process for filter: filter_stage3
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage3.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter_stage3.vhd</a>
### Starting generation of filter_stage3 VHDL entity
### Starting generation of filter_stage3 VHDL architecture
### Successful completion of VHDL code generation process for filter: filter_stage3
### Generating: <a href="matlab:edit('/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter.vhd')">/tmp/BR2021ad_1584584_202060/publish_examples1/tp186374c3_6fff_481e_ac21_05a03b83fa09/hdlsrc/filter.vhd</a>
### Starting generation of filter VHDL entity
### Starting generation of filter VHDL architecture
### Successful completion of VHDL code generation process for filter: filter
### HDL latency is 2 samples

Совместное моделирование HDL с ModelSim в Simulink

Чтобы убедиться, что сгенерированный HDL-код дает те же результаты, что и наша модель Simulink, мы будем использовать HDL Verifier MS, чтобы совместное моделирование нашего HDL-кода в Simulink. У нас есть предварительно построенная модель Simulink, которая включает два сигнальных пути. Один путь сигнала генерирует результаты поведенческой модели Simulink трехэтапного многоскоростного фильтра. Другой путь дает результаты симуляции с помощью ModelSim ® сгенерированного нами кода VHDL.

open_system('ddcfilterchaindemo_cosim');

Запустите ModelSim, дважды нажатие на кнопку в модели Simulink. Обратите внимание, что ModelSim должен быть установлен и на системном пути. ModelSim автоматически скомпилирует HDL-код, инициализирует симуляцию и откроет средство просмотра.

Когда ModelSim готов запустить модель Simulink. Это позволит выполнить совместное моделирование с ModelSim и автоматически открыть Time Scope для просмотра результатов.

Используйте Logic Analyzer для просмотра результатов.

Проверка результатов

Трассировка на верхнюю часть является сигналом щебета возбуждения. Следующий сигнал, помеченный как «ref», является опорным сигналом, генерируемым поведенческой моделью Simulink трехступенчатого многоскоростного фильтра. Нижняя трассировка, помеченная «cosim» на возможностях, относится к результатам симуляции ModelSim сгенерированного HDL-кода трехэтапного многоскоростного фильтра. Последняя трассировка показывает ошибку между результатами поведенческой модели Simulink и симуляцией ModelSim HDL-кода.

Сводные данные

Мы использовали несколько MathWorks™ продуктов для разработки и анализа трехэтапной, многоразовой, с фиксированной точкой фильтрующей цепи DDC для GSM-приложения. Затем мы сгенерировали HDL-код для реализации фильтра и верифицировали сгенерированный код путем сравнения поведенческой модели Simulink с HDL-кодом, моделируемым в ModelSim через HDL Verifier MS.

Для просмотра документации необходимо авторизоваться на сайте