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

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

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

Цифровой понижающий преобразователь

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

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

DDC состоит из Числового управляемого генератора (NCO), и микшер к квадратуре вниз преобразуют входной сигнал в основную полосу. Сгенерированный модулированный сигнал является затем низкой передачей, отфильтрованной Каскадным интегрально-гребенчатым (CIC) фильтром, сопровождаемым двумя КИХ-фильтрами десятикратного уменьшения, чтобы достигнуть низкой частоты дискретизации приблизительно 270 кГц, готовых к последующей обработке. Заключительный этап часто включает resampler, который интерполирует или десятикратно уменьшает сигнал достигнуть желаемой частоты дискретизации в зависимости от приложения. Дальнейшая фильтрация может также быть достигнута с resampler. Блок-схему типичного DDC показывают ниже.

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

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

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

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

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

CIC-фильтры являются многоскоростными фильтрами, которые очень полезны, потому что они могут достигнуть высокой децимации (или интерполяция) уровни и реализованы без множителей. CICS является просто фильтрами серии длинных импульсов, реализованными рекурсивно расположенный каскадом с upsampler или downsampler. Они характеристика делает CICS очень полезным для цифровых систем, действующих на высоких показателях, особенно когда эти системы должны быть реализованы в ASICs или FPGAs.

Несмотря на то, что CICS имеет желательные характеристики, у них также есть некоторые недостатки, прежде всего то, что они подвергаются затуханию в области полосы пропускания из-за их подобного sinc ответа. По этой причине CICS часто должен сопровождаться фильтром компенсации. Фильтр компенсации должен иметь обратный-sinc ответ в области полосы пропускания, чтобы снять свисание, вызванное 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(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 усилений дБ в DC облегчит анализировать наложенный ответ фильтра следующего фильтра этапа.

fvt.NormalizeMagnitudeto1 = 'on';

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

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

КИХ компенсации Decimator

Второй этап нашей цепи фильтра DDC должен компенсировать свисание полосы пропускания, вызванное CIC, и десятикратно уменьшить 2. Поскольку CIC имеет подобный sinc ответ, мы можем компенсировать свисание с фильтром lowpass, который имеет обратный-sinc ответ в полосе пропускания. Этот фильтр будет работать с 1/64-м входной частотой дискретизации, которая составляет 69,333 МГц, поэтому ее уровень составляет 1.0833 МГц. Вместо того, чтобы проектировать фильтр lowpass с обратным-sinc ответом полосы пропускания с нуля, мы будем использовать консервированную функцию, которая позволяет нам спроектировать decimator с Компенсацией CIC (инверсия-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(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 и КИХ-ответом компенсации, свисание полосы пропускания было устранено.

КИХ третьей стадии Decimator

Как обозначено ранее GSM спектральная маска требует затухания 18 дБ на уровне 100 кГц. Так, для нашей третьей стадии и заключительного этапа мы можем попробовать простой equiripple фильтр lowpass. Еще раз мы должны квантовать коэффициенты к 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 от истинного до лжи.

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([0 .09 -0.08 0.08]);

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

Сгенерируйте код 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/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/hdlsrc/filter_stage1.vhd')">/tmp/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/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/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/hdlsrc/filter_stage2.vhd')">/tmp/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/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/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/hdlsrc/filter_stage3.vhd')">/tmp/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/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/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/hdlsrc/filter.vhd')">/tmp/BR2019bd_1170825_64229/publish_examples1/tp3c911b68_8060_4a8c_9815_236fbd9463cc/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

Co-симуляция HDL с ModelSim в Simulink

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

open_system('ddcfilterchaindemo_cosim');

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

Когда ModelSim является готовым запуском модель Simulink. Это выполнит co-симуляцию с ModelSim и автоматически откроет Осциллограф Времени, чтобы просмотреть результаты.

Используйте Logic Analyzer, чтобы просмотреть результаты.

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

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

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

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