Этот пример иллюстрирует, как сгенерировать 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];
Создайте 5-этапный Интерполятор CIC с коэффициентом интерполяции 32.
CICFilter = dsp.CICInterpolator; CICFilter.InterpolationFactor = 32; CICFilter.NumSections = 5;
Создайте каскадный фильтр включая вышеупомянутые три фильтра. Проверяйте частотную характеристику каскадного фильтра.
DUC = dsp.FilterCascade(pulseShapingFIR, compensationFIR, CICFilter); fvtool(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/BR2019ad_1062519_57051/mlx_to_docbook1/tp7890d292_3984_498e_8a39_80c68acae9f4/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp7890d292_3984_498e_8a39_80c68acae9f4/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp7890d292_3984_498e_8a39_80c68acae9f4/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp7890d292_3984_498e_8a39_80c68acae9f4/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/BR2019ad_1062519_57051/mlx_to_docbook1/tp7890d292_3984_498e_8a39_80c68acae9f4/hdlduc_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
Следующее отображение показывает симулятор HDL ModelSim, запускающий эти испытательные стенды.
Ответ DUC на стимул щебета:
В этом примере вы разработали три отдельных фильтра интерполяции, расположили каскадом их в Цифровой Конвертер, проверили частотную характеристику фильтра и вызвали функции Filter Design HDL Coder™, чтобы сгенерировать код VHDL для фильтра и испытательного стенда VHDL, чтобы проверить код VHDL по его результату MATLAB. Результат симуляции кода VHDL доказал, что сгенерированный фильтр VHDL произвел битно-истинную реализацию фильтра MATLAB.