MODSIMOSC показывает, как MATLAB® может использоваться, чтобы реализовать компонент фильтра, используемый в модели VHDL. Пример компилирует осциллятор VHDL, задает компонент фильтра, который моделируется с помощью MATLAB и запускает симуляцию ModelSim®. Этот пример требует, чтобы временная директория сгенерировала рабочий проект ModelSim VHDL. После создания проекта VHDL этот пример запускает ModelSim (это требует доступа к ModelSim из командной строки). Этот пример использует общую память, чтобы завершить ссылку и поэтому требует, чтобы ModelSim был на том же компьютере как MATLAB. Если проект скомпилирован, симуляция может быть запущена из ModelSim.
В этом примере был разработан осциллятор VHDL, и наше задание должно найти фильтр очистки для осциллятора, который удовлетворяет наши потребности.
Первый КИХ-фильтр является 31-м порядком фильтр (с 32 касаниями) без сверхдискретизации. Второй фильтр является 127-м порядком фильтр (с 128 касаниями) с 4X сверхдискретизация. Третий фильтр является 255-м порядком фильтр (с 256 касаниями) с 8X сверхдискретизация. Все три фильтра совместно используют ту же строку задержки, и сверхдискретизация реализована с помощью многофазного метода.
Файл simple_osc.vhd содержит простой осциллятор, разработанный в VHDL.
Файл osc_filter.vhd содержит компонент MATLAB, который мы моделируем. Это содержит сущность с пустой архитектурой. matlabcp команда управляет VHDL выходные параметры и проверяет входные параметры VHDL экземпляра, созданного из этой сущности
Файл osc_top.vhd содержит высокоуровневое проводное соединение между осциллятором и компонентом MATLAB.
Файл oscfilter.m содержит фактический компонент behaviorial модель.
Можно также задать переменные "UsrTclCmds" и "RunMode" прежде, чем вызвать программу MATLAB с tcl командами и режимом выполнения Моделсима. Примеры:
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,'\','/') '"'];
Мы создаем временную рабочую директорию, в которой будет сгенерирован проект.
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,'\','/');
Мы сначала запускаем сервер 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('unexpected return value from hdldaemon(''status'')'); end
HDLDaemon is NOT running HDLDaemon shared memory server is running with 0 connections
Затем мы задаем команды 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
Теперь мы запускаем ModelSim через vsim команду. Свойство 'tclstart'
заставляет заданные команды Tcl быть запущенными при запуске. После запуска Modelsim, чтобы запустить симуляцию, используют команду выполнения в ModelSim, задавая соответствующее время симуляции. Например, введите run 10000 ns
в ModelSim., мы можем также задать RunMode ='Batch' или 'CLI' или 'графический интерфейс пользователя' прежде, чем запустить этот пример. Если незаданный режим выполнения по умолчанию является 'графический интерфейсом пользователя'.
if exist('RunMode','var') vsim('tclstart',tclcmd,'runmode',RunMode); else vsim('tclstart',tclcmd); end
Теперь проверяйте результаты в окно графика ModelSim. Вы будете видеть, что несверхдискретизированный фильтр делает мало хорошего, но 4X и 8X сверхдискретизированные фильтры выглядят намного лучше.
Это завершает этот пример.
Обязательно выйдите из ModelSim, если вы сделаны с этим примером как каждый раз, когда пример запущен, новый ModelSim запускается.