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

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

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

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

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

Для просмотра документации необходимо авторизоваться на сайте