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

Этот пример иллюстрирует, как сгенерировать 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);

Сгенерируйте код 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/BR2019bd_1276998_130124/mlx_to_docbook1/tp136e7f17_5a7b_4b67_84b4_662da8484616/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/BR2019bd_1276998_130124/mlx_to_docbook1/tp136e7f17_5a7b_4b67_84b4_662da8484616/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/BR2019bd_1276998_130124/mlx_to_docbook1/tp136e7f17_5a7b_4b67_84b4_662da8484616/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/BR2019bd_1276998_130124/mlx_to_docbook1/tp136e7f17_5a7b_4b67_84b4_662da8484616/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/BR2019bd_1276998_130124/mlx_to_docbook1/tp136e7f17_5a7b_4b67_84b4_662da8484616/hdlduc_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

ModelSim® Simulation Results

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

Ответ DUC на стимул щебета:

Заключение

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