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