Этот пример иллюстрирует, как сгенерировать HDL-код для дробной задержки (Неоплодотворенный) фильтр для синхронизации восстановления в цифровом модеме. Неоплодотворенная структура фильтра обеспечивает переменную дробную задержку полученного потока данных до нисходящей выборки символа. Эта специальная КИХ-структура фильтра разрешает простой обработке коэффициентов фильтра эффективной реализацией формулы полиномиальной интерполяции обеспечивать переменную дробную передискретизацию.
В типичном приложении цифрового модема незначительно передискретизируемый вывод данных от фильтра Фэрроу передается сэмплеру символа с дополнительным восстановлением поставщика услуг. Для получения дополнительной информации этого законченного приложения обратитесь к "Синхронизации Восстановления Используя Передискретизацию С фиксированной процентной ставкой" для Simulink® и Communications Toolbox™.
Чтобы разработать дробный фильтр задержки с помощью Кубического Лагранжевого метода интерполяции, сначала создайте объект спецификации с порядком фильтра 3 и произвольная дробная задержка 0.3. Затем, создайте неоплодотворенный объект фильтра 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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/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/BR2019ad_1062519_57051/mlx_to_docbook1/tpddedb00b_9528_42b0_8de8_229025e1dffa/hdlfarrow_userdefined_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
Следующее отображение показывает симулятор HDL ModelSim® после выполнения испытательного стенда VHDL.

В этом примере мы показали, как можно разработать дробный фильтр задержки с двойной точностью, чтобы соответствовать данным спецификациям. Мы также показали, как можно квантовать фильтр и сгенерировать код VHDL. Затем мы показали, как можно сгенерировать испытательные стенды VHDL с помощью нескольких опций, чтобы задать вход и fracdelay вектор стимула.
Можно использовать любой симулятор HDL, чтобы проверить эти результаты. Можно также экспериментировать с Verilog и для фильтров и для испытательных стендов.