132д. DipTrace: схема и плата вместе — иерархия, SPICE, спецификация, 3D
Схема и плата живут в двух программах, и главное, что между ними происходит, — синхронизация: правку схемы надо перенести на плату, а правку на плате — обратно. Этот раздел о связке «схема — плата» в DipTrace: обновление платы и обратная аннотация, иерархическая схема и копирование разводки между одинаковыми блоками, проверка электрических правил, встроенный SPICE-симулятор, правила в отдельном файле, обмен списками соединений, спецификация и 3D-модель платы.
Встроенный симулятор проверен по-настоящему: библиотеку ngspice из
комплекта DipTrace запустили из Python без самой DipTrace и прогнали
RC-цепь. Меню сверены с руководством к DipTrace 5.3 и строками интерфейса
Schematic.exe и Pcb.exe. Сверяет _verify/dip132e_check.py.
Как это называется в документации
Оригинал Перевод renew design from schematic обновить плату по схеме hierarchy block, hierarchy connector иерархический блок и его вывод global net глобальная цепь: общая для всех уровней иерархии electrical rule check (ERC) проверка электрических правил схемы SPICE model SPICE-модель: описание детали для симулятора assembly variant вариант сборки interactive BOM интерактивная спецификация: таблица, связанная с платой
132д.1 Схема → плата и обратно
Обновить плату по схеме — File / Renew Design from Schematic в PCB Layout. Три режима:
| Режим | Как находит пары «деталь схемы — корпус на плате» | Условие |
|---|---|---|
| By Components | по скрытым идентификаторам | схема нарисована в DipTrace; обозначения могут различаться |
| By RefDes | по позиционным обозначениям | обозначения на плате и в схеме совпадают |
| Related Schematic | как By Components, но из связанного файла схемы | какой файл связан — видно в File / Layout Information |
Расстановка и разводка сохраняются, новые детали появляются у края платы. Руководство советует любые изменения — новую цепь, новую деталь — начинать со схемы.
Обратная аннотация — File / Back Annotate в схеме: выбрать файл платы,
и в схему перейдут переименования деталей, имена и классы цепей. Пример
руководства: на плате PCB_2.dip конденсаторы C8 и C10 переименовали в C28
и C30 — после обратной аннотации так же они называются и в Schematic_2.dch.
Но новые цепи и детали обратная аннотация не добавит — поэтому она для
мелких правок, а не для работы «от платы».
132д.2 Иерархическая схема
Иерархия — способ нарисовать повторяющийся узел один раз и вставить его в схему несколько раз: канал усилителя, ячейку памяти, силовой ключ.
- Edit / Add Sheet — новый лист; Edit / Sheet Type / Hierarchy Block — сделать его блоком.
- На листе блока — Objects / Hierarchy / Place Connector: выводы блока. Их расположение и поворот — это расположение выводов блока на главном листе. На обычный лист такие выводы не ставятся.
- Objects / Hierarchy / Place Block — вставить блок; блоки вставляются и друг в друга, уровней сколько угодно.
Петли запрещены. Вставить блок в самого себя или замкнуть цепочку блоков DipTrace позволит, но это ошибка: её находит Verification / Check Hierarchy, а плата предупреждает при открытии такой схемы.
Глобальные цепи. Выводы на разных уровнях одной цепью не соединить — только глобальной цепью, которая существует на всех уровнях сразу. Одинаковые порты цепи (например, GND) где угодно в схеме автоматически сливаются в одну цепь, в иерархии — глобальную. Для обычной цепи — свойства → Global Net for Hierarchy и Connect Nets by Name.
На плате. Детали блока получают обозначение из схемы плюс номер блока, а в свойствах — путь по иерархии. Route / Hierarchy показывает все вставленные экземпляры блоков. В примере руководства лист 3 вставлен дважды в каждый из двух блоков листа 2 и ещё раз прямо в главную схему: 2 × 2 + 1 = 5 экземпляров. Дальше:
- Select Block — собрать детали экземпляра вместе;
- развести один экземпляр (глобальные цепи — Auto-route Mode: Don't Route, их разводят в последнюю очередь);
- Copy Placement and Routing — повторить расстановку и разводку на других экземплярах. Трассы, уходящие за пределы блока, не копируются.
132д.3 Проверка электрических правил
Verification / Electrical Rule Setup — таблица «тип вывода × тип вывода»: щелчком в клетке выбирают, что такое соединение — норма, предупреждение или ошибка. Что проверять:
| Галочка | Что ищет |
|---|---|
| Pin Type | запрещённые сочетания типов выводов из таблицы |
| Not Connected Pins | неподключённые выводы |
| Pin Superimposing | выводы, лежащие друг на друге |
| Only One Pin in Net, Nets With Single Pin | цепи из одного вывода — бессмысленные |
| Short Circuit | соединение цепей питания и земли (их указывают ниже) |
Запуск — Verification / Electrical Rule Check (ERC). На Schematic_2.dch из
примеров руководство получает одно предупреждение о соединении
двунаправленного вывода с выходом и много неподключённых выводов.
Вывод, который нарочно оставлен свободным, помечают: правый щелчок → Not Connected. Снимать галочку Not Connected Pins целиком хуже — тогда программа перестанет замечать и забытые выводы.
132д.4 SPICE: встроенный ngspice
В схеме — Tools / SPICE Simulator. У каждой детали должна быть SPICE-модель: правый щелчок → SPICE Model. У конденсатора достаточно типа Capacitor и ёмкости; у транзистора есть вкладка Model — текст модели или файл от производителя (Load). Get Spice Model from Library берёт настройки из другой библиотеки, Apply to Other Parts раздаёт их одинаковым деталям.
Пример руководства — мультивибратор Astable_Flip_Flop_Spice.dch: у батареи
нет модели, ей задают источник PULSE() с V2 = 5 В, PW = 20 с, PER = 30 с —
20 секунд напряжение есть, 10 секунд нет. Моделирование — вкладка Transient,
результат — токи через два светодиода, которые загораются по очереди.
Для цифровых схем есть вкладка Digital (пример RS-trigger.dch на моделях
Digital:Nand), шины можно показывать шестнадцатеричным числом.
Список соединений для внешнего симулятора — File / Export / Spice Netlist
с командой вроде .TRAN 0s 30s 0.1s.
Что внутри. В папке DipTrace лежит ngspice64/ngspice-41_64.dll — обычная
разделяемая библиотека ngspice 41 со стандартным программным интерфейсом.
Её можно вызвать и без DipTrace (_verify/dip132e/dtspice.py):
os.environ["SPICE_SCRIPTS"] = os.path.dirname(DLL)
ng = C.CDLL(DLL)
ng.ngGet_Vec_Info.restype = C.POINTER(VecInfo)
ng.ngSpice_Init(PRINT, STAT, EXIT, None, None, None, None)
def run(lines):
arr = (C.c_char_p * (len(lines) + 1))(*[l.encode() for l in lines], None)
ng.ngSpice_Circ(arr)
ng.ngSpice_Command(b"run")
RC-цепь 10 кОм · 100 нФ, τ = 1 мс:
| Замер | Симулятор DipTrace | Теория |
|---|---|---|
| напряжение через τ после ступеньки 5 В | 3,1607 В | 5 · (1 − 1/e) = 3,1606 В |
| частота среза −3 дБ | 159,2 Гц | 1 / (2π · 1 мс) = 159,2 Гц |
Библиотека отвечает строкой «ngspice-41 shared library». То есть SPICE внутри DipTrace — тот же ngspice, что и в разделах о моделировании аналоговых схем (там — версия 39 в контейнере); модели и приёмы оттуда работают и здесь.
132д.5 Правила в файле и обмен списками соединений
Правила платы — слои, классы цепей, стили переходов, правила проверки — не обязательно настраивать заново:
- новый проект: File / New → Use Rules and Settings from Previous Layout — взять всё из готовой платы;
- Route / Save Rules — сохранить правила в отдельный файл
.rul, Route / Load Rules — загрузить из.rul,.dipили.dipxml.
Удобно держать .rul под каждый завод: его минимальные зазоры, стили переходов
и стек слоёв.
Список соединений (netlist). Экспорт из схемы — File / Export / Netlist,
импорт в плату — File / Import / Netlist; форматы Accel, Allegro, Mentor,
OrCAD, PADS, P-CAD, Protel и Tango. При импорте у каждой детали должен найтись
корпус: Assign All Patterns by Names подбирает по имени, остальные — вручную
(Attach to Component); звёздочка у имени корпуса — «назначено вручную».
Стандартные библиотеки лежат в Program Files\DipTrace\Lib, свои — в
Документы/DipTrace/My Libraries.
132д.6 Спецификация
File / Export / Bill of Materials — в схеме и на плате; на плате возможностей больше.
- Варианты сборки: несколько наборов «какие детали ставим» для одной платы; вариант Default — сама плата, его не изменить.
- Поставщики и цены — у каждой детали; спецификацию можно собрать по поставщику или по деталям без поставщика.
- Группировка строк (например, по компонентам) и столбцы — имя, обозначение, номинал, количество и прочее, в нужном порядке.
Четыре способа выдать результат:
| Способ | Что получится |
|---|---|
| Place Table | таблица на плате (слой Top Assembly), обновляется сама при правке платы |
| интерактивная спецификация | окно-таблица: выбранная строка подсвечивает детали на плате |
| Export to File | CSV или .bom с выбором разделителя и кавычек |
| Export HTML | страница для браузера: спецификация рядом с платой, отметки «установлено» |
В HTML-странице кнопки меняют группировку (по имени; имени и номиналу; имени и корпусу; всем трём), показывают верх, низ или обе стороны платы.
132д.7 3D-модель платы
Кнопка 3D в PCB Layout — окно Attached 3D Models: DipTrace проверяет, у всех
ли деталей есть модели, и пытается подобрать недостающие. Детали без модели
в 3D видны только как посадочные места. Стандартные 3D-библиотеки
в установку не входят — их скачивают отдельно; по умолчанию они лежат
в папке models3d внутри DipTrace.
Выгрузка — Export STEP или Export VRML (VRML 2.0). Для механического САПР руководство рекомендует STEP одним телом (Solid body). Отверстия в модели сильно замедляют выгрузку. Общие настройки маски для 3D-вида задаются в окне выгрузки Gerber.
Подбор моделей — Tools / 3D Preview / Patterns and Models Search: строгость сопоставления и папки поиска. А лучший момент подключить модель — когда делается корпус (раздел 132а).
132д.8 Грабли
Плату поправили, схему — нет, а потом обновили плату по схеме. Правка пропала. Любые изменения — сначала в схеме; на плате — только то, что перенесёт обратная аннотация (переименования, имена и классы цепей).
Обратная аннотация «не перенесла» новую деталь. Не умеет: новые цепи и детали только из схемы.
Обновление By RefDes перепутало детали. Обозначения в схеме и на плате разошлись. Для схем, нарисованных в DipTrace, — режим By Components.
Блок вставлен сам в себя. DipTrace это позволяет, но это ошибка — Verification / Check Hierarchy.
GND на разных листах — разные цепи. Соединяют порты цепи или глобальная цепь; провод «через уровень» не протянуть.
Скопированная разводка блока без внешних трасс. Так и задумано: трассы за пределы блока не копируются.
ERC засыпал «неподключёнными выводами». Нарочно свободные выводы пометить Not Connected, а не выключать проверку.
Симуляция не запускается. У какой-то детали нет SPICE-модели — как у батареи в примере руководства.
3D-вид пустой. Не установлены библиотеки 3D-моделей — их скачивают отдельно.
132д.9 Итоги
- Изменения — в схеме, затем Renew Design from Schematic; обратная аннотация — только для переименований.
- Иерархия: лист → Hierarchy Block, выводы — Place Connector, вставка — Place Block; на плате Copy Placement and Routing размножает разводку блока.
- ERC ловит конфликты типов выводов, одиночные цепи и замыкания питания на землю; свободные нарочно выводы — Not Connected.
- SPICE внутри DipTrace — ngspice 41; его библиотека даёт на RC-цепи 3,1607 В при τ и 159,2 Гц на −3 дБ — как теория.
- Правила — в
.rul, списки соединений — в восьми форматах, спецификация — в таблицу на плате, CSV или HTML, плата — в STEP одним телом.
Полные исходники
dtspice.py — прогон RC-цепи через ngspice, встроенный в DipTrace.
# -*- coding: utf-8 -*-
"""Прогон схемы через ngspice, встроенный в DipTrace (ngspice64/ngspice-41_64.dll), без DipTrace.
python dtspice.py
RC-цепь 10 кОм · 100 нФ: переходный процесс от ступеньки 5 В и частотная характеристика."""
import ctypes as C
import math
import os
DLL = r"C:\Program Files\DipTrace\ngspice64\ngspice-41_64.dll"
class VecInfo(C.Structure):
_fields_ = [("name", C.c_char_p), ("type", C.c_int), ("flags", C.c_short),
("real", C.POINTER(C.c_double)), ("comp", C.c_void_p), ("length", C.c_int)]
OUT = []
PRINT = C.CFUNCTYPE(C.c_int, C.c_char_p, C.c_int, C.c_void_p)(lambda s, i, u: OUT.append(s.decode(errors="replace")) or 0)
STAT = C.CFUNCTYPE(C.c_int, C.c_char_p, C.c_int, C.c_void_p)(lambda s, i, u: 0)
EXIT = C.CFUNCTYPE(C.c_int, C.c_int, C.c_bool, C.c_bool, C.c_int, C.c_void_p)(lambda *a: 0)
os.environ["SPICE_SCRIPTS"] = os.path.dirname(DLL)
ng = C.CDLL(DLL)
ng.ngGet_Vec_Info.restype = C.POINTER(VecInfo)
ng.ngSpice_Init(PRINT, STAT, EXIT, None, None, None, None)
def run(lines):
arr = (C.c_char_p * (len(lines) + 1))(*[l.encode() for l in lines], None)
ng.ngSpice_Circ(arr)
ng.ngSpice_Command(b"run")
def vec(name):
v = ng.ngGet_Vec_Info(name.encode()).contents
if v.real:
return [v.real[i] for i in range(v.length)]
z = C.cast(v.comp, C.POINTER(C.c_double)) # комплексный вектор: пары (Re, Im)
return [complex(z[2 * i], z[2 * i + 1]) for i in range(v.length)]
R, Cf = 10e3, 100e-9
TAU = R * Cf # 1 мс
run(["* rc step", "V1 in 0 PULSE(0 5 0 1n 1n 1 2)", "R1 in out 10k", "C1 out 0 100n",
".tran 1u 5m", ".end"])
t, v = vec("time"), vec("out")
at = lambda T: min(range(len(t)), key=lambda i: abs(t[i] - T))
v_tau = v[at(TAU)]
run(["* rc ac", "V1 in 0 AC 1", "R1 in out 10k", "C1 out 0 100n", ".ac dec 200 10 100k", ".end"])
f = [x.real for x in vec("frequency")]
mag = [abs(x) for x in vec("out")]
k = next(i for i in range(len(mag)) if mag[i] < 1 / math.sqrt(2)) # первая точка ниже −3 дБ
u = (mag[k - 1] - 1 / math.sqrt(2)) / (mag[k - 1] - mag[k]) # между k−1 и k — по логарифму частоты
f3 = math.exp(math.log(f[k - 1]) + u * (math.log(f[k]) - math.log(f[k - 1])))
ver = next((l for l in OUT if "ngspice-" in l.lower()), "")
print("версия:", ver.strip())
print("tau = %.3f мс; v(tau) = %.4f В (теория %.4f)" % (TAU * 1e3, v_tau, 5 * (1 - math.exp(-1))))
print("f_-3dB = %.1f Гц (теория %.1f)" % (f3, 1 / (2 * math.pi * TAU)))
# журналы для рисунка 132д.4 — только если задана папка DT_OUT
out_dir = os.environ.get("DT_OUT")
if out_dir:
with open(os.path.join(out_dir, "rc_tran.csv"), "w", encoding="utf-8", newline="\n") as fo:
for i in range(0, len(t), max(1, len(t) // 250)):
fo.write("%.6e,%.5f\n" % (t[i], v[i]))
with open(os.path.join(out_dir, "rc_ac.csv"), "w", encoding="utf-8", newline="\n") as fo:
for i in range(0, len(f), 4):
fo.write("%.4e,%.4f\n" % (f[i], 20 * math.log10(mag[i])))
Дальше: раздел 133 «Altium Designer» — проект, правила и выпуск файлов.