Этот пример иллюстрирует, как сгенерировать 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');
Красная линия показывает предел «не превышать» на полосе остановки.
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');
Начиная с квантованного фильтра, сгенерируйте код 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'));
Постройте график стимула испытательного стенда по умолчанию, используемого вышеописанной командой, с помощью функции generatetbstimulus.
tbstim = generatetbstimulus(videoFilter,'InputDataType', numerictype(1,8,7)); plot(tbstim); title('HDL Video Filter Test Bench Stimulus');
Вы разработали фильтр двойной точности, чтобы соответствовать спецификации фильтра яркости BT.601 ITU-R, а затем создали конечную импульсную характеристику фильтр Системного объекта, который также соответствовал спецификации. Вы сгенерировали VHDL- кода и VHDL- испытательного стенда, которые функционально проверяли фильтр.
Для проверки этих результатов можно использовать симулятор VHDL, такой как ModelSim ®. Можно также экспериментировать с Verilog. Можно использовать много оптимизаций, чтобы получить меньшие и более быстрые результаты HDL путем удаления ограничения, что сгенерированный HDL в точности верен MATLAB. Когда вы используете эти оптимизации, HDL- испытательного стенда может проверить, что реакция фильтра находится в пределах заданного запаса ошибки от ответа MATLAB.