exponenta event banner

Цифровой повышающий преобразователь HDL (DUC)

В этом примере показано, как генерировать код HDL для цифрового повышающего преобразователя (DUC). DUC - это цифровая схема, которая преобразует цифровой сигнал основной полосы в сигнал полосы пропускания. Входной сигнал основной полосы частот дискретизируется с относительно низкой частотой дискретизации, обычно с частотой символов цифровой модуляции. Сигнал основной полосы частот фильтруется и преобразуется на более высокую частоту дискретизации перед модуляцией несущей частоты прямого цифрового синтезирования (DDS).

Входные сигналы проходят через три ступени фильтрации. Каждый каскад сначала фильтрует сигналы фильтром интерполяции нижних частот, а затем выполняет изменение частоты дискретизации. DUC в этом примере представляет собой каскад из двух фильтров интерполяции FIR и одного фильтра интерполяции CIC. Первый фильтр интерполяции КИХ является фильтром КИХ формирования импульсов, который увеличивает частоту дискретизации на 2 и выполняет формирование импульсов Найквиста передатчика. Второй фильтр интерполяции КИХ является компенсационным фильтром КИХ, который увеличивает частоту дискретизации на 2 и компенсирует искажение следующего фильтра CIC. Фильтр интерполяции CIC увеличивает частоту дискретизации на 32.

Фильтры реализованы в режиме фиксированной точки. Задаются длина слова ввода/вывода и длина дроби. Внутренние настройки первых двух фильтров задаются, а внутренние настройки фильтра ЦВК рассчитываются автоматически для сохранения полной точности.

Создание фильтра FIR формирования импульсов

Создайте 32-отводный FIR-интерполятор с коэффициентом интерполяции 2.

pulseShapingFIR = dsp.FIRInterpolator;
pulseShapingFIR.InterpolationFactor = 2;
pulseShapingFIR.Numerator = [...
     0.0007    0.0021   -0.0002   -0.0025   -0.0027    0.0013    0.0049    0.0032 ...
    -0.0034   -0.0074   -0.0031    0.0060    0.0099    0.0029   -0.0089   -0.0129 ...
    -0.0032    0.0124    0.0177    0.0040   -0.0182   -0.0255   -0.0047    0.0287 ...
     0.0390    0.0049   -0.0509   -0.0699   -0.0046    0.1349    0.2776    0.3378 ...
     0.2776    0.1349   -0.0046   -0.0699   -0.0509    0.0049    0.0390    0.0287 ...
    -0.0047   -0.0255   -0.0182    0.0040    0.0177    0.0124   -0.0032   -0.0129 ...
    -0.0089    0.0029    0.0099    0.0060   -0.0031   -0.0074   -0.0034    0.0032 ...
     0.0049    0.0013   -0.0027   -0.0025   -0.0002    0.0021    0.0007 ];

Создать фильтр коррекции

Создайте 11-отводный FIR-интерполятор с коэффициентом интерполяции 2.

compensationFIR = dsp.FIRInterpolator;
compensationFIR.InterpolationFactor = 2;
compensationFIR.Numerator = [...
    -0.0007   -0.0009    0.0039    0.0120    0.0063   -0.0267   -0.0592   -0.0237 ...
     0.1147    0.2895    0.3701    0.2895    0.1147   -0.0237   -0.0592   -0.0267 ...
     0.0063    0.0120    0.0039   -0.0009   -0.0007];

Создание интерполяционного фильтра CIC

Создайте 5-ступенчатый интерполятор CIC с коэффициентом интерполяции 32.

CICFilter = dsp.CICInterpolator;
CICFilter.InterpolationFactor = 32;
CICFilter.NumSections = 5;

Каскад фильтров

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

DUC = dsp.FilterCascade(pulseShapingFIR, compensationFIR, CICFilter);
fvtool(DUC);

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference.

Создание кода VHDL для DUC и испытательного стенда

Создание синтезируемого и переносимого кода VHDL для каскадного фильтра.

Имеется возможность создания стенда тестирования файлов VHDL, Verilog или ModelSim ® .do для проверки соответствия конструкции HDL фильтру MATLAB ®.

Чтобы создать Verilog вместо VHDL, измените значение свойства TargetLanguage с VHDL на Verilog.

Создайте сигнал стимула для фильтра. Длина стимула должна быть больше, чем общая задержка фильтра.

Создайте стенд тестирования VHDL, чтобы убедиться, что результаты точно соответствуют результатам MATLAB. Для этого передайте другое свойство GenerateHDLTestbench и установите для него значение on. Стимул для тестового стенда задается с помощью свойства «StartBenchUserStimulus».

Предположим, что 16-битный вход со знаком фиксированной точки имеет 15 бит дроби.

t = 0.005:0.005:1.5;
stim = chirp(t, 0, 1, 150);

workingdir = tempname;
generatehdl(DUC, 'Name', 'hdlduc',...
                  'TargetLanguage', 'VHDL',...
                  'TargetDirectory', workingdir, ...
                  'GenerateHDLTestbench', 'on', ...
                  'TestBenchUserStimulus', stim, ...
                  'InputDataType', numerictype(1,16,15));
### Starting VHDL code generation process for filter: hdlduc
### Cascade stage # 1
### Starting VHDL code generation process for filter: hdlduc_stage1
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tpda30acc5_94a0_4bda_9ab4_556e19e2db41/hdlduc_stage1.vhd
### Starting generation of hdlduc_stage1 VHDL entity
### Starting generation of hdlduc_stage1 VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlduc_stage1
### Cascade stage # 2
### Starting VHDL code generation process for filter: hdlduc_stage2
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tpda30acc5_94a0_4bda_9ab4_556e19e2db41/hdlduc_stage2.vhd
### Starting generation of hdlduc_stage2 VHDL entity
### Starting generation of hdlduc_stage2 VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlduc_stage2
### Cascade stage # 3
### Starting VHDL code generation process for filter: hdlduc_stage3
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tpda30acc5_94a0_4bda_9ab4_556e19e2db41/hdlduc_stage3.vhd
### Starting generation of hdlduc_stage3 VHDL entity
### Starting generation of hdlduc_stage3 VHDL architecture
### Section # 1 : Comb
### Section # 2 : Comb
### Section # 3 : Comb
### Section # 4 : Comb
### Section # 5 : Comb
### Section # 6 : Integrator
### Section # 7 : Integrator
### Section # 8 : Integrator
### Section # 9 : Integrator
### Section # 10 : Integrator
### Successful completion of VHDL code generation process for filter: hdlduc_stage3
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tpda30acc5_94a0_4bda_9ab4_556e19e2db41/hdlduc.vhd
### Starting generation of hdlduc VHDL entity
### Starting generation of hdlduc VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlduc
### HDL latency is 225 samples
### Starting generation of VHDL Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 300 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tpda30acc5_94a0_4bda_9ab4_556e19e2db41/hdlduc_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

Результаты моделирования ModelSim ®

На следующем экране показан имитатор ModelSim HDL, работающий с этими тестовыми стендами.

Ответ DUC на стимул чирпа:

Заключение

В этом примере были разработаны три отдельных интерполяционных фильтра, они были каскадированы в цифровой повышающий преобразователь, проверены частотные характеристики фильтра и вызваны функциями Coder™ HDL конструкции фильтра для генерации кода VHDL для фильтра и тестовым стендом VHDL для проверки кода VHDL по его результату MATLAB. Результат моделирования кода VHDL доказал, что сгенерированный фильтр VHDL создал битовую реализацию фильтра MATLAB.