Это, которое показывают примеры, как MATLAB® может использоваться, чтобы реализовать компонент фильтра, используемый в модели HDL. Пример компилирует осциллятор VHDL/Verilog, задает компонент фильтра, который моделируется с помощью MATLAB и запускает симуляцию HDL. Этот пример требует, чтобы временная директория сгенерировала рабочий ModelSim VHDL или Острый проект Verilog. После создания проекта HDL этот пример запускает симулятор HDL (это требует доступа к ModelSim/Incisive из командной строки). Этот пример использует общую память, чтобы завершить ссылку и поэтому требует, чтобы симулятор HDL был на том же компьютере как MATLAB. Если проект скомпилирован, симуляция может быть запущена из ModelSim/Incisive.
В этом примере были разработаны осциллятор VHDL в ModelSim и осциллятор Verilog в Остром, и наше задание должно найти фильтр очистки для осциллятора, который удовлетворяет наши потребности.
Первый КИХ-фильтр является 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 командами и режимом выполнения ModelSim. Примеры:
UsrTclCmds = {'запускаются 100000'}; RunMode = 'пакет' или 'CLI' или 'графический интерфейс пользователя';
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 (в случае Острого) команда. Свойство 'tclstart'
заставляет заданные команды Tcl быть запущенными при запуске. После запуска средства моделирования, чтобы запустить симуляцию, используют команду выполнения, задавая соответствующее время симуляции. Например, введите run 10000 ns
в ModelSim или 'run 10000'
в консоли Incisive. мы можем также задать RunMode ='Batch' или 'CLI' или 'графический интерфейс пользователя' прежде, чем запустить этот пример. Если незаданный режим выполнения по умолчанию является 'графический интерфейсом пользователя'.
ModelSim:
if exist('RunMode','var') vsim('tclstart',tclcmd,'runmode',RunMode); else vsim('tclstart',tclcmd); end
Острый:
nclaunch('tclstart',tclcmd);
Теперь проверяйте результаты в окно графика ModelSim/Incisive. Вы будете видеть, что несверхдискретизированный фильтр делает мало хорошего, но 4X и 8X сверхдискретизированные фильтры выглядят намного лучше.
Это завершает этот пример.
Обязательно выйдите из симулятора HDL, если вы сделаны с этим примером как каждый раз, когда пример запущен, новый симулятор HDL запускается.