Подписка на новости

Опрос

Нужны ли комментарии к статьям? Комментировали бы вы?

Реклама

 

2002 №3

Знакомство с пакетом OrCad 9.1. Урок 3. Проектирование иерархических блоков

Шалагинов Александр


Все современные САПР поддерживают иерархическое проектирование, и OrCAD не является исключением. Основная идея такого проектирования состоит в том, что целый фрагмент схемы можно спрятать в «черный ящик» и тем самым упростить схемное описание. Эту операцию разрешается повторять неоднократно и для других фрагментов схемы. Более того, если число «черных ящиков» покажется вам слишком большим, можно упаковать их в «ящик» еще больших размеров.Таким образом, создается ощущение, что рост сложности проекта не ведет, казалось бы, к неизбежному усложнению его схемного описания.

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

В САПР OrCAD «черные ящики» реализуются в виде иерархических блоков. В такой блок обычно помещается типовой фрагмент схемы, функция которого очевидна и повторяется в проекте неоднократно, например мультиплексор, счетчик или регистр.

Еще одно применение иерархических блоков оказывается полезным при моделировании сложных объектов, когда требуемая модель отсутствует. В этом случае вы создаете иерархическую модель (макромодель) из компонентов более низкого иерархического уровня с известными поведенческими описаниями.

Рассмотрим технологию создания и моделирования иерархических схем на примере уже знакомого нам мультиплексора 2>1 (урок 1). Внутренним описанием блока может быть схема (Schematic View), VHDL-код или список соединений в формате EDIF. Рассмотрим сначала первый вариант.

Проектирование иерархического блока со схемой замещения

  1. Создадим новый проект, набрав команду File/New/Project...:

    1.1. Введем его имя, например test_mux2_HB.

    1.2. Укажем его место на диске, например E:\OrCAD_9\mux2_HB. Если названной папки не существует, она будет создана автоматически.

    1.3. Зададим тип проекта, в нашем случае надо выбрать опцию PC Board Wizard — моделирование и трассировка печатных плат (последней операцией мы заниматься не будем).

  2. На панели PCB Project Wizard установим флажок Enable Project Simulation (разрешить моделирование проекта) и выберем нижнюю кнопку Add VHDL-based digital simulation resources (использовать VHDL-модели).
  3. Подключим к проекту две библиотеки: ttl.olb и ttl.vhd.
  4. Сделаем активным окно SCHEMATIC1:PAGE1 (оба имени устанавливаются по умолчанию и могут быть изменены пользователем). В этом окне нам предстоит нарисовать схему, которая содержит всего один иерархический блок мультиплексора HB1:

    4.1. Разместим блок в рабочем окне редактора Schematic Page Editor. Исполним команду Place/Hierarchical Block... На экране появится диалоговая панель с одноименным названием (рис. 1).

    Диалоговая панель для задания параметров иерархического блока mux2_HB

    4.2. Зададим позиционное обозначение блока, например HB1.

    4.3. В окне «Implementation Type» (способ реализации иерархического блока) конкретизируем его тип — Schematic View.

    4.4. В окне «Implementation name» укажем его имя — mux2_HB.

    4.5. Нижнее окно Path and filename оставим пустым. В этом случае по умолчанию схема замещения блока будет размещена в каталоге текущего проекта, то есть внутри проекта test_mux2_HB.dsn.

    4.6. В разделе Primitive поставим тип No или сохраним заданное умолчанием значение Default, если вы уверены, что установки правильные.

    На них всегда можно взглянуть, выбрав команду Options/Design Template... и вкладку Hierarchy. Заполненная панель должна выглядеть так, как показано на рис. 1.

  5. Нарисуем иерархический блок. Его размеры определяются числом входных или выходных контактов. Не следует делать блок излишне большим. Разместим внутри него иерархические контакты (команда Place/Hierarchical Pin...), зададим им имена D0, D1, A, Q и тип выводов (Input, Output). Если названная команда недоступна для исполнения, значит, вы забыли выделить блок, для которого собираетесь задавать контакты.
  6. Подведем к иерархическим контактам проводники (команда Place/Wire).
  7. Зададим им пользовательские имена — алиасы (команда Place/Net Alias...). Помните, контур с именем надо «прислонить» к тому проводнику, который вы именуете, чтобы он касался цепи. Цепи могут иметь те же имена, что и контакты, или любые другие по вашему усмотрению. После всех выполненных действий схема должна выглядеть так, как показано на рис. 2 а.
    Окна редактора страниц для проектирования внешнего (а) и внутреннего (б) описания иерархического блока
  8. Выделив блок, щелкнем на нем правой кнопкой мыши и активизируем команду Descend Hierarchy (понизить уровень). Редактор понизит уровень иерархии и откроет новую схемную страницу (рис. 2 б). На ней будут автоматически созданы порты, соответствующие входным и выходным контактам иерархического блока.

    Саму схему замещения блока еще предстоит нарисовать. Обратите внимание, что редактор поместил в окне менеджера проекта новую папку с именем mux2_HB. Именно в ней будет храниться схема замещения блока. В виде отдельного файла она не существует, что обеспечивает независимость проекта от внешней среды и гарантирует его мобильность.

  9. Рисуем схему замещения блока (урок 1, рис. 1):

    9.1. Из библиотеки ttl.olb извлекаем один за другим компоненты 7404 (инвертор), 7408 (2И), 7432 (2ИЛИ) и размещаем их в рабочем окне редактора.

    9.2. Выполняем необходимые соединения в соответствии с принципиальной схемой мультиплексора.

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

  10. Промоделируем нашу схему, состоящую из одного иерархического блока mux2_HB. Проекты типа PCB-Simulate обрабатываются моделятором OrCAD Simulate. Эта программа запускается из оболочки графического редактора OrCAD Capture (команда Tools/Simulate..., вызываемая из окна менеджера проекта):

    10.1. Выберем режим In Design (моделирование проекта, выполненного на микросхемах нижнего и среднего уровней интеграции). Появится окно программы OrCAD Simulate и запрос о загрузке схемы в текущий момент. Нажмем кнопку «Да». Если в проекте есть ошибки, они будут выданы в окне Session Log. Устранив их, повторно загрузим проект командой Simulate/Reload Project.

    10.2. Зададим временные диаграммы на входах D0, D1 и A. С этой целью активизируем команду Stimulus/New Interactive... и выберем для простоты закладку Clock. Нажав кнопку Browse…, укажем имя первого входного сигнала D0 и зададим его временную диаграмму. Те же операции проделаем для остальных входов. Более подробно работа с редактором входных воздействий будет рассмотрена на уроке 7;

    10.3. Командой Simulate/Run запустим моделирование проекта, скорректировав финальное время Run Time на отметке 2000 ns (для нашего примера). На экране появятся результаты моделирования, которые мы уже наблюдали (урок 1, рис. 10), тестируя такую же схему при знакомстве с пакетом OrCAD.

Если вы спроектировали иерархический блок с типовой схемой замещения (как в нашем случае), то естественно возникает вопрос, а нельзя ли его применить в другом проекте. Вопрос не праздный, ведь схема замещения «вложена» внутрь конкретного проекта (а именно в файл test_mux2_HB.dsn). В виде отдельного файла она не существует. Этот факт мы уже отмечали.

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

Предположим, что объектом назначения является библиотека my_lib.olb. Двойным щелчком на иерархическом блоке вызовем редактор свойств Property Editor и в столбце Implementation Path укажем полный путь к этой библиотеке. Удобнее всего это сделать, щелкнув на кнопке справа от поля для ввода информации (рис. 3), отыскать нужную библиотеку и открыть ее. Если такой библиотеки еще не существует, то придется ввести полный путь с клавиатуры и позднее редактор автоматически создаст ее в указанном месте.

Диалоговая панель редактора свойств иерархического блока mux2_HB

Снова выделим иерархический блок mux2_HB и исполним команду File/Export Selection... Названная команда доступна только в том случае, если активно рабочее окно схемного редактора и выделен экспортируемый блок.

Появится диалоговая панель с тем же названием, в верхнее поле которой надо ввести имя иерархического блока, а в нижнее — полный путь и имя библиотеки, куда он будет экспортирован (рис. 4). Последнюю операцию удобно выполнять с помощью кнопки Browse, расположенной справа от поля Library. В принципе можно указать имя несуществующей библиотеки (как в нашем случае), и тогда она будет создана автоматически. Нажмем на кнопку OK, чтобы поместить блок в указанную библиотеку.

Диалоговая панель для задания параметров экспортируемого иерархического символа

Никакой информации о проделанной операции (удачной или нет) редактор не выдает. Поэтому приходится контролировать результат. Снимем выделение с иерархического блока и исполним команду File/Import Selection... Обратите внимание, команда экспорта сейчас недоступна, потому что не выделен никакой иерархический блок. Появится диалоговая панель Import Selection. Нажмем на кнопку Add Library и добавим в пустой список библиотеку my_lib.olb. В эту библиотеку мы только что экспортировали иерархический блок. Выделив его имя, увидим в правом окне весьма убогое изображение блока без графики (рис. 5). Нажав OK, поместим его рядом с оригиналом.

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

Самое любопытное заключается в том что, открыв библиотеку my_lib.olb, куда был помещен иерархический блок, мы не обнаружим там никаких следов его присутствия, хотя объем библиотечного файла увеличился. Как же удалить блок за ненадобностью, если он не виден? Ответ на этот вопрос мне не известен.

Внутреннее описание иерархического блока (схему замещения), оказывается, можно просто скопировать (или переместить) из текущего проекта в библиотеку. Это легко сделать, используя кнопки Copy и Paste или метод буксировки «Drag-and-drop». На рис. 6 показано, как отбуксировать папку со схемой замещения иерархического блока из текущего проекта test_mux2_HB.opj в библиотеку my_lib.olb.

Копирование папки со схемой замещения иерархического блока в библиотеку методом drag-and-drop

Для этого надо «прижать» копируемую или перемещаемую папку левой кнопкой мыши и, не отпуская ее, переместить (отбуксировать) на строку с названием библиотеки. Во время копирования папки операцию следует выполнять с нажатой клавишей Ctrl, при перемещении — клавишу отпустить.

Процесс иерархического проектирования может развиваться в двух противоположных направлениях: «сверху вниз» (нисходящее проектирование) и «снизу вверх» (восходящее проектирование). САПР OrCAD поддерживает обе стратегии иерархического проектирования.

Вариант, который мы только что рассмотрели, — нисходящее проектирование: сначала появился иерархический блок, а потом его схема замещения. При переходе от блока к схеме замещения использовалась команда Descend Hierarchy (понизить уровень иерархии).

Теперь рассмотрим пример восходящего проектирования. Создадим новый проект test_dmux2_HB.opj и нарисуем схему демультиплексора на два выхода. К внешним выводам схемы подключим иерархические порты. Это можно сделать командой Place/Hierarchical Port... или щелкнув мышкой на иконке, показанной рядом. Входным портам присвоим имена D и A, выходным — Q0 и Q1 (рис. 7).

Схема замещения несуществующего пока иерархического блока dmux2_HB(восходящее проектирование)

Сохраним созданную схему, а затем изменим имя папки, где она находится. По умолчанию папка получила название SCHEMATIC1. Щелкнем на этом имени правой кнопкой и выполним команду Rename. Откроется диалоговая панель Rename Schematic, в единственное окно которой надо ввести новое имя — dmux2_HB.

Теперь откроем новую страницу для иерархического блока (его внешнего описания). Щелкнем правой кнопкой на имени проекта test_dmux2_hb.dsn и выберем команду New Schematic. Редактор снова предложит назвать ее SCHEMATIC1, и мы согласимся. Но вот незадача — она не является корневой! Корневую папку редактор помечает значком «/», и сейчас этот знак стоит на той папке, которая была создана первой, то есть на папке с именем dmux2_HB.

Придется снова вызывать всплывающее меню. Щелкнем правой кнопкой на папке SCHEMATIC1 и исполним команду Make Root. Теперь правильная иерархия восстановлена. Создадим в папке SCHEMATIC1 новую страницу PAGE1 и откроем ее.

Нам осталось нарисовать иерархический блок, для которого уже имеется схема замещения. Не станем описывать процедуру создания такого блока, она уже хорошо известна. Более того, основную работу — ввод контактов — редактор выполнит самостоятельно! Единственное, за чем надо проследить, — чтобы блок получил имя (в окне Implementation Name), совпадающее с названием папки, где хранится его схема замещения, то есть имя dmux2_HB.

Как только вы определите габариты будущего блока, он предстанет перед вами во всем великолепии — законченный блок со всеми иерархическими контактами (рис. 8)! Приятно, что компьютер за вас выполнил работу, которую при нисходящем проектировании приходилось делать вручную.

Автоматическая генерация иерархического блока по его схеме замещения

Нам осталось подвести к иерархическому блоку проводники и протестировать его. Думаю, что с этой работой вы можете справиться самостоятельно. Ну а результат должен быть таким, как показано на рис. 9.

Результаты тестирования иерархической схемы демультиплексора dmux2_HB

Проектирование иерархического блока с VHDL-описанием

Этот тип иерархических блоков имеет в качестве внутреннего описания не схему замещения, а VHDL-код. Конечно, мы можем создать новый проект и проследить всю технологию проектирования таких блоков, начав «с нуля». Но вряд ли в этом есть необходимость. Проще поступить так. Отключить от уже существующего иерархического блока dmux2_HB схему замещения и вместо нее присоединить к блоку VHDL-модель. Ну и само собой, ее еще надо написать.

Чтобы выполнить первую часть работы, дважды щелкнем на иерархическом блоке dmux2_HB и с помощью редактора свойств Property Editor (рис. 10) внесем необходимые изменения. Отыщем свойство Implementation Type (способ реализации) и заменим тип Schematic View (схема замещения) на нужныйнам тип VHDL (описание на языке VHDL).

С помощью редактора свойств отключаем от иерархического блока его схему замещения и присоединяем файл dmux2_HB.vhd с несуществующей пока VHDL-моделью

Кроме того, в столбце Implementation Path укажем имя файла, в котором будет храниться VHDL-модель нашего иерархического блока. Так как мы не указали полный путь (Path) к файлу с VHDL-моделью, то он будет создан в текущей директории проекта. Нажмем кнопку Apply (применить) и закроем панель Property Editor.

Попробуйте теперь понизить уровень иерархии выделенного блока (команда Descend Hierarchy из всплывающего меню или горячая клавиша Shift+D). Откроется окно (рис. 11), в котором редактор OrCADCapture покажет автоматически сгенерированный VHDL-код, созданный по графическому описанию иерархического блока.

Созданный редактором шаблон VHDL-модели иерархического блока

Отдадим ему должное — редактор сделал все, что мог. Он создал шаблон VHDL-модели, включающий описание интерфейса ENTITY и архитектурное тело ARCHITECTURE. Интерфейс содержит полную информацию о входных D, A и выходных Q0, Q1 портах, а вот архитектурное тело пустое: между скобками BEGIN — END нет ни одного оператора. Это и неудивительно, ведь редактор не знает функцию, выполняемую иерархическим блоком. Здесь придется поработать нам самим. Впишем в исполняемый раздел архитектурного тела недостающие строки:


Q0 <= D and (not A) after 10ns;
Q1 <= D and A after 15ns;

и проверим текст на отсутствие синтаксических ошибок. Это можно сделать командой Check Syntax из всплывающего меню или командой Edit/Check VHDL Syntax (Alt+C) из выпадающего меню. Обратите внимание: в окне менеджера проекта появился новый файл: .\dmux2_HB.vhd. Это произошло в тот момент, когда редактор получил команду Descend Hierarchy — понизить уровень иерархии. Значит, VHDL-модель иерархического блока подключена к текущему проекту и у нас нет оснований опасаться, что моделятор ее не найдет.

Выполнив моделирование, мы увидим почти такие же результаты, как и на рис. 9. Небольшое отличие заключается в величинах задержек для выходов Q0 и Q1. В VHDL-модели мы задали их равными 10 и 15 нс, тогда как в схеме замещения они были одинаковыми и равнялись 27 нс (стандартные задержки наэлементе 7408).

При восходящем проектировании ситуация остается прежней. Предположим, что мы сначала вручную создали VHDL-модель демультиплексора и поместили ее в файл dmux2_HB.vhd.

Теперь собираемся нарисовать иерархический блок HB2 в том же самом проекте. Вызвав командой Place/Hierarchical Block... соответствующую диалоговую панель, впишем в ее поля следующую информацию:


Reference: HB2
Implementation Type: VHDL
Implementation Name: dmux2_HB
Path and filename: dmux2_HB.vhd

Нажмем OK и зададим габаритные размеры будущего иерархического блока. Все остальное сделает редактор: по нижней ссылке в последней строке он найдет в проекте нашу VHDL-модель, выяснит по описанию интерфейса ENTITY, какие надо нарисовать порты, и сгенерирует полную графику иерархического блока. В окне редактора свойств Property Editor вы увидите, что редактор присоединил к иерархическому блоку модель демультиплексора (файл dmux2.vhd). Если понизить иерархию блока, то откроется и текст VHDL- модели. Другими словами, все сделано правильно.

Обратите внимание: оба иерархических блока ссылаются на одну и ту же модель демультиплексора, так что изменения, внесенные для одного из них, повлияют и на другой. Такие проекты называются проектами со сложной иерархией.

Скачать статью в формате PDF  Скачать статью Компоненты и технологии PDF

 


Другие статьи по данной теме:

Сообщить об ошибке