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

MODSIMSPECDISP показывает, как MATLAB® может использоваться, чтобы реализовать компонент VHDL, который используется, чтобы отобразить спектр сигнала из проекта VHDL в ModelSim®. Этот пример компилирует источник VHDL, содержащий частоту, скачкообразно перемещающую синусоиду, питающую фильтр lowpass, и задает компонент отображения спектра в MATLAB. Компонент MATLAB буферизует свои входные параметры в кадры 128 выборок и отображает спектры неотфильтрованных и отфильтрованных сигналов, когда симуляция запускается. Этот пример требует, чтобы временная рабочая директория сгенерировала рабочий проект ModelSim VHDL. После создания проекта VHDL этот пример запускает ModelSim (это требует доступа к ModelSim из командной строки). Этот пример использует общую память, чтобы завершить ссылку и поэтому требует, чтобы ModelSim был на том же компьютере как MATLAB. Если проект скомпилирован, симуляция может быть запущена из ModelSim.

Задайте Файлы, которые будут Использоваться

Файл sine_waves.vhd содержит исходный сигнал, разработанный в VHDL.

Файл lowpass_filter.vhd содержит фильтр lowpass, разработанный в MATLAB и сгенерированный с Filter Design HDL Coder™.

Файл spec_display.vhd содержит компонент MATLAB, который мы моделируем. Это содержит сущность с пустой архитектурой. matlabcp команда проверяет входные параметры VHDL экземпляра, созданного из этой сущности.

Файл specdisp_top.vhd содержит высокоуровневое проводное соединение между источником, lowpass фильтр, и компонентом MATLAB.

можно также задать переменные "UsrTclCmds" и "RunMode" с tcl командами и режимом выполнения Моделсима. Примеры:

UsrTclCmds = {'запускаются 100000'}; RunMode = 'пакет' или 'CLI' или 'графический интерфейс пользователя';

srcfile1 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos',...
    'vhdl','specdisp','sine_waves.vhd');
srcfile2 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos',...
    'vhdl','specdisp','lowpass_filter.vhd');
srcfile3 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos',...
    'vhdl','specdisp','spec_display.vhd');
srcfile4 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos',...
    'vhdl','specdisp','specdisp_top.vhd');

ModelSim использует формат директории стиля UNIX®, который использует наклонные черты вправо (" / ") вместо наклонных черт влево (" \").

unixsrcfile1 = ['"' strrep(srcfile1,'\','/') '"'];
unixsrcfile2 = ['"' strrep(srcfile2,'\','/') '"'];
unixsrcfile3 = ['"' strrep(srcfile3,'\','/') '"'];
unixsrcfile4 = ['"' strrep(srcfile4,'\','/') '"'];

Создайте каталог проекта

Мы создаем временную рабочую директорию, в которой будет сгенерирован проект.

if ispc
    projdir = tempdir;
else
    projdir = tempname;
end
warnstatus = warning('off','MATLAB:MKDIR:DirectoryExists');
mkdir(projdir);
warning(warnstatus);
unixprojdir =  strrep(projdir,'\','/');

Запустите сервер MATLAB

Мы сначала запускаем сервер MATLAB, hdldaemon, такой, что он использует коммуникацию общей памяти. Мы сначала проверяем, запускает ли сервер уже общую память использования. Если hdldaemon не запускается, он запускается. Или, если это запускает использование коммуникация сокета TCP/IP, это закрывается и перезапустило коммуникацию общей памяти использования.

dstatus = hdldaemon('status');
if isempty(dstatus)
    % hdldaemon is not running
    % start it - default is shared memory communication
    dstatus = hdldaemon;
elseif strcmp(dstatus.comm,'shared memory')
    % hdldaemon is already running with shared memory
elseif strcmp(dstatus.comm,'sockets')
    % hdldaemon is running with socket communication
    % shut it down 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 изменяется на временную рабочую директорию.

tclcmd = [tclcmd, ['cd ',unixprojdir]];

Команда vlib создает библиотеку work проекта.

tclcmd = [tclcmd, 'vlib work'];

Команда vcom компилирует файл VHDL. Опция -performdefaultbinding включает привязку по умолчанию, если они были отключены в файле modelsim.ini.

tclcmd = [tclcmd, ['vcom -performdefaultbinding ' unixsrcfile1],...
                  ['vcom -performdefaultbinding ' unixsrcfile2],...
                  ['vcom -performdefaultbinding ' unixsrcfile3],...
                  ['vcom -performdefaultbinding ' unixsrcfile4]];

Команда vsimmatlab, вариант команды ModelSim vsim, загружает экземпляр сущности VHDL для cosimulation с MATLAB. Эта команда является расширением HDL Verifier™ набора команд ModelSim.

tclcmd = [tclcmd, 'vsimmatlab work.specdisp_top'];

Команда matlabcp инициирует компонент MATLAB для загруженного экземпляра сущности spec_display. Эта команда является расширением HDL Verifier набора команд ModelSim. Опция -mfunc указывает, что specdisplay.m будет использоваться, чтобы реализовать этот компонент.

tclcmd = [tclcmd, 'matlabcp u_spec_display -mfunc specdisplay'];

Команда force применяет стимул для сигналов сброса и часов.

tclcmd = [tclcmd, 'force sim:/specdisp_top/clk_enable 1 0',...
                  'force sim:/specdisp_top/reset 1 0, 0 20 ns',...
                  'force sim:/specdisp_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, задавая соответствующее время симуляции. Например, введите run 100000 в ModelSim. Мы видим, что фигура обновляет, в то время как симуляция продолжает. Обязательно выйдите из ModelSim и закройте сервер MATLAB при помощи hdldaemon kill, если вы сделаны с этим примером как каждый раз, когда пример запущен, новый ModelSim запускается. мы можем также задать RunMode ='Batch' или 'CLI' или 'графический интерфейс пользователя' прежде, чем запустить этот пример. Если незаданный режим выполнения по умолчанию является 'графический интерфейсом пользователя'.

if exist('RunMode','var')
    vsim('tclstart',tclcmd,'runmode',RunMode);
else
    vsim('tclstart',tclcmd);
end