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

Для квантования объекта фильтра установите режим с фиксированной точкой. Предположим, что восьмибитовые входные данные имеют восьмибитовые коэффициенты и шестибитовую дробную задержку. Измените длину слова данных с фиксированной точкой и длину дроби соответствующим образом. 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 с результатами MATLAB ®filter команда. Стимулы для входа фильтра filter_in портовая и дробная задержка filter_fd порт может быть указан с помощью свойств TestbenchStimulus, TestbenchUserStimulus и TestbenchFracDelayStimulus.
Предопределенный стимул для входа фильтра filter_in порт может быть указан для стимула входных данных с помощью свойства TestbenchStimulus как и в случае с другими фильтрующими структурами. Можно указать собственный стимул для входных данных с помощью свойства TestbenchUserStimulus и передачу вектора MATLAB в качестве значения.
Можно задать дробный стимул задержки с помощью свойства TestbenchFracdelayStimulus. Вектор двойного значения между 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 тестовые стенды, используя несколько опций, чтобы указать входной вектор и вектор стимула трещины.
Для проверки этих результатов можно использовать любой имитатор ЛПВП. Можно также экспериментировать с Verilog как для фильтров, так и для тестовых стендов.