В этих примерах показано, как MATLAB ® может использоваться для реализации компонента фильтра, используемого в модели. Пример компилирует генератор VHDL/Verilog, задает компонент фильтра, который моделируется с помощью MATLAB, и запускает симуляцию HDL. Этот пример требует временной директории, чтобы сгенерировать рабочий проект ModelSim VHDL или Incisive Verilog. После создания HDL-проекта этот пример запускает Симулятор HDL (для этого требуется доступ к ModelSim/Incisive из командной строки). Этот пример использует общую память для завершения ссылки и поэтому требует, чтобы симулятор HDL находился на том же компьютере, что и MATLAB. После компиляции проекта симуляция может быть запущена из ModelSim/Incisive.
В этом примере были разработаны генераторы VHDL в ModelSim и генератор Verilog в Incisive, и наша задача состоит в том, чтобы найти фильтр очистки для генератора, который удовлетворяет нашим потребностям.
Первый конечная импульсная характеристика является фильтром 31-го порядка (32-тап) без избыточной дискретизации. Второй фильтр является фильтром 127-го порядка (128-тап) с 4X избыточной дискретизацией. Третий фильтр является фильтром 255-го порядка (256-тап) с 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, которые будут выполняться в Симулятор HDL до запуска симуляции.
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)}}"'
]};
Теперь запускаем Симулятор HDL через команду vsim (в случае с ModelSim) или nclaunch (в случае с Incisive). The 'tclstart' свойство приводит к выполнению заданных команд Tcl при запуске. После запуска симулятора, чтобы запустить симуляцию, используйте команду run, указав соответствующее время симуляции. Для примера типа run 10000 ns в ModelSim или 'run 10000' в Резцовой консоли. можно также задать 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 plot. Вы увидите, что фильтр без избыточной дискретизации делает мало хорошего, но 4X и 8X фильтры с избыточной дискретизацией выглядят намного лучше.


На этом этот пример завершается.
Обязательно закройте симулятор HDL, как только вы сделаны с этим примером, так как каждый раз, когда пример запускается, запускается новый симулятор HDL.