HDL-видеофильтр

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

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

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

Проверяйте, что создание фильтра двойной точности соответствует шаблону BT.601 ITU-R для неравномерности в полосе пропускания и затухания в полосе задерживания с помощью 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.

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

Создайте фильтр Конечной Импульсной Характеристики Системный объект с ранее заданными коэффициентами. Экспериментируйте с размером слова коэффициента, чтобы получить желаемый ответ для 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.

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

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

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

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. Выберите входной стимул по умолчанию, который для конечной импульсной характеристики является импульсным, шаговым, наклонным, щебетанием и шумовыми входами.

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

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

Предположим, что вход имеет 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'));

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

Постройте график стимула испытательного стенда по умолчанию, используемого вышеописанной командой, с помощью функции 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.

Заключение

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

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