Этот пример иллюстрирует, как сгенерировать 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');
При запуске с квантованного фильтра сгенерируйте код 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/BR2019bd_1276998_130124/mlx_to_docbook1/tp7a009001_5c6c_48a5_abb0_c52bbbf2e036/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/BR2019bd_1276998_130124/mlx_to_docbook1/tp7a009001_5c6c_48a5_abb0_c52bbbf2e036/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.