Этот пример иллюстрирует, как сгенерировать HDL-код для фильтра FIRT минимальной фазы с 10-битными входными данными. Это полосно-пропускающий фильтр со скоростью дискретизации 96 кГц и полосой пропускания от приблизительно 19 кГц до 29 кГц. Этот тип фильтра обычно используется в циклах обратной связи, где линейная фаза недостаточно и требуется минимальная фаза или так близко, как это достижимо.
Разработайте фильтр с помощью firgr, который использует обобщенный метод проекта Remez. Использование аргумента 'minphase' к firgr вынуждает минимально фаза создания фильтра. Затем используйте fvtool, чтобы визуализировать ответ фильтра.
Fs = 96000; Fn = Fs/2; f = [0 17000 20000 28000 31000 Fn]/Fn; a = [0 0 1 1 0 0]; w = [5 1 5]; b = firgr(44, f, a, w, 'minphase'); hfvt = fvtool(b,'Fs', Fs,... 'MagnitudeDisplay', 'Magnitude (dB)',... 'legend','on'); legend(hfvt,'Min Phase');
Проверяйте фазовый отклик фильтра.
hfvt = fvtool(b,'Fs', Fs,... 'Analysis', 'phase',... 'legend','on'); legend(hfvt, 'Min Phase');
Проверив минимальную фазу создания фильтра, создайте конечную импульсную характеристику фильтра с Системным объектом 'Direct form transposed'. Установите размер слова коэффициента равную 15, и используйте полную точность для других настроек фильтра.
b_fixed = fi(b,1,15); % use best precision fraction length T_coeff = numerictype(b_fixed); minPhaseFilter = dsp.FIRFilter('Structure','Direct form transposed'); minPhaseFilter.Numerator = double(b_fixed); minPhaseFilter.FullPrecisionOverride = false; minPhaseFilter.CoefficientsDataType = 'Custom'; minPhaseFilter.CustomCoefficientsDataType = T_coeff; minPhaseFilter.ProductDataType = 'Full precision'; minPhaseFilter.AccumulatorDataType = 'Full precision'; minPhaseFilter.OutputDataType = 'Same as accumulator';
Проверьте квантованный фильтр относительно исходного проекта. Величина отклика верна, но фазовый отклик больше не является минфазой, из-за квантования.
hfvt = fvtool(minPhaseFilter, 'Fs', Fs, ... 'Analysis', 'freq', ... 'legend', 'on', ... 'Arithmetic', 'fixed'); legend(hfvt, 'Min Phase');
Постройте график импульсной характеристики квантованного фильтра. Многие коэффициенты были квантованы до нуля, и общая характеристика все еще соответствует спецификации, хотя нули сделали фазовый отклик минимальной. Эти нули приводят к меньшей реализации, потому что HDL-код не генерируется для умножений на ноль.
hfvt = fvtool(minPhaseFilter, 'Fs', Fs, ... 'Analysis', 'Impulse', ... 'legend', 'on', ... 'Arithmetic', 'fixed'); legend(hfvt, 'Min Phase');
Начиная с квантованного фильтра, сгенерируйте VHDL или Verilog.
Создайте временную рабочую директорию. После генерации HDL-кода (в данном случае Verilog) откройте сгенерированный файл в редакторе.
Сгенерируйте испытательный стенд Verilog, чтобы убедиться, что результаты совпадают с результатами в MATLAB. Используйте предопределенный входной стимул щебета.
Чтобы сгенерировать VHDL- кода и VHDL- испытательного стенда, измените значение свойства 'TargetLanguage' с 'Verilog' на 'VHDL'.
Предположим, что вход имеет 10-битный размер слова с 9-битными дробными битами.
workingdir = tempname; generatehdl(minPhaseFilter,'Name', 'hdlminphasefilt', ... 'TargetLanguage', 'Verilog', ... 'GenerateHDLTestbench','on', ... 'TestBenchStimulus', 'chirp', ... 'TargetDirectory', workingdir, ... 'InputDataType', numerictype(1,10,9));
### Starting Verilog code generation process for filter: hdlminphasefilt ### Starting Verilog code generation process for filter: hdlminphasefilt ### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tp5f88187b_093f_446c_a4be_8a4f6a132b15/hdlminphasefilt.v ### Starting generation of hdlminphasefilt Verilog module ### Starting generation of hdlminphasefilt Verilog module body ### Successful completion of Verilog code generation process for filter: hdlminphasefilt ### HDL latency is 2 samples ### Starting generation of VERILOG Test Bench. ### Generating input stimulus ### Done generating input stimulus; length 1069 samples. ### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tp5f88187b_093f_446c_a4be_8a4f6a132b15/hdlminphasefilt_tb.v ### Creating stimulus vectors ... ### Done generating VERILOG Test Bench.
edit(fullfile(workingdir, 'hdlminphasefilt.v'));
Постройте график входного стимула фильтра и выходного отклика на отдельных графиках.
x = generatetbstimulus(minPhaseFilter,'TestBenchStimulus','chirp','InputDataType', numerictype(1,10,9)); xrange = (0:length(x) - 1).*( Fn / (length(x) - 1))/1e3; y = minPhaseFilter(x.'); subplot(2,1,1); plot(xrange, x); ylim(ylim.*1.1); axis([0,50,-1.2,1.2]); title('HDL Min Phase Filter Chirp Stimulus.'); xlabel('Frequency in kHz'); subplot(2,1,2); plot(xrange, y); ylim(ylim.*1.1); axis([0,50,-1.2,1.2]); title('HDL Min Phase Filter Response.'); xlabel('Frequency in kHz');
Вы разработали фильтр минимальной фазы, а затем преобразовали его в системный объект конечных импульсных характеристик с транспонированной структурой. Затем вы сгенерировали код Verilog для создания фильтра и испытательного стенда Verilog, чтобы функционально проверить результаты.
Для проверки этих результатов можно использовать симулятор Verilog, такой как ModelSim ®.