HDL дробная задержка (неоплодотворенный) фильтр

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

Сгенерируйте HDL-код от квантованного фильтра

Начиная с правильно квантованного фильтра можно сгенерировать код 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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/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. Испытательный стенд проверит результаты 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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/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/BR2020ad_1302590_239645/mlx_to_docbook1/tp342afb2a_2dd9_42f7_a17a_3f7df3dcca7c/hdlfarrow_userdefined_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

ModelSim® Simulation Results

Следующее отображение показывает симулятор HDL ModelSim® после выполнения испытательного стенда VHDL.

Заключение

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

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