Фильтр обратной синуса HDL

Этот пример иллюстрирует, как сгенерировать HDL-код для обратного пика синуса (sin x/x) фильтра, который добавляет предварительную фазу, чтобы компенсировать присущую синус характеристику цифроаналогового преобразователя (ЦАП). Вход является 10-битовым видеосигналом, и выход масштабируется, чтобы соответствовать усилению обратной синусоидальной характеристики.

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

Используйте частоту дискретизации видео 27 МГц и частоту ребра полосы пропускания 7,2 МГц. Установите допустимый пик-к-пику неравномерности в полосе пропускания равным 0,1 дБ, а затухание в полосе задерживания равным -66 дБ. Затем спроектируйте фильтр с помощью firceqrip и создайте симметричный конечная импульсная характеристика. Наконец, исследуйте ответ с помощью fvtool.

Fs           = 27e6;                  % Sampling Frequency in MHz
N            = 20;                    % Order
Fpass        = 7.2e6;                 % Passband Frequency in MHz
slope        = 0;                     % Stopband Slope
spectype     = 'passedge';            % Frequency Specification Type
isincffactor = 1;                     % Inverse Sinc Frequency Factor
isincpower   = 1;                     % Inverse Sinc Power
Dstop        = 10^(-66/20);           % Stopband Attenuation -66 dB
ripple       = 10^(0.1/20);           % Passband Ripple 0.1 dB p-p
Dpass        = (ripple - 1) / (ripple + 1);

% Calculate the coefficients using the FIRCEQRIP function.
b  = firceqrip(N, Fpass/(Fs/2), [Dpass, Dstop], 'slope', slope, ...
               spectype, 'invsinc', isincffactor, isincpower);
inverseSincFilter = dsp.FIRFilter('Numerator',b,'Structure','Direct form symmetric');
fvtool(inverseSincFilter,'Fs',Fs);
axis([0 Fs/2e6 -80 10]);

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains an object of type line.

Создайте квантованный фильтр

Используйте норму по бесконечности freqz, чтобы найти максимальное обратное усиление синуса, и затем масштабируйте это усиление в биты, округляя вверх. Затем примените настройки фиксированной точки к фильтру. Проверьте ответ на fvtool.

Gbits = ceil(log2(norm(freqz(inverseSincFilter), inf)));

specifyall(inverseSincFilter);
inverseSincFilter.CustomCoefficientsDataType = numerictype(1,16,15);
inverseSincFilter.CustomOutputDataType = numerictype(1,10+Gbits,9);
inverseSincFilter.CustomProductDataType = numerictype(1,32,30);
inverseSincFilter.CustomAccumulatorDataType = numerictype(1,33,30);

fvtool(inverseSincFilter,'Fs',Fs,'Arithmetic','fixed');
axis([0 Fs/2e6 -80 10]);

Figure Filter Visualization Tool - Magnitude Response (dB) contains an axes and other objects of type uitoolbar, uimenu. The axes with title Magnitude Response (dB) contains 2 objects of type line. These objects represent Filter #1: Quantized, Filter #1: Reference.

Сгенерируйте HDL-код из квантованного фильтра

Начиная с квантованного фильтра, сгенерируйте код VHDL или Verilog. У вас также есть опция сгенерировать тестовый стенд VHDL или Verilog, чтобы убедиться, что проект HDL соответствует фильтру MATLAB ®.

Чтобы сгенерировать VHDL, измените значение свойства 'TargetLanguage' с 'Verilog' на 'VHDL'.

Сгенерируйте испытательный стенд Verilog, чтобы убедиться, что результат точно соответствует ответу, который вы видите в MATLAB. Поскольку это видеофильтр, создайте и задайте стимул, подобный линии видео, как тестовый стимул.

Создайте временную рабочую директорию. Сгенерировав HDL-код (в данном случае выбирая Verilog) и испытательный стенд, откройте сгенерированные файлы Verilog в редакторе.

workingdir = tempname;

Fsub        = 5e6*63/88;                     % 3.579545 MHz
VoltsperIRE = (7 + 1/7)/1000;                % IRE steps are 7.14mV
Nsamples    = 1716;                          % 27 MS/s video line
userstim = zeros(1,Nsamples);                % predefine our array

% 8 Sample raised-cosine -40 IRE
syncedge = ((cos(pi/2 *(0:7)/8).^2) - 1) * 40 * VoltsperIRE;
burst    = 20 * VoltsperIRE * sin(2*pi * Fsub/Fs * (0:Fs/(Fsub/9)));

userstim(33:40)    = syncedge;
userstim(41:170)   = repmat(-40 * VoltsperIRE, 1, 130);
userstim(171:178)  = syncedge(end:-1:1);
userstim(180:247)  = burst;
% Ramp with chroma over 1416 samples from 7.5 to 80 IRE with a 20 IRE chroma
actlen = 1416;
active = 1:actlen;
userstim(260:1675) = (((active/actlen * 72.5)+7.5) + ...
                      20 * sin(2*pi * Fsub/Fs * active)) * VoltsperIRE;
userstim(1676:Nsamples) = 72.5 * VoltsperIRE * (41:-1:1)/41;

generatehdl(inverseSincFilter, 'Name', 'hdlinvsinc', 'TargetLanguage', 'Verilog',...
    'GenerateHDLTestbench','on', ...
    'TestBenchUserStimulus', userstim,...
    'TargetDirectory', workingdir,...
    'InputDataType',numerictype(1,10,9));
### Starting Verilog code generation process for filter: hdlinvsinc
### Generating: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tp4be63889_f0c5_4b07_bc2e_a29176471703/hdlinvsinc.v
### Starting generation of hdlinvsinc Verilog module
### Starting generation of hdlinvsinc Verilog module body
### Successful completion of Verilog code generation process for filter: hdlinvsinc
### HDL latency is 2 samples
### Starting generation of VERILOG Test Bench.
### Generating input stimulus
### Done generating input stimulus; length 1716 samples.
### Generating Test bench: /tmp/BR2021ad_1655202_180016/mlx_to_docbook2/tp4be63889_f0c5_4b07_bc2e_a29176471703/hdlinvsinc_tb.v
### Creating stimulus vectors ...
### Done generating VERILOG Test Bench.

Чтобы открыть сгенерированные исходные и испытательный стенд файлы Verilog в редакторе MATLAB, используйте эти команды.

edit(fullfile(workingdir,'hdlinvsinc.v'));

edit(fullfile(workingdir,'hdlinvsinc_tb.v'));

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

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

xrange = 0:Nsamples-1;
y = inverseSincFilter(fi(userstim.',1,10,9));
subplot(2,1,1); plot(xrange, userstim); 
axis([0 500 -0.4 1.1]);
title('HDL Inverse Sinc Filter In Stimulus.');
xlabel('Sample #');
subplot(2,1,2); plot(xrange, y); 
axis([0 500 -0.4 1.1]);
title('HDL Inverse Sinc Filter Out Response.');
xlabel('Sample #');

Figure contains 2 axes. Axes 1 with title HDL Inverse Sinc Filter In Stimulus. contains an object of type line. Axes 2 with title HDL Inverse Sinc Filter Out Response. contains an object of type line.

Заключение

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

Для проверки этих результатов можно использовать Симулятор HDL. Также можно экспериментировать с VHDL и Verilog как для фильтров, так и для испытательных стендов.

Для просмотра документации необходимо авторизоваться на сайте