Если вы еще не сделали так, вызовите 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 делает поле path симуляции 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. Можно заменить и/или настроить те команды, если вы желаете. Если вы включали скрипты компиляции вместо файлов HDL, эта панель покажет вам команду, чтобы запустить те скрипты.
Введите любые изменения в командах в поле Compilation Commands.
Не включайте системные команды интерпретатора; например:
set file = a.vhd vcom $file
Когда управление возвращается к Cosimulation Wizard от выполнения команды, переменная больше не содержит значение, которое было установлено. Если вы действительно попытаетесь включать этот тип команды, вы будете видеть ошибку в панели Status.
Нажмите Restore default commands, чтобы вернуться к сгенерированным командам компиляции HDL. Вас просят подтвердить, что вы хотите отменить любые изменения.
Нажмите Next, чтобы продолжить.
В панели HDL Module обеспечьте имя модуля HDL, который будет использоваться в cosimulation.
Введите имя модуля в 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 Editor окна.
launchHDLsimulator
— скрипт для запуска симулятора HDL для cosimulation с MATLAB.
compileHDLDesign
— скрипт компиляции можно снова использовать для последующей компиляции этого конкретного компонента.
Файлы функции (*.m)
— и испытательный стенд компонента настроил шаблоны функций, один для каждого компонента, заданного в Cosimulation Wizard.
Шаблон, который генерирует мастер, содержит некоторые простые инструкции по порту I/O и пустые стандартные программы, где вы добавляете свой собственный код, как показано в примере ниже. Для полного примера создания и использования функции 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