Этот пример иллюстрирует, как генерировать код HDL для фильтра ITU-R BT.601 luma с 8-битными входными данными и 10-битными выходными данными. Этот фильтр является фильтром нижних частот с точкой -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');

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

Добавление дополнительных битов к длине слова коэффициента позволяет фильтру соответствовать спецификации. Увеличьте длину слова на единицу и выполните репликацию полосы останова.
Это просто не соответствует спецификации в конце стоп-полосы. Это небольшое отклонение от спецификации может быть приемлемым, если известно, что какая-либо другая часть системы применяет фильтр нижних частот к этому сигналу.
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. Выберите входной стимул по умолчанию, который для FIR - импульсные, ступенчатые, клиновые, чирповые и шумовые входы.
Чтобы создать код Verilog и тестовый стенд Verilog, измените значение свойства TargetLanguage с VHDL на Verilog.
Предупреждения показывают, что выбор симметричной структуры для фильтра и формирование ЛПВП могут привести к меньшей площади или более высокой тактовой частоте.
Предположим, что вход имеет 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');

Вы разработали фильтр двойной точности, соответствующий спецификации фильтра ITU-R BT.601 luma, а затем создали объект FIR filter System, который также соответствует спецификации. Вы создали код VHDL и стенд тестирования VHDL, который функционально проверил фильтр.
Для проверки этих результатов можно использовать симулятор VHDL, например ModelSim ®. Вы также можете экспериментировать с Verilog. Можно использовать множество оптимизаций для получения меньших и более быстрых результатов HDL, снимая ограничение, заключающееся в том, что сгенерированный HDL будет точно верен MATLAB. При использовании этих оптимизаций тестовый стенд HDL может проверить, чтобы отклик фильтра находился в пределах заданного предела ошибки отклика MATLAB.