Этот пример иллюстрирует, как сгенерировать HDL-код для фильтра дробной задержки (Farrow) для восстановления синхронизации в цифровом модеме. Структура фильтра Фэрроу обеспечивает переменную дробную задержку для принятого потока данных перед последующей дискретизацией символов. Эта специальная структура конечной импульсной характеристики фильтра позволяет легко обрабатывать коэффициенты фильтра с помощью эффективной реализации формулы полиномиальной интерполяции, чтобы обеспечить переменную дробную повторную дискретизацию.
В типичном приложении цифрового модема фракционно повторно дискретизированные данные, выводимые из фильтра Фэрроу, передаются в символьный дискретизатор с необязательным восстановлением несущей. Для получения дополнительной информации об этом полном приложении см. раздел «Восстановление времени с использованием повторной дискретизации с фиксированной частотой» для Simulink ® и Communications Toolbox™.
Чтобы спроектировать фильтр дробной задержки с помощью кубического метода интерполяции Лагранжа, сначала создайте объект спецификации с порядком фильтра 3
и произвольную дробную задержку 0.3
. Затем создайте объект фильтра farrow Hd
, с использованием метода проекта объекта спецификации с аргументом lagrange
. Этот метод также вызывается со свойством FilterStructure
и ее значение fd
. Можно просмотреть детали объекта фильтра Hd
при помощи info
команда.
fDelay = 0.3; filtdes = fdesign.fracdelay(fDelay, 'N', 3); Hd = design(filtdes,'lagrange', 'FilterStructure', 'farrowfd'); info(Hd)
Discrete-Time FIR Farrow Filter (real) -------------------------------------- Filter Structure : Farrow Fractional Delay Filter Length : 4 Stable : Yes Linear Phase : No Arithmetic : double
Дробная задержка для фильтра Фэрроу настраивается и может быть изменена, чтобы привести к различной амплитудной характеристике. Вы можете увидеть это, создав набор фильтров, которые являются копиями предварительно спроектированного фильтра Hd
с каждым различающимся в своих fracdelay
значения.
for d=0:9, h(d+1) = copy(Hd); h(d+1).fracdelay = d/10; end fvtool(h,'Color','white')
fvtool(h,'Analysis','PhaseDelay','Color','white')
Установите объект фильтра в режим с фиксированной точкой, чтобы квантовать его. Предположим, что восемь-битные входные данные с восьмибитными коэффициентами и шестибитовой дробной задержкой. Измените размеры слова данных с фиксированной точкой и длины дробей соответственно. The CoeffFracLength
свойство устанавливается автоматически, потому что автомасштабирование коэффициентов установлено на on
по умолчанию свойством CoeffAutoscale
. Отключите FDAutoScale
и установите FDFracLength
до шести, что позволяет представлять дробную задержку в области значений от 0 до 1.
Hd.arithmetic = 'fixed';
Hd.InputWordLength = 8;
Hd.InputFracLength = 7;
Hd.CoeffWordLength = 8;
Hd.FDWordLength = 6;
Hd.FDAutoScale = false;
Hd.FDFracLength = 6;
Начиная с правильно квантованного фильтра, вы можете сгенерировать код VHDL или Verilog с помощью generatehdl
команда. Вы создаете временную рабочую директорию, а затем используете generatehdl
команда с использованием соответствующих пар «свойство-значение». После генерации HDL-кода с помощью VHDL
для TargetLanguage
свойство в этом случае можно открыть сгенерированный файл VHDL в редакторе, нажав на гиперссылку, отображаемую в командной строке, отображая сообщения.
workingdir = tempname; generatehdl(Hd, 'Name', 'hdlfarrow', ... 'TargetLanguage', 'VHDL',... 'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd ### Starting generation of hdlfarrow VHDL entity ### Starting generation of hdlfarrow VHDL architecture ### Successful completion of VHDL code generation process for filter: hdlfarrow ### HDL latency is 2 samples
Для проверки HDL-кода можно сгенерировать HDL- испытательного стенда для симуляции HDL-кода с помощью Симулятора HDL. Испытательный стенд проверит результаты HDL-кода с результатами filter
MATLAB ® команда. Стимулы для входного сигнала фильтра
filter_in
порт и дробная задержка filter_fd
порт может быть задан с помощью свойств TestbenchStimulus
, TestbenchUserStimulus
и TestbenchFracDelayStimulus
.
Предопределенный стимул для входного filter_in
фильтра порт может быть задан для входных данных, используя свойство
TestbenchStimulus
как и в случае с другими структурами фильтра. Вы можете задать свой собственный стимул для входных данных с помощью свойства TestbenchUserStimulus
и передачи вектора MATLAB в качестве значения.
Можно задать стимул дробной задержки, используя свойство TestbenchFracdelayStimulus
. Вектор double между 0
и 1
сгенерирован автоматически путем определения любого из RandSweep
или RampSweep
. Поведением по умолчанию является обеспечение дробного стимула задержки постоянного множества к fracdelay
значение объекта фильтра.
Следующая команда задает входной стимул, чтобы chirp
, и вектор дробной задержки установлен в константу 0.3
для всего времени симуляции. Это поведение по умолчанию, когда TestbenchFracDelayStimulus
в противном случае свойство не задано.
generatehdl(Hd, 'Name', 'hdlfarrow', ... 'GenerateHDLTestbench', 'on', ... 'TestBenchName', 'hdlfarrow_default_tb',... 'TargetLanguage', 'VHDL',... 'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd ### Starting generation of hdlfarrow VHDL entity ### Starting generation of hdlfarrow VHDL architecture ### Successful completion of VHDL code generation process for filter: hdlfarrow ### HDL latency is 2 samples ### Starting generation of VHDL Test Bench. ### Generating input stimulus ### Done generating input stimulus; length 3100 samples. ### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow_default_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
Чтобы автоматически сгенерировать тестовый вектор для порта дробной задержки, задайте RampSweep
для TestBenchFracDelayStimulus
. Он генерирует вектор значений между 0
и 1
зачистка линейным способом. Длина этого вектора равна входному вектору стимула.
generatehdl(Hd, 'Name', 'hdlfarrow', ... 'GenerateHDLTestbench', 'on', ... 'TestBenchName', 'hdlfarrow_rampsweep_tb',... 'TargetLanguage', 'VHDL',... 'TestBenchStimulus', 'chirp',... 'TestbenchFracDelaystimulus', 'Rampsweep', ... 'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd ### Starting generation of hdlfarrow VHDL entity ### Starting generation of hdlfarrow VHDL architecture ### Successful completion of VHDL code generation process for filter: hdlfarrow ### HDL latency is 2 samples ### Starting generation of VHDL Test Bench. ### Generating input stimulus ### Done generating input stimulus; length 1028 samples. ### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow_rampsweep_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
Можно сгенерировать настраиваемый входной вектор стимула с помощью команд MATLAB и передать его в свойства стимула испытательного стенда для пользовательских заданных входных и fracdelay
раздражители. Тестовый вектор входа userinputstim
сгенерирован с использованием chirp
команда и дробная задержка тестового вектора userfdstim
генерируется длина, равная входному тестовому вектору.
t=-2:0.01:2; % +/-2 secs @ 100 Hz sample rate userinputstim = chirp(t,100,1,200,'q'); % Start @100Hz, cross 200Hz at t=1sec leninput = length(userinputstim); samplefdvalues = [0.1, 0.34, 0.78, 0.56, 0.93, 0.25, 0.68, 0.45]; samplesheld = ceil(leninput/length(samplefdvalues)); ix = 1; for n = 1:length(samplefdvalues)-1 userfdstim(ix: ix + samplesheld-1) = repmat(samplefdvalues(n),1, samplesheld); ix = ix + samplesheld; end userfdstim(ix:leninput)= repmat(samplefdvalues(end),1 , leninput-length(userfdstim)); generatehdl(Hd, 'Name', 'hdlfarrow', ... 'GenerateHDLTestbench', 'on', ... 'TestBenchName', 'hdlfarrow_userdefined_tb',... 'TargetLanguage', 'VHDL',... 'TestBenchUserStimulus', userinputstim,... 'TestbenchFracDelaystimulus', userfdstim, ... 'TargetDirectory', workingdir);
### Starting VHDL code generation process for filter: hdlfarrow ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow.vhd ### Starting generation of hdlfarrow VHDL entity ### Starting generation of hdlfarrow VHDL architecture ### Successful completion of VHDL code generation process for filter: hdlfarrow ### HDL latency is 2 samples ### Starting generation of VHDL Test Bench. ### Generating input stimulus ### Done generating input stimulus; length 401 samples. ### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook1/tp83c83885_d56e_4460_b11e_a5178c238f83/hdlfarrow_userdefined_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
На следующем отображении показан симулятор ModelSim ® HDL после запуска испытательного стенда VHDL .
В этом примере мы показали, как можно спроектировать дробный фильтр с двойной точностью, чтобы соответствовать заданным спецификациям. Мы также показали, как можно квантовать фильтр и генерировать VHDL- кода. Затем мы показали, как можно сгенерировать VHDL- испытательных стендов с помощью нескольких вариантов, чтобы задать вектор входа и fracdelay.
Для проверки этих результатов можно использовать любые Симуляторы HDL. Также можно экспериментировать с Verilog как для фильтров, так и для испытательных стендов.