Этот пример иллюстрирует, как сгенерировать 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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/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/BR2021bd_1751886_255755/mlx_to_docbook1/tp5880427d_8f2d_4282_bd0a_85d48ada007a/hdlfarrow_userdefined_tb.vhd ### Creating stimulus vectors ... ### Done generating VHDL Test Bench.
Следующее отображение показывает симулятор HDL ModelSim® после выполнения испытательного стенда VHDL.
В этом примере мы показали, как можно спроектировать дробный фильтр задержки с двойной точностью, чтобы выполнить данным техническим требованиям. Мы также показали, как можно квантовать фильтр и сгенерировать код VHDL. Затем мы показали, как можно сгенерировать испытательные стенды VHDL с помощью нескольких опций, чтобы задать вход и fracdelay вектор стимула.
Можно использовать любой симулятор HDL, чтобы проверить эти результаты. Можно также экспериментировать с Verilog и для фильтров и для испытательных стендов.