Если вы еще не сделали этого, активируйте Cosimulation Wizard.
cosimWizard
На панели Cosimulation Type выберите MATLAB
в поле HDL cosimulation with чтобы создать MATLAB® шаблон функции (испытательный стенд или компонент).
Выберите ModelSim
или Incisive
для HDL Simulator.
Выберите Use HDL simulator executables on the system path, где находятся файлы. По умолчанию Cosimulation Wizard принимает, что они находятся в системном пути.
Если Симулятора HDL исполняемых файлов нет в системном пути, выберите Use the following HDL simulator executables at the following location и укажите расположение папки в текстовом поле ниже.
При нажатии кнопки Next, а Cosimulation Wizard не находит исполняемые файлы, происходит следующее:
Вы вернетесь в это диалоговое окно, и в Cosimulation Wizard отобразится ошибка на панели состояния.
Этот Cosimulation Wizard переключает опцию на Use the following HDL simulator executables at the following location.
Этот Cosimulation Wizard делает поле пути симуляции HDL редактируемым.
Перед продолжением необходимо ввести допустимый путь к Симулятору HDL исполняемым файлам.
Нажмите Next.
На панели HDL Files укажите файлы, которые будут использоваться при создании функции или блока.
Cosimulation Wizard пытается определить тип файлов каждого файла и отобразить тип в File List рядом с именем файла. Если Cosimulation Wizard не может определить тип или отображает неправильный тип, можно изменить тип непосредственно в File Type столбце.
По возможности Cosimulation Wizard автоматически определит порядок компиляции с помощью Симулятора HDL функциональности. Это означает, что вы можете добавить файлы в любом порядке.
Если вы используете ModelSim®, вы увидите скрипты компиляции, перечисленные как файлы .do (макро-файл ModelSim). Если вы используете Incisive®, вы увидите скрипты компиляции, перечисленные как системные скрипты.
Щелкните Add, чтобы выбрать одно или несколько имен файлов.
Удалите файлы, сначала выделив имя файла в File List, а затем нажав Remove Selected File.
Нажмите Next.
На панели HDL Compilation можно просмотреть сгенерированные команды компиляции. При необходимости можно переопределить и/или настроить эти команды. Если вы включили скрипты компиляции вместо HDL- файлов, на этой панели будет показана команда запуска этих скриптов.
Все изменения команд вводятся в поле Compilation Commands.
Примечание
Не включать команды системного интерпретатора; для примера:
set file = a.vhd vcom $file
Когда управление возвращается в Cosimulation Wizard от выполнения команды, переменная больше не содержит заданное значение. Если вы пытаетесь включить этот тип команды, вы увидите ошибку на панели Status.
Щелкните Restore default commands, чтобы вернуться к сгенерированным командам компиляции. Вы должны подтвердить, что хотите отменить любые изменения.
Для продолжения нажмите кнопку Next.
На панели HDL Module укажите имя HDL-модуля, который будет использоваться в косимуляции.
Введите имя модуля в Name of HDL module to cosimulate with.
Задайте дополнительные опции симуляции в Simulation options. Для примера на предыдущем изображении показаны следующие опции:
Разрешение симулятора HDL
Отключите оптимизацию, которая удаляет сигналы из вида симуляции
Нажмите кнопку Restore Defaults, чтобы изменить опции на значения по умолчанию.
Для Connection method выберите Shared Memory
если политика межсетевого экрана не разрешает обмен данными между сокетами TCP/IP.
Нажмите кнопку Next, чтобы перейти к следующему шагу. В это время в процессе приложение выполняет следующие действия в командном окне:
Запускает симулятор HDL.
Загрузка модуля HDL в симулятор HDL.
Запускает HDL-сервер и ожидает получения уведомления о запуске сервера.
Соединяется с HDL-сервером для получения информации о порте.
Отключение и отключение HDL-сервера.
На панели Callback Schedule введите несколько компонентов или испытательный стенд коллбэков функции из Симулятора HDL. Введите следующую информацию для каждой функции обратного вызова:
Callback type: выбор matlabcp
для создания функции компонента или matlabtb
чтобы создать функцию испытательного стенда.
Callback function name (необязательно): Укажите имя компонента или испытательного стенда функции, если оно не совпадает с HDL-компонентом. Предположение по умолчанию состоит в том, что имя функции совпадает с именем HDL-компонента.
HDL component: Введите имя компонента вручную или найдите его, нажав Browse.
Trigger mode: Задайте одно из следующих значений для запуска функции обратного вызова:
Repeat
Rising Edge
Falling Edge
Sensitivity
Sample time (ns) or Trigger Signal:
Если выбран триггер Repeat
, введите шаг расчета в наносекундах.
Если вы выбрали Rising Edge
, Falling Edge
, или Sensitivity
, Sample time (ns) изменения в Trigger Signal. Введите имя сигнала, который будет использоваться для инициирования коллбэка.
Просмотреть существующие сигналы в указанном HDL- компонента можно нажав Browse.
Щелкните Add, чтобы добавить команду в список функций обратного вызова MATLAB.
Если у вас есть больше функций обратного вызова, которые вы хотите запланировать, повторите вышеописанные шаги. Если необходимо удалить функции обратного вызова, выделите линию, которую вы хотите удалить, и нажмите Remove.
Примечание
Если вы пытаетесь добавить функцию обратного вызова для того же HDL-модуля, что и существующая функция обратного вызова в списке Функций обратного вызова MATLAB, новая функция обратного вызова перезаписает существующую (это правда, даже если вы измените тип коллбэка). Вы увидите предупреждение в Status окне:
Warning: This HDL component already has a scheduled callback function, which is replaced by this new one.
Нажмите Next.
Нажмите Back, чтобы просмотреть или изменить настройки.
Щелкните Finish, чтобы сгенерировать скрипты.
Этот Cosimulation Wizard создает следующие файлы и открывает каждый из них в отдельных РЕДАКТОРАХ MATLAB окнах.
launchHDLsimulator
- скрипт запуска HDL-симулятора для косимуляции с MATLAB.
compileHDLDesign
- скрипт компиляции, который можно повторно использовать для последующей компиляции именно этого компонента.
Файлы функции (*.m)
- компоненты и тестовые шаблоны настроенных функций, по одному для каждого компонента, заданного в Cosimulation Wizard.
Шаблон, созданный мастером, содержит простые инструкции ввода-вывода и пустые стандартные программы добавления собственного кода, как показано на примере ниже. Полный пример создания и использования функции MATLAB смотрите в Проверьте проект Фильтр приподнятого косинуса с использованием MATLAB.
function osc_top_u_osc_filter1x(obj) % Automatically generated MATLAB(R) callback function. % Copyright 2010 The MathWorks, Inc. % $Revision $ % Initialize state of callback function. if (strcmp(obj.simstatus,'Init')) disp('Initializing states ...'); % Store port information in userdata % The name strings of ports that sends data from HDL simulator to % MATLAB callback function obj.userdata.FromHdlPortNames = fields(obj.portinfo.out); obj.userdata.FromHdlPortNum = length(fields(obj.portinfo.out)); % The name strings of ports that sends data from MATLAB callback % function to HDL simulator obj.userdata.ToHdlPortNames = fields(obj.portinfo.in); obj.userdata.ToHdlPortNum = length(fields(obj.portinfo.in)); % Initialize state obj.userdata.State = 0; end % Obj.tnow is the current HDL simulation time specified in seconds disp(['Callback function is executed at time ' num2str(obj.tnow)]); if(obj.userdata.FromHdlPortNum > 0) % The name of the first input port portName = obj.userdata.FromHdlPortNames{1}; disp(['Reading input port ' portName]); % Convert the multi-valued logic value of the first port to decimal portValueDec = mvl2dec( ... obj.portvalues.(portName), ... % Multi-valued logic of the first port obj.portinfo.out.(portName).size); %#ok<NASGU> % Bit width % Then perform any necessary operations on this value passed by HDL simulator. % ... % Optionally, you can translate the port value into fixed point object, % e.g. % myfiobj = fi(portValueDec,1, 16, 4); end % Update your state(s). In the following example, we use this internal % state to implement a one-bit counter obj.userdata.State = ~obj.userdata.State; if(obj.userdata.ToHdlPortNum > 0) % The name of the first output port in HDL portName = obj.userdata.ToHdlPortNames{1}; disp(['Writing output port ' portName]); % Assign the first port value to internal state obj.userdata.State. % Before assignment, convert decimal value to multi-valued logic. % You can change obj.userdata.State to another other valid decimal values. obj.portvalues.(portName) = dec2mvl(... obj.userdata.State, ... obj.portinfo.in.(portName).size); % Operate on other out ports, if there are any. % ... end