exponenta event banner

Реализация компонента фильтра осциллятора в MATLAB

®

В этих примерах показано, как MATLAB ® может использоваться для реализации компонента фильтра, используемого в модели HDL. Пример компилирует генератор VHDL/Verilog, определяет компонент фильтра, моделируемый с помощью MATLAB, и запускает моделирование HDL. В этом примере требуется временная папка для создания рабочего проекта ModelSim VHDL или Incisive Verilog. После создания проекта HDL этот пример запускает имитатор HDL (для этого требуется доступ к ModelSim/Incisive из командной строки). В этом примере для завершения связи используется общая память, поэтому требуется, чтобы имитатор HDL находился на том же компьютере, что и MATLAB. После компиляции проекта моделирование можно выполнить в ModelSim/Incisive.

В этом примере были разработаны VHDL-осциллятор в ModelSim и Verilog-осциллятор в Incisive, и наша работа состоит в том, чтобы найти фильтр очистки для осциллятора, который отвечает нашим потребностям.

Первый фильтр FIR является фильтром 31-го порядка (32-х отводов) без избыточной дискретизации. Второй фильтр представляет собой фильтр 127-го порядка с избыточной выборкой 4X. Третий фильтр - это фильтр 255-го порядка с избыточной выборкой 8X. Все три фильтра имеют одну и ту же линию задержки, и избыточная выборка выполняется с использованием метода многофазности.

Файл simple_osc.vhd/ simple_osc.v содержит простой осциллятор, разработанный в VHDL/Verilog.

Файл osc_filter.vhd/ osc_filter.v содержит моделируемый компонент MATLAB. Он содержит сущность с пустой архитектурой. Команда matlabcp управляет выходами VHDL/Verilog и проверяет входы VHDL/Verilog экземпляра, созданного из этого объекта.

Файл osc_top.vhd/ osc_top.v содержит проводные соединения верхнего уровня между генератором и компонентом MATLAB.

Файл oscfilter.m/ oscfilter_incisive.m содержит фактическую модель поведения компонента.

Для ModelSim:

Можно также определить переменные UsrTclCmds и RunMode перед вызовом программы MATLAB с командами tcl и runmode ModelSim. Примеры:

UsrTclCmds = {'run 100000'}; RunMode = «Batch» или «CLI» или «GUI»;

srcfile1 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','vhdl','osc','simple_osc.vhd');
srcfile2 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','vhdl','osc','osc_filter.vhd');
srcfile3 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','vhdl','osc','osc_top.vhd');

ModelSim использует формат каталога стиля UNIX ®, который использует косую черту («/») вместо обратной косой черты («\»).

unixsrcfile1 = ['"' strrep(srcfile1,'\','/') '"'];
unixsrcfile2 = ['"' strrep(srcfile2,'\','/') '"'];
unixsrcfile3 = ['"' strrep(srcfile3,'\','/') '"'];

Для резцового:

srcfile1 = fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Oscillator','simple_osc.v');
srcfile2 = fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Oscillator','osc_filter.v');
srcfile3 = fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Oscillator','osc_top.v');

Создать каталог проекта

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

Для ModelSim:

if strcmp(computer,'PCWIN'),
    projdir = tempdir;  % Change to writable directory of your choosing
else
    projdir = tempname;
    if ~exist(projdir,'dir')
        mkdir(tempdir,strrep(projdir,tempdir,''));
    end
end
unixprojdir = strrep(projdir,'\','/');

Для резцового:

projdir = tempname;
warnstatus = warning('off','MATLAB:MKDIR:DirectoryExists');
mkdir(projdir);
warning(warnstatus);

Запуск сервера MATLAB

Сначала мы запускаем сервер MATLAB, hdldaemon, так что он использует обмен общей памятью. Сначала проверьте, работает ли сервер с общей памятью. Если hdldaemon не запущен, он запускается. Или, если он работает с использованием связи с сокетом TCP/IP, он отключается и перезапускается с помощью связи с общей памятью.

dstatus = hdldaemon('status');
% Use shared memory
if isempty(dstatus)
    % not running - start it
    dstatus = hdldaemon;    % tell user what's happening
elseif strcmp(dstatus.comm,'shared memory')
    % already running
    % user knows what's happening from previous hdldaemon('status')
elseif strcmp(dstatus.comm,'sockets')
    % running with different comm - stop and restart it
    disp('Shutting down HDLDaemon to restart it with shared memory');
    hdldaemon('kill');
    dstatus = hdldaemon;
else
    error(message('HDLLink:modsimosc:UnexpectedDaemonStatus'));
end

Задание команд TCL

Далее зададим команды Tcl для выполнения в имитаторе ЛПВП перед запуском моделирования.

ModelSim:

tclcmd = {  ['cd ',unixprojdir],...
            'vlib work',... %create library (if necessary)
           ['vcom -performdefaultbinding ' unixsrcfile1],...
           ['vcom -performdefaultbinding ' unixsrcfile2],...
           ['vcom -performdefaultbinding ' unixsrcfile3],...
            'vsimmatlab  work.osc_top ',...
            'matlabcp u_osc_filter -mfunc oscfilter',...
            'add wave sim:/osc_top/clk',...
            'add wave sim:/osc_top/clk_enable',...
            'add wave sim:/osc_top/reset',...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.001 -offset 50000 ',...
            'sim:/osc_top/osc_out'],...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.00003125 -offset 50000 ',...
            'sim:/osc_top/filter1x_out'],...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.00003125 -offset 50000 ',...
            'sim:/osc_top/filter4x_out'],...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.00003125 -offset 50000 ',...
            'sim:/osc_top/filter8x_out'],...
            'force sim:/osc_top/clk_enable 1 0',...
            'force sim:/osc_top/reset 1 0, 0 120 ns',...
            'force sim:/osc_top/clk 1 0 ns, 0 40 ns -r 80ns',...
            };
% Add "if any" User tcl commands at the end
if exist('UsrTclCmds','var')
    tclcmd(end+1) = UsrTclCmds;
end

Резак:

tclcmd = {  ['cd ',projdir],...
           ['exec ncvlog -64bit ' srcfile1],...
           ['exec ncvlog -64bit ' srcfile2],...
           ['exec ncvlog -64bit ' srcfile3],...
           'exec ncelab -64bit -access +wc osc_top',...
            ['hdlsimmatlab -gui  osc_top ', ...
           ' -input "{@matlabcp osc_top.u_osc_filter -mfunc oscfilter_incisive}"',...
           ' -input "{@force osc_top.clk_enable 1 -after 0ns}"',...
           ' -input "{@force osc_top.reset 0 -after 0ns 1 -after 40ns 0 -after 120ns}"',...
           ' -input "{@force osc_top.clk 1 -after 0ns 0 -after 40ns -repeat 80ns}"',...
           ' -input "{@simvision  {set w \[waveform new\]}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals osc_top.clk_enable}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals osc_top.clk}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals osc_top.reset}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.osc_out)}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.filter1x_out)}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.filter4x_out)}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.filter8x_out)}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.osc_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.filter1x_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.filter4x_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.filter8x_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform axis range -min -50000 -max 50000 -using \$w signed(osc_top.osc_out)}}"',...
           ' -input "{@simvision {waveform axis range -min -1.5e6 -max 1.5e6 -using \$w signed(osc_top.filter1x_out)}}"',...
           ' -input "{@simvision {waveform axis range -min -1.5e6 -max 1.5e6 -using \$w signed(osc_top.filter4x_out)}}"',...
           ' -input "{@simvision {waveform axis range -min -1.5e6 -max 1.5e6 -using \$w signed(osc_top.filter8x_out)}}"'
           ]};

Запуск имитатора ЛПВП

Теперь запускаем имитатор ЛПВП с помощью команды vsim (в случае ModelSim) или nclaunch (в случае Incisive). 'tclstart' приводит к выполнению указанных команд Tcl при запуске. После запуска симулятора выполните команду run, указав соответствующее время моделирования. Например, тип run 10000 ns в ModelSim или 'run 10000' в консоли Insisive. перед выполнением этого примера можно также указать RunMode = «Batch» или «CLI» или «GUI». Если не указан режим выполнения по умолчанию - GUI.

ModelSim:

if exist('RunMode','var')
    vsim('tclstart',tclcmd,'runmode',RunMode);
else
    vsim('tclstart',tclcmd);
end

Резак:

nclaunch('tclstart',tclcmd);

Теперь проверьте результаты в окне графика ModelSim/Incisive. Вы увидите, что фильтр без избыточной дискретизации плохо работает, но фильтры с избыточной дискретизацией 4X и 8X выглядят намного лучше.

На этом этот пример завершается.

Не забудьте выйти из имитатора ЛПВП, как только вы закончите с этим примером, так как каждый раз при запуске примера запускается новый имитатор ЛПВП.