Знакомство с пакетом OrCad 9.1. Урок 7. Как задавать внешние воздействия

№ 7’2002
PDF версия
Прежде чем начать моделирование схемы, надо определить сигналы на ее входах. В пакете OrCAD внешние воздействия задаются из самой программы моделирования OrCAD Simulate.

Прежде чем начать моделирование схемы, надо определить сигналы на ее входах. В пакете OrCAD внешние воздействия задаются из самой программы моделирования OrCAD Simulate. Это можно сделать двумя способами:

  • Описать временные диаграммы входных сигналов на языке VHDL, активизировав команду Stimulus/Create Test Bench…;
  • Выполнить ту же самую работу в интерактивном режиме с помощью команды Stimulus/New Interactive…

Все статьи цикла:

Для начинающего пользователя рекомендуется второй вариант, с него мы и начнем. К сожалению, OrCAD Simulate не имеет программы графического редактирования описаний входных сигналов, такой, например, как Stimulus Editor (StmEd) в пакете Design Lab 8. В этом пакете эпюры входных сигналов можно просто «рисовать» мышкой. Ну что ж, будем использовать то, что есть. Напомню, что мы собираемся описать внешние воздействия для схемы mux2, нарисованной на первом уроке. Это входы D0, D1 и A.

В выпадающем меню программы OrCAD Simulate найдем команду Stimulus/New Interactive… и исполним ее. На экране монитора появится диалоговая панель Interactive Stimulus с тремя закладками Basic, Advanced и Clock (рис. 1).

Диалоговая панель для задания параметров входных сигналов типа Basic

Конечно, ее первоначальный вид не такой, как на рис. 1 — здесь уже показаны результаты программирования сигнала D0. Согласитесь, в пустые окна смотреть не интересно.

По умолчанию активна левая закладка Basic. Это основной (базовый) способ описания входного сигнала, при котором указываются только его переключения, записываемые в хронологическом порядке. Формат переключения сигнала (события) весьма простой: в окно Set to (в центре панели) вводится новое значение сигнала, а в окне At (справа от него) указывается момент времени, когда сигнал должен принять это новое значение. Заметим, что время задается в абсолютных единицах, отсчитываемых от начала моделирования (tm=0). Вероятно, по этой причине в более ранних версиях пакета OrCAD данная закладка называлась Absolute.

Рассмотрим подробнее описание сигнала типа Basic.

Прежде всего, надо указать имя сигнала. Оно вводится в небольшое окно Stimulate Signal Named, расположенное в верхнем правом углу панели. Чтобы не терять время, вспоминая, какие сигналы есть в исследуемой схеме и как они называются, щелкнем на кнопке Browse…, и перед нами появится их полный список — диалоговая панель Browse Signals (рис. 2). В ее окне Signals in Context выберем программируемый сигнал, например, D0. Щелкнув на кнопке OK, вернемся к панели Interactive Stimulus (рис. 1).

Выбор имени программируемого сигнала

В окне Stimulate Signal Named (рис. 1) появится имя этого сигнала в формате SCHEMATIC1.D0, где SCHEMATIC1 — имя схемы в файле проекта, а D0 — имя сигнала в этой схеме. Далее начинается непосредственное программирование сигнала D0.

  1. Из выпадающего списка Set to выбираем нужный логический уровень. Напомним, что моделирование в OrCAD Simulate ведется в девятизначной логике типа Std_logic с алфавитом {‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘–’}.
  2. В окне At устанавливаем момент времени, когда должно произойти переключение сигнала, на уровень, указанный в окне Set to.
  3. Нажав на кнопку Add, переносим описанное событие на программируемом входе D0 в окно Stimulus Descriptions, добавляя его к списку ранее введенных событий. По умолчанию время задается в наносекундах (ns).

Из рис. 1 видно, что мы определили для сигнала D0 пять переключений. Строго говоря, в этой фразе есть одна неточность. Верхняя строчка задает значение сигнала перед началом моделирования и фактически является начальным состоянием сигнала, а не переключением. Заметим, что если сигнал D0 при декларации не имеет начального значения, по умолчанию он принимает значение левой границы (D0’left) декларируемого типа Std_logic, то есть значение ‘U’ (не инициализировано).

В процессе формирования списка слева от каждого события моделятор автоматически ставит знак «+» (Enable). Это означает, что все события включены в список переключений описываемого сигнала. Если вы захотите избавиться от некоторых переключений, то достаточно напротив них поставить знак «–», выделив их и щелкнув на кнопке Disable. Теперь они невидимы для моделятора.

Запрограммировав сигнал D0, можно нажать на кнопку OK и посмотреть, что получилось. Выполним команду Simulate/run…, то есть промоделируем схему mux2, определив пока только один сигнал D0. Все остальные сигналы удалим, сконцентрировав внимание на программируемом сигнале (рис. 3а).

Результаты программирования сигнала D0

Вернемся на начало моделирования — команда Simulate/Restart — и отредактируем временную диаграмму для D0, исключив из нее событие Set to Z at time 300. Для этого надо щелкнуть на иконке или исполнить команду Stimulus/Edit Interactive…, затем выделить данное событие и щелкнуть на кнопке Disable. Слева от него вместо знака «+» появится знак «–». Повторив моделирование, увидим результат (рис. 3б). Теперь сигнал D0 не переключается в Z-состояние.

Обратите внимание, что при выделении любого события в списке переключений сигнала его параметры (значение и время) вновь передаются в окна Set to и At. Следовательно, их можно изменять по своему желанию.

Единственное требование, которое нельзя нарушать — хронологическая последовательность событий: время редактируемого события должно оставаться больше предыдущего и меньше последующего. Скорректировав параметры события, нажмите кнопку Change и убедитесь, что изменения перенесены в окно Stimulus Description.

Если появилась необходимость вставить новое событие между двумя ранее описанными, то надо выделить более позднее и нажать кнопку Insert. Соседние события «раздвинутся», и в пустую строку можно вписать новое событие.

Рассмотренный тип сигналов имеет один серьезный недостаток: он неудобен для описания периодических процессов, особенно в тех случаях, когда надо описать много периодов. Ведь для каждого периода придется вручную задавать по два события. В этой ситуации на помощь приходит способ описания сигналов типа Clock (рис. 1, правая закладка). Здесь имеется возможность задать бесконечное число повторений (Repeat forever) или их конкретное число (Repeat). По умолчанию установлен первый режим, то есть периодический сигнал будет «кувыркаться» на протяжении всего времени моделирования.

Рассмотрим более подробно программирование периодического сигнала. На рис. 4 показано содержимое отдельных полей для сигнала D0, имеющего одинаковые длительности импульса и паузы (меандр). Сначала они равны 100 нс. С этими временными интервалами выполняются первые два периода.

Затем, с момента времени 600 нс, интервалы времени укорачиваются до 75 нс, и сигнал D0 повторяется три раза. Наконец, с момента 1200 нс его временные параметры уменьшаются до 50 нс, и в этих условиях формируются последние четыре периода. Чтобы колебания закончились на низком уровне, потребовалась «небольшая хитрость», спрятанная в нижней строке описания сигнала D0. Заметим, что длительности временных интервалов (в примере по 10 нс) уже никого не интересуют.

Диалоговая панель для программирования периодических сигналов (тип Clock)

В окне Signals under Stimulus (рис. 4) видно, что все три сигнала D0, D1и A запрограммированы как периодические.

В нижней части рассмотренной диалоговой панели находятся уже знакомые нам кнопки Insert, Disable и Delete, с помощью которых можно вставлять, выключать и удалять отдельные строки в описании сигнала. На рис. 5 приведены результаты тестирования запрограммированного сигнала D0.

Результаты тестирования запрограммированного сигнала D0

В точках, где заканчивается одна и начинается следующая временная последовательность, расставлены визирная линейка (600 нс) и два маркера — 1200 нс и 1600 нс соответственно.

Последний рассматриваемый нами тип сигналов, Advanced, самый интересный и предоставляет в распоряжение пользователя наибольшие возможности. Недаром в переводе с английского он звучит как «передовой». В нем объединяются возможности первого (Basic) и третьего (Clock) типов. На диалоговой панели Interactive Stimulus (рис. 1 или 4) это средняя закладка.

Основная особенность программирования сигналов этого типа заключается в том, что описываются не только переключения, но и состояния сигнала. Причем время удержания состояния задается с помощью ключевого слова Wait for (рис. 6).

Диалоговая панель для описания входных сигналов типа Advanced

Другая особенность заключается в том, что интервалы времени, определяющие длительность состояния, задаются не в абсолютных, как сигналы типа Basic, а в относительных единицах времени. Иначе говоря, длительность следующего состояния задается относительно предыдущего, а не от начала моделирования. Вероятно, по этой причине в более ранних версиях пакета эта закладка так и называлась: Relative — относительный тип.

При задании временной диаграммы для сигналов относительного типа добавляется еще один параметр — время, с которого начинается временная диаграмма (поле Start at вверху справа). По умолчанию в нем стоит 0 ns, то есть описание сигнала «привязывается» к началу моделирования. Вы можете легко сдвинуть всю временную диаграмму, если в это поле поставите число, отличное от нуля. Попробуйте сместить диаграмму сигнала типа Basic, и у вас возникнут проблемы — придется редактировать все строки описания.

Рассмотрим более подробно описание сигнала типа Advanced, приведенное в окне Stimulus Descriptions на рис. 6. В поле Start at стоит 0 ns, значит, сигнал привязан к началу моделирования. Описание сигнала начинается строчками:

Set to 1
Wait for 200 ns

Эти команды приказывают моделятору установить сигнал A на уровень 1 и удерживать его неизменным в течение 200 нс относительно момента времени, указанного в поле Start at. Затем сигнал A следует переключить на уровень 0 (рис. 6) и сохранять его неизменным в течение 300 нс. Наконец, сигнал
принимает значение Z и ждет еще 500 нс, прежде чем произойдет последнее переключение в 1 (рис. 7).

Результаты тестирования запрограммированного сигнала A типа Advanced

Удобство данного способа формирования сигналов состоит еще и в том, что с его помощью легко описать повторяющиеся участки входной последовательности. Для этого достаточно выделить фрагмент временной диаграммы (блок), который надо повторять, задать число повторений и нажать кнопку Repeat Block. Описанным способом можно программировать не один, а несколько участков временной диаграммы. Допускаются даже вложенные циклы. Пример такой возможности показан на рис. 8.

Программирование сигнала D1 в виде двух вложенных циклических процессов

Однако самое интересное — это программирование шинных сигналов. Для простоты объединим сигналы D0 и D1 в шину, так чтобы D1 был старшим разрядом (MSB). Мы не хотим потерять ранее выполненную работу, поэтому сохраним уже созданные временные диаграммы в файле mux2_1.stm, выгрузим их из проекта — команда Stimulus/Unload Interactive и закроем панель mux2_1.stm.

Начнем все сначала: повторение — мать учения. Командой Stimulus/New Interactive… вызовем вновь диалоговую панель Interactive Stimulus и активизируем закладку Advanced. Откроем список сигналов и выделим в нем те, которые должны войти в шину, то есть сигналы D1 и D0. Выделение можно производить в любом порядке. Добавление нового сигнала к списку сигналов шины осуществляется при нажатой клавише Shift или Ctrl. Когда все сигналы шины определены, щелкнем на кнопке New Group… и зададим имя группы, например, D_bus2.

В окне Signals in Context появится имя созданной группы. Двойным щелчком на имени группы можно «открыть» шину и посмотреть список составляющих ее сигналов. Щелкнем на кнопке Edit Groups… Появится диалоговая панель Edit Signals Groups (рис. 9), в верхнем окне которой мы увидим имя шины, а в нижнем правом — список составляющих ее сигналов. Старший разряд шины всегда верхний (MSB), а младший — самый нижний (LSB).

Редактирование списка сигналов в группе

Если последовательность сигналов в шине вас не устраивает, переместите их вверх или вниз с помощью кнопок Move, показанных справа

. Можно сделать групповое выделение и перемещать сразу несколько сигналов. По окончании работы нажмите OK.

Сформировав шину, зададим для нее временную диаграмму (на закладке Advanced):

Set to 0 [Hex]
Wait for 100 ns
Set to 1 [Hex]
Wait for 100 ns
Set to 2 [Hex]
Wait for 100 ns
Set to 3 [Hex]
Wait for 100 ns

Затем выделим мышью только что созданное описание и в окне Repeat Block укажем число повторений, например, 5 (рис. 10).

Программирование шинного сигнала D_bus2

Если шинный сигнал имеет регулярную форму (как в рассмотренном примере), то удобнее применить сокращенную запись, используя команды Increment или Decrement (рис. 11).

То же самое описание сигнала D_bus2, полученное с помощью команды Increment

В процессе отладки проектируемой схемы часто возникает необходимость изменять ранее введенные временные диаграммы входных сигналов. Чтобы вернуться на диалоговую панель Interactive Stimulus

, проще всего щелкнуть на иконке Edit Interactive Stimulus или исполнить соответствующую команду Stimulus/Edit Interactive…

Однако удобнее взаимодействовать с редактором стимулов через окно *.stm, которое желательно держать всегда распахнутым (рис. 12). В нем отображаются все три типа сигналов (Basic, Advanced и Clock), а также полный список внешних воздействий исследуемой схемы. Двойным щелчком на имени сигнала легко открыть его описание и проконтролировать, все ли правильно.

Окно с описаниями внешних воздействий

Выделив сигнал и нажав правую кнопку мыши, можно вызвать вплывающее меню и активизировать команду Edit… В этом случае откроется диалоговая панель с закладкой, на которой запрограммирован именно данный сигнал. Нередко возникает необходимость сменить тип сигнала, например, вместо Basic сигналу D0 задать тип Clock. В этом случае придется выделить все описание сигнала и удалить его, затем можно программировать сигнал так, как будто прежнего описания и вовсе не было.

Задание VHDL-описаний входных сигналов

Язык VHDL позволяет описывать не только поведение и структуру исследуемых схем, но и создавать VHDL-описания входных сигналов. Для этих целей OrCAD Simulate автоматически генерирует «внешнюю оболочку», в которую монтируется исследуемая схема и куда позднее пользователь может поместить
описания входных сигналов. Другими словами, создается некий шаблон (заготовка), который требует еще ручной доработки.

Чтобы автоматическая генерация шаблона выполнялась корректно и в полном объеме, необходимо оформить исследуемую схему в виде объекта проекта, придав ему стандартную структуру VHDL-блока, содержащего интерфейс (Entity) и архитектуру (Architecture). Придется вернуться в графический редактор и дорисовать схему мультиплексора mux2, добавив к ней внешние порты D0, D1, A и Q.

Для этого надо активизировать команду Place/Hierarchical Port…

или щелкнуть на пиктограмме Place port.

На появившейся диалоговой панели Place Hierarchical Port выберем символы PORTRIGHT-R для входных цепей и PORTLEFT-L — для выходной цепи. Разместив порты, присвоим им такие же имена, что и у соответствующих цепей (рис. 13).

Исследуемая схема оформлена в виде объекта проекта

Командой Tools/Simulate… передадим схему на моделирование. Теперь можно приступить к созданию VHDL-описаний входных сигналов.

Введем команду Stimulus/Create Test Bench… Откроется диалоговая панель с тем же названием. В поле VHDL Output File зададим имя выходного файла, где будут храниться наборы тестовых сигналов, например mux2_tb (от слов test bench). Установим флажок Add to Project, чтобы файл с тестами был подключен к проекту, и нажмем OK.

Откроется окно с текстом только что сгенерированного VHDL-кода. Поначалу он кажется весьма запутанным. Чтобы не «забивать голову» ненужными сейчас деталями, удалим из автоматически созданного файла mux2_tb.vhd объект проекта SCHEMATIC1_stub и его архитектурное тело mapping.

Второй объект проекта — test_SCHEMATIC1 имеет архитектурное тело testbench, куда и предстоит включить описания входных сигналов. Место включения выделено фразой: «— Place stimulus and analysis statements here» («разместите здесь описания стимулов»).

Укажем это место, щелкнув на нем левой кнопкой мыши, и отправимся на поиски образцов (Samples) типовых конструкций языка VHDL. Активизируем команду Edit/Samples… и после того, как откроется диалоговая панель VHDL Samples, найдем и дважды щелкнем на строке Testbench: Clock. Это заготовка для описания периодического сигнала Clock (CK).

Заменим имя CK на существующее в нашей схеме имя D0 и аналогичным образом зададим еще два описания для сигналов D1 и A.

Не забудьте отредактировать и временные интервалы, заменив 100 ns на 200 ns для сигнала D1 и на 800 ns — для сигнала A. После редактирования текст должен выглядеть так:

process begin
-- modify the delay values and clock signal name
D0 <= '0'; wait for 100 ns;
D0 <= '1'; wait for 100 ns;
end process;
process begin
D1 <= '0'; wait for 200 ns;
D1 <= '1'; wait for 200 ns;
end process;
process begin
A <= '0'; wait for 800 ns;
A <= '1'; wait for 800 ns;
end process;

Теперь следует перегрузить проект (команда Simulate/Reload Project) и выполнить моделирование (команда Simulate/Run…). Результаты моделирования (рис. 14) показывают, что вся предварительная работа была выполнена корректно.

Результаты моделирования

Рассмотренный способ задания входных воздействий может показаться весьма трудоемким. Так оно, наверное, и есть. Однако существует и более простая технология. Достаточно открыть VHDL-список цепей (файл mux2.vhd), созданный графическим редактором OrCAD Capture, и вставить в него уже знакомые нам VHDL-описания входных сигналов D0, D1 и A.

Правда, в этом случае уже никто не подскажет нам место, куда включать данный текст. Впрочем, мы ведь грамотные люди, и не станем включать процессы в раздел деклараций. А в исполняемом разделе описания внешних воздействий могут находиться в любом месте. Конечно, логичнее всего поместить их в начало исполняемого раздела до вызова экземпляров компонентов.

Можно ли применить описанную технологию формирования внешних воздействий к схеме, на которой не установлены иерархические порты? Конечно, да. Главное, чтобы эти описания задавались «снаружи» того объекта, для которого они предназначены.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *