Видеофильтр 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');

Постройте полосу задерживания

Красная линия показывает, "чтобы не превысить" предел на полосе задерживания.

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');

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

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

Постройте квантованную полосу задерживания

Красные линии снова показывают, "чтобы не превысить" предел на полосе задерживания.

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

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');

Измените содействующие настройки квантизатора

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

Это только пропускает спецификацию в конце полосы задерживания. Это маленькое отклонение от спецификации может быть приемлемым, если вы знаете, что некоторая другая часть вашей системы применяет фильтр 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');

Установите итоговый содействующий размер слова квантизатора

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

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');

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

Перепроверьте полосу пропускания, чтобы быть уверенными, что изменения улучшили проблемы в ответе около 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');

Сгенерируйте 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/BR2020ad_1302590_239645/mlx_to_docbook1/tpe8a52d7b_c605_459e_acc9_074e450da229/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/BR2020ad_1302590_239645/mlx_to_docbook1/tpe8a52d7b_c605_459e_acc9_074e450da229/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');

Заключение

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

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