Конечная импульсная характеристика HDL

Этот пример иллюстрирует, как сгенерировать HDL-код для конечная импульсная характеристика с интерфейсом процессора для загрузки коэффициентов. Фильтр может быть запрограммирован на любой желаемый ответ путем загрузки коэффициентов во внутреннюю память коэффициентов с помощью процессорного интерфейса.

Предположим, что нам нужно реализовать банк фильтров, имеющих разные отклики, на чипе. Если все фильтры имеют прямую конечную импульсную характеристику структуру и одинаковую длину, то мы можем использовать интерфейс процессора, чтобы загрузить коэффициенты для каждого ответа из ОЗУ или файла регистра при необходимости.

Этот проект добавит задержку нескольких циклов, прежде чем входные выборки могут быть обработаны загруженными коэффициентами. Однако преимущество состоит в том, что одно и то же оборудование фильтра может быть запрограммировано новыми коэффициентами для получения другой характеристики фильтра. Это сохраняет площадь чипа, так как в противном случае каждый фильтр будет реализован отдельно на чипе.

В этом примере мы рассмотрим два КИХ-фильтра, один с ответом highpass и другой с lowpass-ответом. Мы покажем, как одно и то же оборудование фильтра может быть запрограммировано для каждого отклика путем загрузки соответствующего набора коэффициентов. Мы сгенерируем код VHDL для фильтра и покажем два ответа с помощью сгенерированного испытательного стенда VHDL.

Проектирование фильтров

Создайте объект lowpass создание фильтра, а затем создайте объект FIR Filter System (Hlp). Затем преобразуйте его, чтобы создать объект FIR Filter System с ответом highpass (Hhp).

Fpass = 0.45; % Passband Frequency
Fstop = 0.55; % Stopband Frequency                                                                                         
Apass = 1;    % Passband Attenuation (dB)
Astop = 60;   % Stopband Attenuation (dB)

f = fdesign.lowpass('Fp,Fst,Ap,Ast',Fpass,Fstop,Apass,Astop);
lpFilter = design(f, 'equiripple','FilterStructure', 'dfsymfir','SystemObject',true); % Lowpass

hpcoeffs = firlp2hp(lpFilter.Numerator); 
hpFilter = dsp.FIRFilter('Numerator', hpcoeffs); % Highpass

Квантование фильтров

Предположим, что коэффициенты должны храниться в памяти ширины бита 14. Используя эту информацию, примените настройки фиксированной точки к Системному объекту фильтру.

lpFilter.FullPrecisionOverride=false;
lpFilter.CoefficientsDataType='Custom';
lpFilter.CustomCoefficientsDataType=numerictype(1,14,13);
lpFilter.OutputDataType='Same as Accumulator';
lpFilter.ProductDataType='Full precision';
lpFilter.AccumulatorDataType='Full precision';

hpFilter.FullPrecisionOverride=false;
hpFilter.CoefficientsDataType='Custom';
hpFilter.CustomCoefficientsDataType=numerictype(1,14,13);
hpFilter.OutputDataType='Same as Accumulator';
hpFilter.ProductDataType='Full precision';
hpFilter.AccumulatorDataType='Full precision';

После применения настроек фиксированной точки важно проверить, что фильтр системного объекта все еще соответствует спецификациям. Мы будем использовать функцию 'measure', чтобы проверить, является ли это true.

measure(lpFilter,'Arithmetic','fixed')
ans = 
Sample Rate      : N/A (normalized frequency)
Passband Edge    : 0.45                      
3-dB Point       : 0.46957                   
6-dB Point       : 0.48314                   
Stopband Edge    : 0.55                      
Passband Ripple  : 0.89243 dB                
Stopband Atten.  : 55.3452 dB                
Transition Width : 0.1                       
 

Проверьте выходы фильтра

Сгенерируйте линейный сигнал стимулирования свит-частоты с помощью щебета. Сначала используйте этот входной стимул для фильтрации через lowpass конечная импульсная характеристика. Затем измените коэффициенты фильтра, чтобы получить высокочастотную характеристику и использовать ту же входную выборку, чтобы фильтровать снова.

Для вышеописанной двухэтапной операции фильтрации наша цель - сравнить выход фильтра от MATLAB ® с выходом от сгенерированного HDL-кода.

Построение графиков выборок входа и отфильтрованных выходов показывает поведение lowpass и highpass.

x = chirp(0:199,0,199,0.4);

lpcoeffs = lpFilter.Numerator;            % store original lowpass coefficients
y1 = lpFilter(fi(x,1,14,13).');           % filter the signal

lpFilter.Numerator = hpFilter.Numerator;  % load the highpass filter coefficients
y2 = lpFilter(fi(x,1,14,13).');           % filter the signal

y = [y1; y2];                             % concatenate output signals

lpFilter.Numerator = lpcoeffs;            % restore original lowpass coefficients

subplot(2,1,1);plot([x,x]);
xlabel('Time [samples]');ylabel('Amplitude'); title('Input Stimulus');
subplot(2,1,2);plot(y);
xlabel('Time [samples]');ylabel('Amplitude'); title('Filtered Output');

Figure contains 2 axes. Axes 1 with title Input Stimulus contains an object of type line. Axes 2 with title Filtered Output contains an object of type line.

Сгенерируйте код VHDL с интерфейсом процессора и испытательным стендом

Для квантованного lowpass фильтра мы сгенерируем код VHDL с интерфейсом процессора путем установки свойства 'CoefficientSource' на 'ProcessorInterface'. Это приведет к тому, что сгенерированный код будет иметь дополнительные порты для write_address, write_enable, coeffs_in и write_done сигналов. Этот интерфейс может использоваться, чтобы загрузить коэффициенты от хост-процессора во внутренний файл регистра. HDL имеет дополнительный теневой регистр, который обновляется из файла регистра, когда сигнал 'write _ done' высок. Это позволяет одновременно загружать и обрабатывать данные сущностью фильтра.

Чтобы убедиться, что сущность фильтра может быть последовательно загружен двумя различными наборами коэффициентов фильтра, мы сгенерируем VHDL испытательный стенд. Во-первых, испытательный стенд загружает коэффициенты lowpass и обрабатывает входные выборки. Затем испытательный стенд загружает коэффициенты, соответствующие высокочастотной фильтрации, и снова обрабатывает входные выборки.

Сгенерированный VHDL-код и VHDL-тестовый стенд могут быть скомпилированы и моделированы с помощью HDL-симулятора, такого как ModelSim ®. Заметьте, что загрузка второго набора коэффициентов и обработка последних нескольких входных выборок выполняются одновременно .

Чтобы сгенерировать необходимый испытательный стенд, мы устанавливаем свойство 'GenerateHDLTestbench' на ' on ' и передаем 'TestbenchCoeffStimulus' в вызове команды generatehdl. Значение, переданное для 'TestbenchCoeffStimulus', является вектором коэффициентов, которые должны использоваться для последующей обработки входа отсчетов. Этот пример проходит в векторе коэффициентов, соответствующих высокочастотному фильтру.

Предположим, что 14-битный вход с фиксированной точностью со знаком с 13 битами точности дроби необходим из-за фиксированных требований к пути данных входного АЦП.

%As the symmetric structure is selected, the field 'TestbenchCoeffStimulus'
% has to be the half of length of filter.

workingdir = tempname;

generatehdl(lpFilter,'Name','FilterProgrammable', ...
                 'InputDataType',numerictype(1,14,13), ...
                 'TargetLanguage','VHDL', ...
                 'TargetDirectory',workingdir, ...
                 'CoefficientSource','ProcessorInterface', ...
                 'GenerateHDLTestbench','on', ...
                 'TestBenchUserStimulus',x, ...
                 'TestbenchCoeffStimulus',hpFilter.Numerator(1:(length(hpFilter.Numerator)+1)/2));
### Starting VHDL code generation process for filter: FilterProgrammable
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpbad7135e_7548_417b_b71e_9b88e8520eb7/FilterProgrammable.vhd
### Starting generation of FilterProgrammable VHDL entity
### Starting generation of FilterProgrammable VHDL architecture
### Successful completion of VHDL code generation process for filter: FilterProgrammable
### HDL latency is 2 samples
### Starting generation of VHDL Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 200 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tpbad7135e_7548_417b_b71e_9b88e8520eb7/FilterProgrammable_tb.vhd
### Creating stimulus vectors ...
### Done generating VHDL Test Bench.

Результаты моделирования ModelSim ®

На следующем отображении показан симулятор ModelSim HDL после запуска сгенерированных скриптов .do файла для испытательного стенда. Сравните результат ModelSim с результатом MATLAB, нанесенным ранее.

Заключение

Мы разработали высокоскоростные и lowpass конечная импульсная характеристика, чтобы соответствовать заданным спецификациям. Затем мы квантовали фильтр и сгенерировали VHDL- кода для фильтра с интерфейсом для загрузки коэффициентов от процессора. Затем мы сгенерировали VHDL- испытательного стенда, который показал обработку входа образцов после загрузки lowpass-коэффициентов, повторяя операцию с highpass-коэффициентами. Мы показали, как сгенерировать VHDL код, который реализует оборудование фильтра, которое переиспользуется для различных ответов, когда различные наборы коэффициентов загружаются через интерфейс порта от хост-процессора.