Реализация компонента фильтра осциллятора в MATLAB®

Это, которое показывают примеры, как 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

Мы сначала запускаем сервер 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

Затем мы задаем команды 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

Теперь мы запускаем симулятор 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 запускается.