17장. 워크플로
왼쪽 절반에만 찍고 오른쪽은 백지로 비웁니다 — 읽으면서 옆에 적어 보세요. 내용은 하나도 안 자릅니다.
2단으로 빽빽하게, 표시된 것만 — 시험 직전에 훑는 배치입니다.
circuit.yaml 포맷
회로를 텍스트로 적습니다. 사람이 읽고 쓸 수 있으면서, 검증·시뮬레이션·EasyEDA 내보내기가 모두 이 파일 하나에서 나옵니다.
⚖️ 고르는 기준
| 선택 | ✅ | ⚠️ |
|---|---|---|
| YAML | 사람이 읽고 쓰기 쉬움, 주석 가능 | 들여쓰기 민감 |
| JSON | 도구 친화 | 주석 없음, 장황 |
| SPICE 넷리스트 직접 | 시뮬레이터 직결 | 검증·EasyEDA에 정보 부족, 가독성 |
| 회로도 파일 | 시각적 | 텍스트 diff 불가, 도구 종속 |
| 넷 중심 표기 | 연결이 명확, 검증 쉬움 | 회로도로 시각화 필요 |
| 부품 중심 표기 | 부품 정보 집중 | 연결 파악 어려움 |
검증 (ERC)
회로를 만들기 전에 에러를 자동으로 찾습니다. 각 경고는 해당 학습 문서로 연결됩니다.
⚖️ 고르는 기준
| 선택 | ✅ | ⚠️ |
|---|---|---|
| 엄격한 규칙 | 실수 방지 | 오탐(false positive) 이 많으면 무시하게 됨 |
| 느슨한 규칙 | 방해 안 됨 | 놓치는 실수 |
| 경고에 문서 링크 | 학습 효과 | 문서 유지보수 |
| 정적 + 정량 분리 | 환경 무관 기본 검증 | 두 번 실행 |
시뮬레이션으로 측정 확인
회로를 실제로 풀어 손계산과 일치하는지 확인합니다. 워크벤치에서 예제를 고르면 브라우저가 바로 풀고, expect 에 적어 둔 값과 맞대어 보여 줍니다. 어느 한쪽만 맞으면 둘 중 하나가 틀린 것입니다.
대역폭 또는 자속밀도정전용량F듀티비잡음 전압 밀도V/√Hz컨덕턴스S전류 (순시값)A허수 단위저항 (소신호)Ω시간s전압 (순시값)V
거리 또는 두께m컨덕턴스 (소신호)S전류A0번 전류A전압V0번 전압V
이득이득 (ol)이득 대역폭 곱Hz
정전용량F차단 주파수Hz저항Ω
전류A전력W저항Ω1번 전압V2번 전압V
차단 주파수Hz
전류 이득 (BJT)베이스 전류A컬렉터 전류A부하 저항Ω전압 (CC)V전압 (CE(sat))V
⚠️ 이상과 실제
| 못 하는 것 | 대응 |
|---|---|
| 레이아웃 의존 기생 | 경험값 + 여유, 실측 |
| 방사·유도 결합(coupling) | 3D 전자기 해석 또는 실측 |
| 발진 정확 예측 | 실물 측정 필수 |
| 접촉 불량, 조립 오차 | — |
| 열 분포 | 열 해석 |
| 부품 개체 편차 | 몬테카를로 |
⚖️ 고르는 기준
| 선택 | ✅ | ⚠️ |
|---|---|---|
| 브라우저 (여기) | 설치 없음, 즉시, 폰에서도 | 잡음 해석이 없음, OP앰프는 1극점 |
| ngspice / EasyEDA | 비선형, 제조사 모델 | 설치 필요, PC 에서만 |
| 이상 모델 | 빠름, 개념 확인 | 실물과 다름 |
| 기생 포함 모델 | 실용적 정확도 | 파라미터 확보 필요 |
| 해석해 교차검증 | 신뢰성 | 단순 회로만 가능 |
| 몬테카를로 | 부품 편차 반영 | 시간 |
EasyEDA로 내보내기
circuit.yaml에서 EasyEDA Standard가 읽을 수 있는 .json 을 생성합니다. 열자마자 Ctrl+R로 시뮬레이션까지 됩니다.
⚠️ 이상과 실제
| 위험 | 설명 | 대응 |
|---|---|---|
| 시뮬 심볼 이름 | EasyEDA Std 시뮬레이터는 특정 spiceSymbolName만 인식. 임의 값을 쓰면 파일은 열려도 Ctrl+R 실패 | R/C/L/V/I부터 실측으로 확인해 표로 고정 |
head의 AC/DC 필드 | 문서화가 부실 | EasyEDA UI에서 설정 후 저장한 파일과 diff |
| 심볼 기하 | BJT·MOSFET·opamp는 핀이 3~5개라 손으로 그려야 함 | circuit preview SVG로 검증 |
| 값 표시와 속성 불일치 | Value(Ω) 속성과 표시 텍스트가 다르면 시뮬이 화면과 다른 값을 씀 | 한 소스에서 둘 다 채움 |
⚖️ 고르는 기준
| 선택 | ✅ | ⚠️ |
|---|---|---|
| 넷라벨 방식 | 연결 100% 정확, 구현 단순 | 못생김 |
| 자동 배선 | 보기 좋음 | 복잡, 버그 위험 |
| EasyEDA Std JSON | 공개 포맷, Std+Pro 대응 | Pro 전용 기능 사용 불가 |
| KiCad 넷리스트 | 오픈소스 생태계 | EasyEDA에서 추가 변환 필요 |
| 프로브 자동 부착 | 즉시 시뮬 가능 | 노드가 많으면 복잡 |
채팅으로 회로 만들기
한국어로 설명하면 회로 파일이 나옵니다. 검증기가 피드백 루프라서 기계적으로 확인된 회로만 나옵니다.
LLM이 만든 회로를 그대로 믿지 않고, 검증기를 통과한 것만 내놓습니다.
⚠️ 이상과 실제
| 한계 | 대응 |
|---|---|
| LLM이 틀릴 수 있음 | 검증기 통과 + 본인이 계산 확인 |
| 검증기가 모든 것을 잡지는 못함 | 학습 문서로 이해 |
| 레이아웃은 다루지 못함 | 15장 직접 |
| 특수 부품 모델 부족 | 직접 추가 |
| 최종 책임은 설계자 | 실물 검증 필수 |
⚖️ 고르는 기준
| 선택 | ✅ | ⚠️ |
|---|---|---|
| Claude Code 스킬 | API 키 불필요(구독 사용량), 파일·명령 직접 실행 | Claude Code 환경 필요 |
독립 CLI (circuit chat) | 어디서나 | API 키 필요 또는 claude CLI 의존 |
| 웹 UI | 편함 | 구현 부담 |
연습문제
인쇄하면 답이 접힌 채로 나옵니다 — 그대로 문제지가 됩니다. 위의 “답도 함께 인쇄” 를 켜면 풀이까지 펴서 나옵니다.
- circuit.yaml 포맷다음 회로를 circuit.yaml로 쓰세요: 9 V 전원, 1 kΩ과 2 kΩ 직렬, 중간점이 출력.
풀이
meta: name: 9V 분압기 components: - {ref: V1, type: vdc, value: 9} - {ref: R1, type: r, value: 1k} - {ref: R2, type: r, value: 2k} nets: VIN: [V1.p, R1.1] OUT: [R1.2, R2.1] GND: [V1.n, R2.2] analyses: - {type: op} expect: - {measure: v, node: OUT, value: 6.0, tol: 1%}V
- circuit.yaml 포맷이 포맷에서
GND가 예약어인 이유는?풀이
SPICE에서 노드 0이 접지이고, 모든 회로는 접지 기준이 있어야 풀립니다.
GND넷을 자동으로 노드 0에 매핑하면:- 사용자가 매번 지정할 필요 없음
- 접지 없는 회로를 검증 단계에서 잡을 수 있음 (
E201) - EasyEDA 내보내기에서 접지 심볼로 변환
⚠️ 접지가 없으면 SPICE가
singular matrix오류를 냅니다 (2-02). 검증기가 시뮬레이션 전에 잡아줍니다. - 검증 (ERC)다음 회로에서 검증기가 잡을 문제는?
풀이
코드 문제 E201 GND넷이 없음 → SPICE 시뮬레이션 불가W301 LED에 직렬 저항 없음 → 파괴 위험 수정:
components: - {ref: V1, type: vdc, value: 5} - {ref: R1, type: r, value: 330} - {ref: D1, type: led, model: LED_RED} nets: VIN: [V1.p, R1.1] A: [R1.2, D1.a] GND: [V1.n, D1.k] ```text - 검증 (ERC)W501(고임피던스 노드에 버퍼 없음)은 어떻게 검출합니까?
풀이
검출 논리:
- 각 노드의 테브난 등가(Thévenin equivalent) 저항을 계산 (2-05)
- 100 kΩ 이상인 노드를 찾음
- 그 노드가 다음 중 하나에 연결되었는지 확인:
- 커넥터 (외부로 나감)
- 큰 용량성 부하
- 여러 부품 (배선이 길어질 가능성)
- 그리고 버퍼(팔로워 구성 OP앰프, 소스 팔로워(source follower))가 없으면 경고
메시지 예:
W501 노드 'ELECTRODE'의 임피던스가 1.0 MΩ입니다 이 노드가 커넥터 J1로 나갑니다. 케이블 용량(약 100 pF/m)과 만나면 대역폭이 1.6 kHz로 제한됩니다. 수정: 이 노드 바로 옆에 버퍼(볼티지 팔로워)를 넣으세요. 참고: docs/13-signal-chain/03-input-impedance.md이 규칙이 이 저장소의 목적(신호 측정)에 특화된 부분입니다. 일반 EDA 도구는 이런 검사를 하지 않습니다.
- 시뮬레이션으로 측정 확인RC 저역통과(10 kΩ, 100 nF)의 차단주파수를 손으로 계산하고,
expect로 쓰세요.풀이
analyses: - {type: ac, sweep: dec, points: 50, fstart: 1, fstop: 100k} expect: - {measure: gain_db, node: OUT, at: 159.15, analysis: ac, value: -3.01, tol: 0.2} - {measure: gain_db, node: OUT, at: 1591.5, analysis: ac, value: -20.04, tol: 0.5}10배 주파수에서 −20 dB(1차 롤오프)도 함께 검증합니다.
- 시뮬레이션으로 측정 확인시뮬레이션 대역폭이 실측보다 훨씬 넓습니다. 무엇을 빠뜨렸을까요?
풀이
기생 용량(parasitic capacitance)을 넣지 않았을 가능성이 큽니다 (11-07).
확인 목록:
- [ ] 고임피던스 노드의 대지 용량 (PCB 1~3 pF/cm)
- [ ] 케이블 용량 (100 pF/m)
- [ ] OP앰프 입력 용량 (2~10 pF)
- [ ] 프로브(probe) 용량 (측정 시 10 pF)
- [ ] 소스 임피던스가 실제 값인가
- [ ] OP앰프 품번이 모델표에 있는가 (없으면 GBW 1 MHz 일반값으로 풀립니다)
가장 흔한 원인: 소스 임피던스와 입력 용량을 넣지 않아 가 0 이 된 경우.
수정 예:
components: - {ref: RS, type: r, value: 1MEG, label: 실제 소스 임피던스} - {ref: CIN, type: c, value: 15p, label: 입력 용량 + PCB + 프로브} - 시뮬레이션으로 측정 확인NPN 스위치의 컬렉터 전류를 계산했더니 = 1.1 A 가 나왔습니다. 그런데 시뮬레이션은 49 mA 라고 합니다. 누가 맞습니까?
풀이
시뮬레이션이 맞고, 를 쓴 것이 틀렸습니다. 는 활성 영역에서만 성립합니다.
부하가 240 Ω, 전원이 12 V 면 흐를 수 있는 최대 전류가 50 mA 입니다. 그보다 많이 흘리려 하면 컬렉터 전압이 이미터 아래로 내려가고, 그러면 베이스-컬렉터 접합이 순방향이 되어 여분의 베이스 전류를 되돌려 보냅니다. 이것이 포화입니다 (6-02).
스위치로 쓸 때는 일부러 포화시킵니다 — 가 0.1~0.2 V 로 내려가야 손실이 작습니다. 그래서 베이스 전류를 필요한 것보다 넉넉히(보통 ) 줍니다.
이 시뮬레이터를 만들 때 베이스-컬렉터 접합을 빼먹었더니 정확히 이 회로가 1.04 A 를 흘렸습니다. 부하가 허용하는 것이 50 mA 인데도요.
- EasyEDA로 내보내기생성한 JSON이 EasyEDA에서 열리는데 부품이 안 보입니다. 무엇을 확인합니까?
풀이
BBox를 확인하세요.
BBox가 모든 도형을 감싸지 않으면, 파일은 열리지만 뷰가 빈 곳을 비춥니다."BBox": {"x":170, "y":100, "width":200, "height":130}확인:
- 모든 도형의 좌표 범위를 계산
- BBox가 그 범위를 포함하는가
- 여유를 두었는가 (심볼 텍스트 포함)
그 외 확인:
canvas의 뷰박스 크기- 도형 좌표가 캔버스 범위 안인가
- EasyEDA에서 "Fit to screen"(Ctrl+Shift+F) 시도
- EasyEDA로 내보내기파일은 열리는데 Ctrl+R(시뮬레이션)이 실패합니다. 원인은?
풀이
spiceSymbolName속성이 EasyEDA 시뮬레이터가 인식하는 값이 아닐 가능성이 큽니다.EasyEDA Std의 시뮬레이터는 특정 시뮬레이션 라이브러리 심볼만 인식합니다:
- 저항 →
Resistor - 커패시터(capacitor) →
Capacitor - 정현파 전압원 →
VSIN - 등
확인 방법:
- EasyEDA에서 직접 부품을 배치하고 저장
- 그 파일의
LIB~문자열에서spiceSymbolName값 확인 - 우리 생성기의 값과 비교
그 외 확인:
spicePre속성 (R, C, L, V, I)- 값 속성(
Value(Ω))과 표시 텍스트가 일치하는가 - 접지(GND) 플래그가 있는가 — 없으면 시뮬 불가
- 시뮬 설정(
head의 TRAN/AC/DC)이 올바른가
막히면 "EasyEDA는 회로도 작성·PCB용, 시뮬은 로컬 ngspice"로 분리해도 됩니다. 두 도구가 같은 엔진을 쓰므로 값은 어차피 같습니다.
- 저항 →
- 채팅으로 회로 만들기"저잡음 증폭기 만들어줘"라는 요청이 왜 나쁜가요?
풀이
목표가 없어서 설계할 수 없습니다.
빠진 정보:
- 신호원의 임피던스(impedance) → 소자 선택이 완전히 달라짐 (7-06)
- 신호 크기 → 게인 결정
- 대역폭(bandwidth) → 잡음 계산의 기본
- 목표 SNR → 달성 가능성 판정
- 전원, 오프셋, 간섭 환경
개선된 요청:
"소스 임피던스 200 kΩ, 신호 50 µV rms, 대역 300 Hz~5 kHz,
목표 입력 환산 잡음 5 µV rms 이하, ±5 V 전원"이러면 16-00 방법론의 3단계(가능/불가능 판정)를 바로 할 수 있습니다.
"저잡음"은 상대적입니다. 숫자로 말하세요.
- 채팅으로 회로 만들기채팅으로 만든 회로를 어디까지 믿어야 합니까?
풀이
단계별로 신뢰도가 다릅니다.
단계 신뢰도 근거 circuit check통과높음 기계적 규칙 circuit sim값높음 ngspice (단, 모델 한계) circuit test통과높음 기대값과 대조 게인·필터 계산 중간 검산 필요 소자 선택 중간 근거를 확인하세요 노이즈 예산 중간 직접 계산 검증 레이아웃 조언 낮음 회로도로 표현 불가 실물 동작 모름 반드시 실측 권장 절차:
- 생성된 회로의 핵심 계산을 직접 검산 (게인, 대역폭, 잡음)
- 왜 그 소자를 골랐는지 근거를 확인 (문서 링크 따라가기)
- 시뮬레이션 결과가 손계산과 맞는지 확인
- 기생 성분(parasitic)을 넣은 모델로 다시 시뮬레이션
- 시제품 제작 후 실측 검증 (14장)
도구는 계산과 검증을 대신해주지만, 판단은 설계자의 몫입니다. 그래서 이 저장소가 도구보다 문서를 먼저 만든 것입니다.