Jump to content

    
_sda

Генерация файлов HDL из Filter Designer

Recommended Posts

Matlab R2016b. Коллеги, чтобы не изобретать велосипед решил попробовать сгенерить HDL для fractional-rate фильтра.

Фильтр мне сгенерили полифазный с шестью фазами, коэффициент преобразования частоты дискретизации я заказывал равный 7/5.

В итоге при симуляции получилась вот такая ерунда. Похоже есть путаница с фазами или с отсчётами ИХ.

image.thumb.png.8cfec09072b1735688aee097887467cc.png

Кто нибудь пользовался сгенерёнными в матлабе HDL-файлами? Как впечатление?

 

Share this post


Link to post
Share on other sites
14 minutes ago, _sda said:

А что, со старыми версиями действительно есть проблемы?

Ну HDL Coder у них достаточно шустро развивается, поэтому вполне возможно, что что-то пофиксили уже. Во вторых на более новые версии легче найти суппорт. 

В третьих - на крайняк - вот у меня 2016 уже года два, как не стоит, а есть только 2018b и новее, поэтому я тупо не могу смоделировать вашу проблему.   

Share this post


Link to post
Share on other sites
6 hours ago, _sda said:

Кто нибудь пользовался сгенерёнными в матлабе HDL-файлами? Как впечатление?

пользуюсь сгенеренными в симулинке HDL файлами, впечатления хорошие

 

очень похоже, что для Вашего случая подойдет блок FIR Rate Conversion HDL Optimized

для проверки блока с дискретизацией 7/5 я использовал такие параметры

706177632_.png.2afbfcf5e2c51ac54d5f262ef7239be1.png

 

результаты моделирования с входной дискретизацией как в Вашем случае (входной отсчет раз в два такта)

1897780915_.thumb.png.9ca6d3c3073911c592ff886cc6c1d1d3.png

930697728_.thumb.png.d1c1025215720d825bf27e3ac1576fcc.png

 

 

 

Share this post


Link to post
Share on other sites

удалось сгенерировать  похожий в матлабе в Filter Designer

после экспорта в .m файл генерируется с такого скрипта

 

% MATLAB Code
% Generated by MATLAB(R) 9.2 and the DSP System Toolbox 9.4.
% Generated on: 25-Aug-2021 23:28:00

% FIR least-squares Lowpass filter designed using the FIRLS function.

% All frequency values are in Hz.
Fs = 14;  % Sampling Frequency

N     = 70;   % Order
Fpass = 0.9;  % Passband Frequency
Fstop = 1.1;  % Stopband Frequency
Wpass = 1;    % Passband Weight
Wstop = 1;    % Stopband Weight

% Calculate the coefficients using the FIRLS function.
b  = firls(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop]);
intf = 7;                     % Interpolation Factor
decf = 5;                     % Decimation Factor

Hd = dsp.FIRRateConverter( ...
    'InterpolationFactor', intf, ...
    'DecimationFactor', decf, ...
    'Numerator', b, ...
    'CoefficientsDataType', 'Custom', ...
    'CustomCoefficientsDataType', numerictype([],16,17));

generatehdl(Hd, 'ResetType', 'Synchronous',... 
               'EDAScriptGeneration', 'off',... 
               'Name', 'Filter_fract_rate_fdatool',... 
               'TargetLanguage', 'Verilog',...
               'InputDataType',numerictype(1,16,15));

 

результаты моделирования такого фильтра получились похожими

454622929_.thumb.png.2eb84ae11486ed949ff278735d52272d.png

2028842182_.thumb.png.a250e6144a4bf699682b1e50bf5a9f62.png

в самом Filter Designer были выбраны такие настройки

1740877225_.thumb.png.f665b61b15afb2e6789c94b32f4627fe.png

1704000282_.thumb.png.0c3b747d69961a72d5d43a8ce725e6b8.png

1740883322_.thumb.png.830269be0ae89236605cb5c651267f55.png

 

 

 

Share this post


Link to post
Share on other sites

Спасибо за желание помочь.

Вот как выглядит мой скрипт, генерировал его здесь:

image.thumb.png.038ae22a5913268abe31b5589b00b653.png

function filter_generatehdl(filtobj)
%  FILTER_GENERATEHDL   Function to generate HDL for filter object.
%  Generated by MATLAB(R) 9.1 and the Filter Design HDL Coder 3.1.
%  Generated on: 2021-08-26 09:12:56
%  -------------------------------------------------------------
%  HDL Code Generation Options:
%  TargetLanguage: VHDL
%  OptimizeForHDL: on
%  UseRisingEdge: on
%  TargetDirectory: D:\MyDesigns\2021\elecnronix\7_5
%  TestBenchStimulus: step ramp chirp noise 
%  GenerateHDLTestbench: on
% 
%  Filter Settings:
%  Discrete-Time FIR Multirate Filter (real)
%  -----------------------------------------
%  Filter Structure      : Direct-Form FIR Polyphase Sample-Rate Converter
%  Interpolation Factor  : 7
%  Decimation Factor     : 5
%  Polyphase Length      : 6
%  Filter Length         : 41
%  Stable                : Yes
%  Linear Phase          : Yes (Type 1)
%
%  Arithmetic            : fixed
%  Numerator             : s16,15 -> [-1 1)
%  Input                 : s16,15 -> [-1 1)
%  Filter Internals      : Specify Precision
%    Output              : s16,15 -> [-1 1)
%    Product             : s28,27 -> [-1 1)
%    Accumulator         : s28,27 -> [-1 1)
%    Round Mode          : convergent
%    Overflow Mode       : wrap

%  -------------------------------------------------------------

% Generating HDL code
generatehdl(filtobj, 'TargetLanguage', 'VHDL',... 
               'OptimizeForHDL', 'on',... 
               'UseRisingEdge', 'on',... 
               'TargetDirectory', 'D:\MyDesigns\2021\elecnronix\7_5',... 
               'TestBenchStimulus',  {'step', 'ramp', 'chirp', 'noise'},... 
               'GenerateHDLTestbench', 'on');

% [EOF]

Обратил внимание что у вас версия на единичку больше моей.

Предлагаю тайм аут, установлю матлаб поновее.

 

 

Share this post


Link to post
Share on other sites
1 час назад, _sda сказал:

Предлагаю тайм аут, установлю матлаб поновее.

Очень советую собирать всё не в Матлабе а в Симулинке!

С Вашими знаниями в части ПЛИС вы так намного быстрее получите результат.

Мы по совету в том числе и сотрудников Экспоненты (правда неофициально, ибо не могут они так в лоб сравнивать продукты) пошли в этом направлении и пока видим только плюсы.

Share this post


Link to post
Share on other sites
57 минут назад, warrior-2001 сказал:

Очень советую собирать всё не в Матлабе а в Симулинке!

С Вашими знаниями в части ПЛИС вы так намного быстрее получите результат.

Мы по совету в том числе и сотрудников Экспоненты (правда неофициально, ибо не могут они так в лоб сравнивать продукты) пошли в этом направлении и пока видим только плюсы.

Спасибо, обязательно попробую в симулинке. А как там насчёт быстродействия? Тот HDL который мне сгенерил Filter Designer имел максимальную тактовую 65 МГц. Часик пошаманил, увеличил до 180 МГц. Напрягает...

Share this post


Link to post
Share on other sites
45 минут назад, warrior-2001 сказал:

Тут так всегда будет. Сперва час потратил на сборку логики, и потом день - на оптимизацию по частоте! :biggrin:

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

Кстати, попробовал сгенерить файл фильтра в R2019b - HDL отличается от созданного в R2016b только датой создания:biggrin:

Коллеги, уж очень поджимает время, если я выложу файл filter.fda сможет ли кто сгенерить файл filter.vhd и скрипт для его генерации? 

Эта задача однократная, с симулинком я тоже лет 10 не работал, вангую что уйдёт времени немеряно на освоение кодера в симулинке и не факт что поможет.

Ресемплинг у фильтра теперь будет 20/13.

frac_filter_2019b.fda

Share this post


Link to post
Share on other sites
15 часов назад, stealthisname сказал:

 

Странная ситуация. Я сформировал примерно такой же скрипт как вы показали.

Если я формирую нужную ИХ такой строчкой (как у вас)

b  = firls(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop]);

то фильтр работает адекватно.

Если же я (ничего остального не меняя) формирую ИХ экспортом из Filter Designer то всё ломается.

b = Num;

Порядки фильтров сделал одинаковыми. В самом тексте фильтра изменяются только коэффициенты.

Тихо шифером шурша....

Share this post


Link to post
Share on other sites
18 часов назад, stealthisname сказал:

 

А попробуйте сгенерировать HDL для коэффициента не 7/5 а 13/5. У меня получилось вот так:

image.thumb.png.7587c4e9bda1029fdcb428ca389f03dc.png

Работает только при малых коэффициентах? 

Share this post


Link to post
Share on other sites
2 hours ago, _sda said:

А попробуйте сгенерировать HDL для коэффициента не 7/5 а 13/5. У меня получилось вот так:

для проверки преобразования частоты с коэффициентом 7/5 я использовал импульсную характеристику по такому образцу

b  = firls(N, [0, 0.9*(1/7), 1.1*(1/7), 1], [1 1 0 0], [Wpass Wstop]);

специально, чтобы фильтр оставлял примерно 1/7 полосы после интерполирования в 7 раз

для преобразования частоты с коэффициентом 13/5 такая ИХ не подойдет, так как необходимо , чтобы фильтр оставлял примерно 1/13, с ИХ по такому образцу

b  = firls(N, [0, 0.9*(1/13), 1.1*(1/13), 1], [1 1 0 0], [Wpass Wstop]);

при этом для достижения заданных характеристик фильтра потребуется больший порядок (N)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.