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

Этот пример иллюстрирует, как сгенерировать HDL-код для ITU-R Купленный 601 фильтр luma с 8-битными входными данными и 10-битными выходными данными. Этот фильтр является фильтром lowpass с точкой на-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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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/BR2021bd_1751886_255755/mlx_to_docbook2/tpf2a37600_b1e5_442c_bd52_5135e16ad2c0/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/BR2021bd_1751886_255755/mlx_to_docbook2/tpf2a37600_b1e5_442c_bd52_5135e16ad2c0/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 object. The axes object with title HDL Video Filter Test Bench Stimulus contains an object of type line.

Заключение

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

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