В этих примерах показано, как 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, 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 для выполнения в имитаторе ЛПВП перед запуском моделирования.
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 выглядят намного лучше.


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