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

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

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

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

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

Создайте интерполятор конечную импульсную характеристику с 32 касаниями с коэффициентом интерполяции 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 касаниями с коэффициентом интерполяции 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 '. Стимул для испытательного стенда задается с помощью свойства 'TestBenchUserStimulus'.

Предположим, что 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 на стимул щебета:

Заключение

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