Продолжение. Начало в № 3 '2009
изучаем Active-HDL 7.1.
Урок 8. Проектирование схем: выполнение соединений
Александр ШАлАгинов
Размещенные на чертеже схемы графические объекты должны быть электрически соединены с помощью проводников или шин. обычно понятие «проводник» ассоциируется с навесным монтажом, с физическим проводом, соединяющим две точки схемы. однако в Active-HDL 7.1 для этого используется другое слово — ветвь (branch).
На схеме ветвь изображается некоторым числом прямых линий (сегментов), связанных в цепочку (рис. 1б). В простейшем случае ветвь — отрезок прямой линии, сегмент (рис. 1а).
Часто один источник управляет несколькими приемниками, и для графического представления такой ситуации используется понятие «проводник» (wire) — несколько соединенных в узлах (junction) ветвей (рис. 1в). В простейшем случае проводник может представлять собой одну ветвь и даже один сегмент.
Таким образом, проводники на схеме графически отображают реальные (физические) соединения в аппаратуре. Но оказывается, компьютерные модели позволяют сделать нечто большее — кроме физического, реализовать понятие логического соединения.
Чтобы не рисовать длинных проводников, можно допустить, что даже графически не связанные проводники будут иметь логическое соединение, если у них одинаковые имена (рис. 1г). Это так называемые соединения по имени (connected by name). Такие проводники объединяются под общим понятием «цепь» (net).
На языке VHDL цепь ассоциируется с сигналом, который распространяется по этой цепи, а его имя совпадает с именем цепи.
Если у вас остались сомнения относительно всего сказанного выше, то проведите простой эксперимент. Выделите на рис. 1 какой-нибудь сегмент и выполните одну за другой команды контекстного меню Select Branch, Select Wire и Select Net. Повторите эти действия для проводника и цепи. И все станет на свои места. Кстати, это весьма полезные команды в практической работе с редактором схем.
В принципе, освоив урок 1, мы уже умеем выполнять соединения на схеме. Но скорее это результат развитой интуиции, а не приобретенных знаний. Пришла пора уделить данному вопросу большее внимание.
Вспомним приемы, с помощью которых можно перевести схемный редактор в режим рисования проводников:
• нажать горячую клавишу W (от слова wire — «проводник»);
• выполнить команду Wire из меню Diagram;
• щелкнуть JIKM по иконке Ш на инструментальной панели Diagram Items — VHDL;
• вызвать ПКМ контекстное меню и выбрать в нем команду Wire.
О переходе в данный режим редактор сообщает сменой формы указателя мыши ЕЗ. Но в отдельных случаях редактор сам «догадается», что вы собираетесь рисовать проводник, и автоматически переключится в нуж-
И
0
сегмент (segment)
ветвь (branch)
узел (junction)
У цепь (net)
проводник (wire)
(электрическое соединение)
и
_ У логическое соединение (соединение по имени)
Рис. 1. Возможные варианты выполнения соединений на схеме
ный режим. Подведите указатель мыши к выводу символа или клеммы, к контуру иерархического блока или графического процесса, и указатель мыши, сменив свою форму GD, подскажет вам, что он собирается рисовать проводник. Единственное условие: на схеме не должно быть выделенных объектов.
Способы рисования проводников
Проводники в пакете Active-HDL 7.1 создаются двумя способами. Первый способ считается классическим, так как реализован во многих современных САПР. Он носит название «метод последовательных точек».
Суть метода в том, что вы щелкаете ЛКМ в точках, где начинается проводник, где он меняет свое направление и где заканчивается. В процессе рисования создается временная (temporary) трасса, и у вас есть возможность, двигаясь в обратном направлении по уже проложенному пути, удалять только что созданные сегменты.
В принципе вы можете начинать и заканчивать проводник на пустом месте схемы, но тогда он будет «висеть в воздухе», а для его завершения потребуется двойной щелчок мышью.
Второй метод можно назвать методом «прижатой кнопки»: в процессе рисования проводника левая кнопка мыши остается все время в нажатом состоянии.
Вы прижимаете ЛКМ в точке, где хотите начать проводник и, не отпуская ее, ведете указатель мыши в точку назначения. При смене направления, в месте, где надо сделать угол (излом), следует нажать клавишу Space (пробел). Закончив создание проводника, просто отпустите кнопку мыши.
У второго метода есть одна интересная особенность: он поддерживает режим автотрассировки Autorouting (включен по умолчанию). В этом режиме вам достаточно указать только начало и конец проводника, а его маршрут будет проложен автоматически и так, чтобы
Рис. 2. Пример использования глобального соединителя (пунктиром показаны «невидимые» на схеме цепи CLR и ^
избежать пересечения трассы с компонентами схемы.
Автотрассировка выполняется не очень хорошо и может показаться навязчивой услугой. Поэтому вполне возможно, что вам захочется отказаться от нее. Тогда активизируйте команду Preference из меню Tools, выберите категорию Block Diagram Editor и в разделе Autorouting сбросьте флажок Enabled.
В частных случаях удается выполнить соединения, не переходя в соответствующий режим. Например, если подвести один символ к другому так, чтобы их выводы вошли в соприкосновение, то между ними возникнет соединение. Отведите один из символов, и вы обнаружите, что между ними образовался проводник. Это правило работает и для других объектов схемы: клемм, символов питания и «земли», иерархических блоков и графических процессов.
Если требуется подвести к символу много коротких проводников одинаковой длины, то совсем необязательно рисовать их вручную. Достаточно выполнить для него команду Add Stubs («Добавить отводы») из контекстного меню. Правда, для встроенных символов эта команда почему-то недоступна.
В пакете Active-HDL 7.1 есть еще один графический объект, который объявляет невидимый, а значит, и не рисуемый на схеме проводник. Это так называемый глобальный соединитель (Global Wire). Его пиктограмма СЗ находится на инструментальной панели Diagram Items — VHDL.
Глобальный соединитель, как и цепь, выполняет соединения по имени. Но, в отличие от цепи, он соединяет не только проводники, названные одним именем, но и несвязанные (свободные) контакты символов, имеющие такое же имя, как и имя глобального соединителя.
Более того, если на схеме есть клемма, названная именем глобального соединителя, то она тоже окажется соединенной по имени. Практический пример использования глобального соединителя показан на рис. 2.
Глобальный соединитель C назван тем же именем, что и входная клемма C. Значит, они соединены по имени. Но такое же имя имеет контакт C у трех триггеров FDC. Эти входы не подключены к каким-либо другим цепям,
следовательно, они тоже неявно соединены с цепью C.
Другой соединитель CLR объединяет все входы сброса триггеров в «0». Но входная клемма R (от Reset) имеет другое имя, поэтому к ней пришлось дорисовать сегмент CLR, чтобы присоединить ее к цепи сброса по имени.
Назначение проводникам имен
Нужно сказать, что при вводе цепей схемный редактор незаметно для пользователя именует их по некоторому шаблону. Первая введенная цепь получает имя NET3, вторая — NET7, третья — NET11 и т. д. Эти имена называются системными, и на экране они не видны.
Система автоматически назначает каждому проводнику уникальное имя, чтобы не возникали нежелательные соединения по имени. Для пользователя они не несут практически никакой информации. Можно сказать, что речь идет о фоновом режиме простановки имен. А если быть точным, то сама система считает такие проводники неименованными.
Однако у пользователя есть возможность любому проводнику задать любое имя, лишь бы оно не противоречило синтаксису используемого языка описания аппаратуры: ведь имя проводника превратится потом в имя сигнала при конвертации схемы в HDL-описание.
Чтобы задать имя, достаточно проименовать хотя бы один сегмент проводника. Чтобы удалить имя, надо удалить все прикрепленные к проводнику метки. И тогда проводник снова получит системное, правда, уже другое имя.
«Проименовать» проводник можно несколькими способами. Основным считается режим Attach Text (прикрепить текст). Он устанавливается одноименной командой из ме-
ню Diagram, щелчком на пиктограмме 0 или нажатием горячей клавиши N.
В данном режиме курсор мыши меняет свою форму |Щ и вам остается только указать, к какому объекту схемы требуется присоединить текст. Заметим, что, кроме проводников, текст можно добавить к символам, клеммам, иерархическим блокам, символам питания и «земли», то есть речь идет о достаточно мощном и универсальном инструменте работы с текстовыми элементами.
При выборе любого из перечисленных выше объектов форма курсора упрощается: с его изображения исчезает запрещающий знак с перечеркнутой окружностью Е2. Значит, можно продолжать операцию.
Щелкнем ЛКМ на сегменте проводника, которому собираемся задать имя. Появится всплывающее окно, с перечнем всех доступных для данного объекта текстовых полей (рис. 3а).
При выборе другого объекта схемы, например, символа, список текстовых полей будет иным (рис. 3б).
Остается выбрать желаемый текстовый элемент, в нашем случае это имя проводника Name, и нажать клавишу Enter. Рядом с выделенным сегментом появится системное имя, например NET3. Но вы можете тут же заменить его своим.
Более простым и быстрым представляется второй способ. Вызовите для проводника диалоговую панель Wire Properties (двойным щелчком мыши или через контекстное меню) и в окне Segment напечатайте желаемое имя.
В принципе есть возможность редактировать текстовый элемент прямо на схеме, не открывая никаких диалоговых панелей или окон. Щелкните два раза на метке с именем проводника и, убедившись, что появился мигающий курсор в виде вертикальной черточки, внесите желаемые исправления.
Для опытных пользователей есть еще один вариант. Но здесь все наоборот: сначала задается имя, а потом рисуется (или указывается) проводник, которому оно предназначено.
Чтобы выполнить первую часть операции, следует активизировать режим User-defined Net Name (рис. 4), установить флажок Create New Net with User-defined Name и в окно Wire ввести желаемое имя, например RESET.
Если теперь вы нарисуете новый проводник или цепь, то они сразу получат заказанное имя. Более того, внизу диалоговой панели можно установить флажок Increment Wire Names by..., и тогда введенное имя будет ин-
и
Рис. 3. Списки текстовых элементов, которые можно прикрепить: а) к проводнику; б) к символу
дексироваться с желаемым шагом, например RESET0, RESET1 и т. д. Заметим, что этот режим весьма удобен при рисовании отводов от шин, о чем будет сказано далее.
Чтобы вернуться в прежний режим, достаточно сбросить флажок Create New Net with User-defined Name или нажать на кнопку Use Global Settings.
Рис. 5. Диалоговая панель глобальных настроек по умолчанию
Рис. 4. Диалоговая панель для задания пользовательских имен проводникам и шинам
Кнопка Use Global Settings восстанавливает глобальные настройки по умолчанию. Они определены на диалоговой панели Preferences (рис. 5) схемного редактора Block Diagram Editor (подкатегория Default Names).
Как видно, для проводника имя по умолчанию начинается со слова NET, а для шины — со слова BUS. За ними при автоматической генерации имени следует числовой индекс, например NET3, NET7, NET11 или BUS3(7:0), BUS7(7:0), BUS11(7:0). Об этом стандартном механизме формирования имен мы уже упоминали ранее.
Конечно, пользователь может изменить данные установки, например, сократить имя цепи до одной буквы — N1, N7, N11, но следует помнить, что они будут иметь силу не только для текущего, но и для всех новых проектов. Недаром же их называют глобальными.
Впрочем, есть альтернатива — работать не с глобальными системными именами, а с локальными пользовательскими именами. Их тоже можно определить и использовать по умолчанию. Однако действие таких имен будет распространяться только на текущий активный проект.
Нарисуем безымянный проводник, дважды щелкнем по нему ЛКМ и на диалоговой панели Wire Properties в поле Segment введем желаемое имя, например shift. Понятно, что это пользовательское имя, и мы собираемся сделать его именем, устанавливаемым по умолчанию. Для этого достаточно нажать на кнопку I"*...I справа от только что вве-
денного имени. Все!
А теперь откройте диалоговую панель User-defined Net Name, установите флажок Create New Net with User-defined Name и вы обнаружите, что в окне Wire появилось ранее введенное имя shift. Теперь редактор по умолчанию
будет предлагать называть новые проводники на схеме этим именем.
Если режим User-defined Net Name активен, то существует еще один способ сменить имя по умолчанию на любое другое, которое уже есть на схеме. Щелкните по проводнику с нужным именем ПКМ и в контекстном меню выполните команду User Net Name as Default.
Заметим, что второй способ более универсален, так как он распространяется и на глобальные соединители Global Wire □.
Проектирование шин
Шины размещаются на схеме по тем же правилам, что и проводники. Правда, им требуется задавать кроме имени еще и ширину шины. Например, по умолчанию шины именуются как BUS3(7:0), BUS7(7:0), BUS11(7:0) (рис. 6). В круглых скобках указывается, что шина содержит восемь проводников, членов шины. Они имеют имена BUS3(7). BUS3(0). Не забывайте, что левая граница диапазона индексов, задающих ширину шины, всегда соответствует наиболее значащему разряду. В нашем примере старшим разрядом шины будет BUS3(7).
К шине нельзя подключать «чужие» проводники, не являющиеся членами шины (например, сегмент с именем Y1 на рис. 6а). Программа проверки схемы DRC (Design Rule Check) зарегистрирует в этом случае закороченные цепи Shorted nets BUS3(7:0) и Y1.
Для назначения имен шинам используются те же самые инструменты, что и для про-
водников. Поэтому мы и здесь обойдемся без особых комментариев.
Когда вы подключаете шину к многоразрядному контакту (будь то символ, клемма или иерархический блок), то возникает законный вопрос, надо ли соблюдать правило «одинакового сечения». Например, можно ли 8-разрядную шину соединить с 4-разрядной клеммой? Ведь для некоторых проводников, входящих в шину (как в нашем случае), или контактов клеммы не найдется пары, и они останутся неподсоединенными.
И, тем не менее, пакет Active-HDL 7.1 разрешает такие действия. Надо лишь помнить, что все соединения выполняются, начиная с левого (старшего) бита (рис. 6б). Другими словами, старший разряд выходного сигнала 0(7) соединяется со старшим разрядом шины DATA(15) и старшим разрядом клеммы Y(0). Далее соединения выполняются так, как показано на рис. 6б. Неиспользованные проводники шины DATA(7).. .DATA(0) останутся неком-мутированными (будут «висеть в воздухе»).
Шину можно разделять на более мелкие части. Эта операция называется расслоением шины. На рис. 6в показано, как 16-разрядная шина A(15:0) разделена на две — A(15:8) и A(7:0).
Возможна и противоположная операция, когда несколько простых шин объединяются в одну составную шину (compound bus). Более того, в нее можно «заплести» даже отдельные проводники.
Составная шина не имеет собственного имени, ее имя представляет собой список
BUS3{7:0)
BUS3(0)
U1
BUS3(1)
BUS3(2)
BUS3(3)
1(7:0) 0(7:0)
DATA(15:0)
ОВД
BUS3(4)
buf8_my
BUS3(5)
BUS3(6)
BUS3(7)
Y1
Список соединений
0(7) <-> DATA(15) <-> Y(0)
0(6) <-> DATA(14) <-> Y(1)
0(0) <-> DATA(8) <-> Y(7)
A (15:0)
A(15:8)-------QQ (15:8)
A (7:0)
■OF (7:0)
И
и
Рис. 6. Возможные варианты рисования шин
Е.С.В.А
U1
G(3:0)
gener_4
И
Рис. 7. Составные шины
из входящих в нее простых шин и проводников, разделенных запятой. На рис. 7а показана составная шина, включающая 8-разрядную шину адреса ADR(7:0), 4-разрядную шину данных D(3:0) и проводник CS, уровень сигнала на котором выбирает кристалл памяти.
Составная шина повышает наглядность схем, так как уменьшает число отдельных проводников и шин. Этот прием часто используют в профессиональных схемах.
Но у составной шины есть еще одна функция: она создает соединения между многоразрядным контактом и входящими в такую шину цепями (рис. 7б).
Посмотрите на фрагмент VHDL-кода (рис. 8), полученный из схемы, изображенной на рис. 7б. Карта порта для экземпляра компонента GENER_4 показывает, что его выходы G(3)...G(0) соединены с проводниками E, C, B, A составной шины.
На языке VHDL шина представляется одномерным массивом. Например, шина ADR(7:0), изображенная на рис. 7а, будет объявлена строкой:
signal ADR: STD_LOGIC_VECTOR (7 down to 0);
Видно, что сигнал ADR — это одномерный массив, содержащий 8 элементов.
Однако в примере, показанном на рис. 7б, вы не увидите никакого массива. Четыре проводника Е, С, В, А только графически (то есть визуально) объединены в шину. В действительности никакой шины нет, а есть четыре одиночных проводника. Последнее означает, что составная шина — это в некотором смысле иллюзия (бутафория), а попросту говоря — «обман зрения». Но она, вне всякого сомнения, является полезным инструментом.
Редактирование схем
Как правило, создаваемую схему приходится редактировать: перемещать графичес-
кие объекты (символы, клеммы, иерархические блоки и т. д.), изменять трассы ранее проложенных проводников и шин.
Для перемещения объектов схемы существуют два способа — DRAG и MOVE. Оба используют принцип drag-and-drop, но в первом случае перемещение выполняется без разрыва связей, а во втором случае передвигаемые объекты отрываются от проводников.
Режим DRAG установлен по умолчанию, а чтобы перейти в режим MOVE, надо выполнять операцию перемещения при нажатой клавише Shift. Причем сначала надо выделить перемещаемую подсхему, затем нажать Shift и только тогда начинать операцию.
На рис. 9 показаны различия между режимами DRAG и MOVE, связанные с перемещением одного выделенного объекта — символа and2_my.
Режим редактирования проводников и шин включается автоматически, как только вы наведете курсор мыши на конец любого сегмента (независимо от того, висит он в воздухе или связан с другими объектами). О том, что редактор перешел в данный режим, он сообщает изменением формы курсора мыши Ы.
Какие операции допустимы в этом режиме? Пожалуй, самая важная из них заключается в возможности разорвать соединение проводника или шины с иерархическим блоком, символом или клеммой. Можно также отсоединить отвод от шины (рис. 10а).
Операция очень простая, надо лишь «прижать» конец сегмента ЛКМ и передвинуть его
U1
Fub3
!>С
из
Fub2
-OY
И
ги
было
и
-11>° -TL было
,ги
—DY
1
стало ■------■
с нажатой клавишей Shift
0
Рис. 10. Возможные варианты редактирования проводников и шин
U1
АО-
во
11 о
12
АО-
114
—L О0
U2
11 О
12
U5
Г1 ¡>°-
U6
і
¡>°
and2_my Исходная схема
and2_my
DRAG по умолчанию
and2_my
MOVE
с нажатой клавишей Shift
Рис. 9. BDE-редактор поддерживает два метода перемещения объектов схемы: DRAG — с сохранением связей и MOVE — с разрывом связей
на свободное место. Понятно, что таким приемом можно не только отсоединять сегменты проводников от объектов схемы, но и изменять их размеры (удлинять или укорачивать), подключать к другим контактам схемы или другим сегментам.
С тем же успехом можно редактировать трассы ранее проложенных проводников или шин, изменяя их конфигурацию. Не возникает никаких проблем и при перемещении узлов, в которых соединяется несколько ветвей (рис. 10б). Если появляется необходимость разорвать проводник, то надо вспомнить про режим MOVE и выполнить операцию при нажатой клавише Shift (рис. 10в).
За редким исключением на схеме всегда есть входные и выходные клеммы, обеспечивающие интерфейс с внешним окружением. Если вы пользуетесь услугами «мастера» по созданию нового исходного файла New Source File Wizard, то клеммы появляются на схеме автоматически. Но нередко приходится выполнять такую работу вручную.
Подходящую команду можно обнаружить в меню Diagram (в разделе Terminal), а также инициировать ее щелчком по пиктограмме ЁВ. Предварительно можно открыть выпадающий список и выбрать желаемый тип клеммы.
В принципе есть и другая возможность: вызвать на схему любой тип клеммы (который изображен на иконке) и, нажимая на клавишу Tab, пролистать список клемм, пока не найдете нужную. Если возникает необходимость зеркально отобразить клемму, то нажмите клавишу Space (пробел).
AD ■
И і 0 A 1
InputOD ■ InputID <
0
lnput2C>
ln1D ■ 0
0
Рис. 11. Правила назначения имен проводникам и клеммам
Возможно, вы уже обнаружили, что для быстрой вставки клеммы имеются «горячие клавиши», например, нажатие на клавишу I вызывает входную клемму, а клавиша O инициирует вставку выходной клеммы. Те же «горячие клавиши» работают и для шинных клемм, но предварительно нужно нажать и удерживать клавишу Shift.
При конвертации схемы в VHDL-код клемма преобразуется в порт с тем же именем. Если клемма размещается на свободном месте схемы, то она получает имя по умолчанию, например InputO. Мы уже знаем, что имена по умолчанию устанавливаются на диалоговой панели Preferences для категории Default Names (рис. 5).
Но если при вставке клеммы вы подводите ее к поименованному проводнику или шине, то она автоматически получает соответствующее имя (рис. 11а).
И наоборот, если проводник не имеет имени, то он автоматически получит имя присо-
единяемой к нему клеммы (рис. 11б). Правда, оно останется невидимым.
В обоих случаях проводник и клемма будут членами одной цепи. Высполните команду Select Net, и вы убедитесь в сказанном (под выделение попадут и сегмент, и клемма).
В принципе проводник и клемма могут иметь разные имена (рис. 11в), и тогда они образуют две разные цепи. Однако цепи эти соединены, и в сгенерированном VHDL-коде такое соединение будет реализовано оператором назначения сигнала: D <= In1;, то есть данные с входного порта In1 будут передаваться сигналу D.
Любопытно, но схемный редактор позволяет к одному проводнику подключить несколько клемм одного типа (рис. 11г) . Такая ситуация вполне реальна, например, несколько источников работают на общую шину или проводник (монтажное И). ■
Продолжение следует