Инверсия HDL фильтр Sinc

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

Спроектируйте фильтр

Используйте видео частоту дискретизации 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]);

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

Используйте норму по бесконечности 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]);

Сгенерируйте 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/BR2020bd_1459859_105924/mlx_to_docbook2/tp79d79a08_9f75_4e00_a582_ddf18e0fae2f/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/BR2020bd_1459859_105924/mlx_to_docbook2/tp79d79a08_9f75_4e00_a582_ddf18e0fae2f/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® Simulation Results

Следующее отображение показывает форму волны симулятора 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 #');

Заключение

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

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