В этих примерах показано, как 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.