exponenta event banner

Видеофильтр HDL

Этот пример иллюстрирует, как генерировать код HDL для фильтра ITU-R BT.601 luma с 8-битными входными данными и 10-битными выходными данными. Этот фильтр является фильтром нижних частот с точкой -3 дБ 3,2 МГц с частотой дискретизации 13,5 МГц и заданным диапазоном как для пульсации полосы пропускания, так и для затухания полосы останова, показанного в спецификации ITU. Коэффициенты фильтра были разработаны с использованием DSP System Toolbox™. В этом примере основное внимание уделяется эффектам квантования и генерации кода HDL для фильтра системных объектов.

Настройка коэффициентов

Присвойте ранее разработанные коэффициенты фильтра переменной b. Это полуполосный фильтр и, следовательно, каждый другой коэффициент равен нулю за исключением коэффициента в средней точке фильтра, который равен ровно половине.

Проверьте соответствие конструкции фильтра двойной точности шаблону ITU-R BT.601 для пульсации полосы пропускания и затухания полосы останова с помощью freqz и постройте график полосы пропускания. Красные строки показывают допустимое изменение в спецификации.

b = [0.00303332064210658,  0,...
    -0.00807786494715095,  0,...
     0.0157597395206364,   0,...
    -0.028508691397868,    0,...
     0.0504985344927114,   0,...
    -0.0977926818362618,   0,...
     0.315448742029959,...
     0.5,...
     0.315448742029959,    0,...
    -0.0977926818362618,   0,...
     0.0504985344927114,   0,...
    -0.028508691397868,    0,...
     0.0157597395206364,   0,...
    -0.00807786494715095,  0,...
     0.00303332064210658];

f = 0:100:2.75e6;
H = freqz(b,1,f,13.5e6);
plot(f,20*log10(abs(H)));
title('HDL Video Filter Double-Precision Passband');
axis([0 2.75e6 -.8 .8]);
passbandrange = {[2.75e6;  1e6;   0;  1e6; 2.75e6],...
                 [  -0.5; -0.5;   0;  0.5;    0.5]};
line(passbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Double-Precision Passband contains 2 objects of type line.

Постройте график области останова

Красная строка показывает ограничение «не превышать» для полосы останова.

f = 4e6:100:6.75e6;
H = freqz(b,1,f,13.5e6);
plot(f,20*log10(abs(H)));
title('HDL Video Filter Double-Precision Stopband');
axis([4e6 6.75e6 -70 -35]);
stopbandrange = {[4e6;   6.25e6;  6.75e6],...
                 [-40;      -55;     -55]};
line(stopbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Double-Precision Stopband contains 2 objects of type line.

Создание квантованного фильтра

Создайте фильтр объекта FIR-фильтр System с ранее определенными коэффициентами. Экспериментируйте с длиной слова коэффициента, чтобы получить требуемый отклик для 8-битных входных данных и 10-битовых выходных данных.

videoFilter = dsp.FIRFilter;
videoFilter.Numerator = b;
videoFilter.Structure = 'Direct form symmetric';

%Try 10-bit coefficients
videoFilter.CoefficientsDataType = 'Custom';
videoFilter.CustomCoefficientsDataType = numerictype(1,10);

Постройте график отклика квантованного фильтра

Теперь изучите отклик полосы пропускания и полосы останова квантованного фильтра относительно спецификации. Постройте график и сначала проверьте квантованную полосу пропускания.

Квантованная конструкция удовлетворяет спецификациям полосы пропускания, за исключением DC, где она пропускает спецификацию приблизительно на 0,035 дБ.

f = 0:100:2.75e6;
H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed');
plot(f,20*log10(abs(H)));
title('HDL Video Filter Quantized Passband');
axis([0 2.75e6 -.8 .8]);
line(passbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Quantized Passband contains 2 objects of type line.

Постройте график квантованной стоп-полосы

Красные линии снова показывают ограничение «не превышать» для полосы останова.

Предел полосы останова нарушается, что указывает на проблему с установками квантования.

f = 4e6:100:6.75e6;
H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed');
plot(f,20*log10(abs(H)));
title('HDL Video Filter Quantized Stopband');
axis([4e6 6.75e6 -70 -35]);
line(stopbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Quantized Stopband contains 2 objects of type line.

Изменение настроек квантователя коэффициентов

Добавление дополнительных битов к длине слова коэффициента позволяет фильтру соответствовать спецификации. Увеличьте длину слова на единицу и выполните репликацию полосы останова.

Это просто не соответствует спецификации в конце стоп-полосы. Это небольшое отклонение от спецификации может быть приемлемым, если известно, что какая-либо другая часть системы применяет фильтр нижних частот к этому сигналу.

videoFilter.CustomCoefficientsDataType = numerictype(1,11);
f = 4e6:100:6.75e6;
H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed');
plot(f,20*log10(abs(H)));
title('HDL Video Filter Quantized Stopband');
axis([4e6 6.75e6 -70 -35]);
line(stopbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Quantized Stopband contains 2 objects of type line.

Установка длины слова квантователя конечных коэффициентов

Добавьте еще один бит к длине слова квантователя коэффициентов и выполните повторную обработку полосы останова. Это должно соответствовать спецификации.

videoFilter.CustomCoefficientsDataType = numerictype(1,12);
f = 4e6:100:6.75e6;
H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed');
plot(f,20*log10(abs(H)));
title('HDL Video Filter Final Quantized Stopband');
axis([4e6 6.75e6 -70 -35]);
line(stopbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Final Quantized Stopband contains 2 objects of type line.

Выполните окончательную проверку ответа полосы пропускания

Перепроверьте полосу пропускания, чтобы убедиться, что изменения улучшили проблемы в ответе около DC. Ответ теперь проходит спецификацию.

f = 0:100:2.75e6;
H = freqz(videoFilter,f,13.5e6,'Arithmetic','fixed');
plot(f,20*log10(abs(H)));
title('HDL Video Filter Final Quantized Passband');
axis([0 2.75e6 -.8 .8]);
line(passbandrange{:}, 'Color', 'red');

Figure contains an axes. The axes with title HDL Video Filter Final Quantized Passband contains 2 objects of type line.

Создание кода HDL и тестового стенда из квантованного фильтра

Начиная с квантованного фильтра, генерируйте код VHDL или Verilog.

Создайте временную рабочую папку. После создания HDL (в этом случае выберите VHDL) откройте созданный файл VHDL в редакторе.

Создайте стенд тестирования VHDL, чтобы убедиться, что он точно соответствует ответу в MATLAB. Выберите входной стимул по умолчанию, который для FIR - импульсные, ступенчатые, клиновые, чирповые и шумовые входы.

Чтобы создать код Verilog и тестовый стенд Verilog, измените значение свойства TargetLanguage с VHDL на Verilog.

Предупреждения показывают, что выбор симметричной структуры для фильтра и формирование ЛПВП могут привести к меньшей площади или более высокой тактовой частоте.

Предположим, что вход имеет 8-битовую длину слова с 7-битовыми дробными битами.

workingdir = tempname;
generatehdl(videoFilter, 'Name', 'hdlvideofilt', ...
                'InputDataType' ,numerictype(1,8,7), ...
                'TargetLanguage', 'VHDL', ...
                'TargetDirectory', workingdir, ... 
                'GenerateHDLTestbench', 'on');
### Starting VHDL code generation process for filter: hdlvideofilt
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpa14f7c98_fb07_434b_a7ce_407730427e7a/hdlvideofilt.vhd
### Starting generation of hdlvideofilt VHDL entity
### Starting generation of hdlvideofilt VHDL architecture
### Successful completion of VHDL code generation process for filter: hdlvideofilt
### HDL latency is 2 samples
### Starting generation of VHDL Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 3261 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpa14f7c98_fb07_434b_a7ce_407730427e7a/hdlvideofilt_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.
edit(fullfile(workingdir, 'hdlvideofilt.vhd'));

Постройте график стимула испытательного стенда

Постройте график стимула тестового стенда по умолчанию, используемого вышеупомянутой командой, используя функцию generatetbstimulus.

tbstim = generatetbstimulus(videoFilter,'InputDataType', numerictype(1,8,7));
plot(tbstim);
title('HDL Video Filter Test Bench Stimulus');

Figure contains an axes. The axes with title HDL Video Filter Test Bench Stimulus contains an object of type line.

Заключение

Вы разработали фильтр двойной точности, соответствующий спецификации фильтра ITU-R BT.601 luma, а затем создали объект FIR filter System, который также соответствует спецификации. Вы создали код VHDL и стенд тестирования VHDL, который функционально проверил фильтр.

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