Этот пример иллюстрирует, как сгенерировать 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]);
Используйте норму по бесконечности 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]);
Начиная с квантованного фильтра, сгенерируйте код 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'));
Следующие отображения показывают сигнал Симулятора 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 #');
Вы разработали фильтр обратной синуса, чтобы соответствовать заданной спецификации. Вы сгенерировали код Verilog и испытательный стенд Verilog, используя приближение линии видео в качестве тестового стимула.
Для проверки этих результатов можно использовать Симулятор HDL. Также можно экспериментировать с VHDL и Verilog как для фильтров, так и для испытательных стендов.