exponenta event banner

Инверсный синк-фильтр HDL

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

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

Используйте частоту дискретизации видео 27 МГц и граничную частоту полосы пропускания 7,2 МГц. Установите допустимую пульсацию полосы пропускания от пика к пику в 0,1 дБ, а затухание полосы останова в -66 дБ. Затем создайте фильтр с помощью firceqrip и создайте симметричный фильтр FIR. Наконец, изучите ответ с помощью 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, чтобы найти максимальное обратное усиление sinc, а затем масштабировать это усиление на биты, округляя. Затем примените к фильтру параметры фиксированной точки. Проверьте ответ с помощью 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 ®

На следующем дисплее показана форма сигнала имитатора ModelSim HDL после запуска тестового стенда. Сравните результат 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.

Заключение

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

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