독립 바이어스 PMOS 전류원 부하 · DC Sweep · AC Gain · MATLAB 후처리

| 용어에 대한 주의 본 문서에서는 사용자가 정한 ‘수동소자가 있는 차동쌍’이라는 프로젝트 표현을 유지한다. 다만 물리적으로 M3/M4는 PMOS 능동소자다. 또한 이 회로는 M1 전류를 M3/M4가 출력으로 복사하는 전형적인 능동 전류미러 부하가 아니라, I2가 M3에 기준전류를 강제해 M4의 게이트 바이어스를 독립적으로 만드는 current-source load 구조다. |
1. NET 설정값부터 이해하기
회로를 설명할 때는 그래프보다 먼저 NET의 각 줄이 어떤 물리적 의미를 갖는지 확인해야 한다. 현재 회로는 VDD=5 V, tail current I1=100 µA, PMOS 기준전류 I2=100 µA, VIN2=2 V를 기준으로 하고 VIN1을 DC sweep 또는 AC 입력으로 사용한다.
LTspice NET
I1 N003 0 50µ V1 N001 0 1.8v V2 V_in1 0 1.2 AC 0.5 0 V3 V_in2 0 1.2 AC 0.5 180 I2 N002 0 10µ M1 N001 V_in1 N003 0 MY_NMOS l=1u w=20u ad=100p as=100p pd=30u ps=30u M2 V_out V_in2 N003 0 MY_NMOS l=1u w=20u ad=100p as=100p pd=30u ps=30u M3 N002 N002 N001 N001 MY_PMOS l=1u w=40u ad=200p as=200p pd=50u ps=50u M4 V_out N002 N001 N001 MY_PMOS l=1u w=40u ad=200p as=200p pd=50u ps=50u .model NMOS NMOS .model PMOS PMOS .lib C:\Users\ddrs4\AppData\Local\LTspice\lib\cmp\standard.mos * .ac dec 100 1 100meg * .dc V2 0 3 0.001 .op .model MY_NMOS nmos(vto=0.7 kp=100u lambda=0.02) .model MY_PMOS pmos(vto=-0.7 kp=40u lambda=0.02) .backanno .end |
| 항목 | 설정값 | 회로에서의 의미 |
| V1 | 1.8 V | 공급전압 VDD |
| V2 / V_in1 | DC 1.2 V, AC 0.5V 0(위상) | AC 입력. DC에서는 V2를 0~3 V로 sweep |
| V3 / V_in2 | DC 1.2 V, AC 0.5V 180(위상) | AC 입력. |
| I1 | 100 µA | M1+M2의 전체 tail current |
| I2 | 100 µA | M3 reference branch 전류 |
| M1/M2 | W=20 µm, L=1 µm | NMOS source-coupled pair |
| M3/M4 | W=40 µm, L=1 µm | PMOS bias/reference와 출력 current-source load |
| .ac | .ac dec 100 1 100meg | 1 Hz~100 MHz, decade당 100 point |
| .dc | .dc V2 0 3 0.001 | VIN1을 0~3 V, 1 mV step으로 sweep |
1.1 사용자 정의 MOS 모델
실제로 M1~M4가 참조하는 모델
.model MY_NMOS nmos(vto=0.7 kp=100u lambda=0.02).model MY_PMOS pmos(vto=-0.7 kp=40u lambda=0.02) |
| 파라미터 | NMOS | PMOS | 의미 |
| VTO | +0.7 V | -0.7 V | 문턱전압 |
| KP | 100 µA/V² | 40 µA/V² | Level-1 공정 transconductance parameter |
| λ | 0.02 V⁻¹ | 0.02 V⁻¹ | 채널 길이 변조 → 유한한 ro |
| W/L | 20 | 40 | β=KP·W/L에 반영 |
| β | 2.0 mA/V² | 1.6 mA/V² | 포화전류와 gm을 정하는 계수 |
| 모델 선택 확인 NET에는 standard.mos와 '.model NMOS NMOS', '.model PMOS PMOS'도 남아 있지만 M1~M4의 model name은 MY_NMOS/MY_PMOS다. 따라서 핵심 해석에는 사용자 정의 Level-1 모델이 사용된다. |
2. 회로의 목적과 각 소자의 역할
목적은 VIN1과 VIN2의 전압 차이를 M1/M2의 전류 분배(current steering)로 바꾸고, M2와 M4가 만나는 V_out에서 그 전류 변화를 전압 변화로 변환하는 것이다. 즉 differential input을 single-ended output으로 바꾸는 학습용 증폭기다.
| 소자 | 역할 | 동작 |
| M1 | VIN1 입력 NMOS | VIN1↑ → ID1↑ |
| M2 | VIN2 입력 NMOS + 출력 branch | ID2 변화가 VOUT에 직접 반영 |
| I1 | Tail current sink | ID1+ID2≈100 µA |
| M3 | Diode-connected PMOS | I2가 요구하는 VSG를 생성 |
| I2 | PMOS 기준전류 | M3에 100 µA를 강제 |
| M4 | 출력 PMOS current-source load | M3와 같은 gate/source bias로 VOUT에 전류 공급 |
| 전형적인 능동 전류미러 부하와 다름 M3는 M1 drain과 연결되어 있지 않다. 즉 M1의 신호전류가 M3→M4로 복사되는 구조가 아니다. M3/M4는 1:1 mirror 관계지만 reference는 M1이 아니라 독립 current source I2다. |
3. DC 동작 순서와 전류 흐름
3.1 I2 → M3 → N002 → M4 순서
M3는 gate와 drain이 N002에 묶인 diode-connected PMOS다. I2가 100 µA를 아래로 당기므로 M3는 그 전류를 흘릴 수 있을 때까지 N002를 자동으로 조정한다.
3.2 I1이 M1/M2의 합전류를 고정
I1=100 µA이므로 두 NMOS가 정상영역에 있을 때 ID1+ID2≈100 µA다. VIN1이 올라가 ID1이 증가하면 같은 만큼 ID2가 감소한다.
| 직관적으로 외우기 VIN1↑ → M1 전류↑ → M2 전류↓ → M4 공급전류가 상대적으로 더 커짐 → VOUT↑. VIN1이 매우 낮으면 M1≈OFF, M2≈100 µA, VOUT≈3.95 V. |
4. 전압이득을 구하는 세 가지 방법
4.1 DC transfer curve의 접선 기울기
| DC local gain A_v,Q≈dVOUT/dVIN1. Q-point 근처의 아주 작은 구간에서 계산해야 small-signal gain과 대응한다. |
그래프에 표시된 두 점 (1.694 V, 3.95098 V)와 (1.735 V, 4.66378 V)를 연결한 평균 기울기는 17.385 V/V = 24.80 dB다. 이것은 41 mV 구간의 secant gain이지 특정 Q-point의 AC gain이 아니다.
4.2 AC analysis
V2의 AC amplitude가 1 V이고 V3의 AC=0이라면, 올바르게 VOUT을 export했을 때 |VOUT|=|VOUT/VIN1|이 된다. LTspice에서 가장 안전한 표현은 dB(V(v_out)/V(v_in1))이다.
| 진짜 차동이득 권장 설정 VIN1에 AC 0.5∠0°, VIN2에 AC 0.5∠180°를 넣고 dB(V(v_out)/V(v_in1,v_in2))를 사용하면 differential input amplitude가 정확히 1 V가 되어 정의가 명확하다. |
4.3 소신호 근사식
VIN1≈VIN2이고 ID1≈ID2≈I1/2인 균형점 근처에서는 M4가 독립 current-source load로 동작하므로 single-ended differential gain을 대략 A_v,d≈+(gm/2)(ro2∥ro4)로 볼 수 있다. VIN1이 증가하면 VOUT가 증가하므로 VIN1→VOUT 경로의 부호는 +다.
5. DC Sweep 그래프: 두 번 꺾이는 이유

| 영역 | VIN1 | 상태 | 출력 |
| I | 0 ~ 약 1.694 V | M1 거의 OFF, M2≈100 µA | VOUT≈3.95098 V |
| II | 1.694 ~ 1.735 V | M1 turn-on, current steering | VOUT 급상승 |
| III | 1.735 V 이상 | M4 saturation→triode | 곡선 완만, VOUT→5 V |
5.1 첫 번째 꺾임: VIN1≈1.694 V
M1이 OFF인 동안 M2가 100 µA를 담당한다. VOUT≈3.95098 V에서 NMOS Level-1 식을 풀면 공통 source 전압은 약 0.99273 V다. M1 turn-on 조건 VGS1≈VTH=0.7 V를 적용하면 VIN1≈0.99273+0.7=1.69273 V다.
| 항목 | 이론 | 그래프 | 차이 |
| 첫 knee VIN1 | 1.69273 V | 1.694 V | 1.27 mV |
| 하단 VOUT | 3.95010 V | 3.95098 V | 0.88 mV |
즉 첫 번째 꺾임은 M1이 threshold를 넘으면서 tail current를 처음 가져가기 시작하는 물리적 turn-on 지점이다.
5.2 1.694~1.735 V가 매우 가파른 이유
M1이 µA보다도 작은 전류부터 가져가기 시작하면 M2 전류는 100 µA에서 감소한다. M4는 I2/M3로 정한 bias에 의해 여전히 거의 100 µA를 공급하려고 하므로, VOUT가 크게 변해 M4의 drain current가 M2 전류와 다시 같아지는 지점을 찾아야 한다. λ=0.02 V⁻¹로 출력저항이 크기 때문에 아주 작은 전류 차이가 큰 전압 변화로 바뀐다.
| VIN1 | 계산 VOUT | ID1 | ID2 |
| 1.694 V | 3.950985 V | 0.00173 µA | 99.99827 µA |
| 1.721 V | 4.324853 V | 0.73409 µA | 99.26591 µA |
| 1.735 V | 4.663763 V | 1.54828 µA | 98.45172 µA |
VIN1이 41 mV 증가하는 동안 M1 전류는 약 1.55 µA만 증가했는데 VOUT는 약 0.713 V 증가한다. 이것이 그래프가 거의 수직처럼 보이는 이유다.
5.3 두 번째 꺾임: VOUT≈4.65 V
M4의 VSG≈1.04990 V이므로 overdrive VOV4≈0.34990 V다. PMOS 포화조건 VSD4≥VOV4에서 경계 출력은 VOUT≈5−0.34990=4.65010 V이다.
| 항목 | 이론 경계 | 그래프 표시 | 해석 |
| M4 saturation→triode | 4.65010 V | 4.66378 V | 표시점은 이론 경계를 약 13.68 mV 지난 위치 |
| 대표 VIN1 | - | 1.735 V | 두 번째 굴곡 구간의 표시값 |
이 지점 이후 M4는 VOUT가 VDD에 가까워질수록 VSD가 작아져 공급전류가 감소한다. 그래서 출력은 더 이상 수직에 가깝게 오르지 않고 완만하게 5 V로 수렴한다.
6. AC 그래프 분석

7. MATLAB DC 코드 분석
업로드된 DC MATLAB 코드
|
1. CSV 파일 데이터 불러오기
% 파일명이 data.csv가 아니라면 파일 경로와 이름을 맞게 수정해주세요.
data = readmatrix('\IC_Process_Passive_Current_Source_Load_DiffAmp.csv');
% 2. X축(입력 전압)과 Y축(출력 전압) 데이터 분리
voltage_in = data(:, 1); % 1번째 열: 0.0V ~ 3.0V
voltage_out = data(:, 2); % 2번째 열: 3.9V ~ 5.0V
% 3. 그래프 생성 및 스타일 설정
figure('Color', [0.1 0.1 0.1]); % 이미지와 유사하게 어두운 배경 설정 (선택사항)
plot(voltage_in, voltage_out, 'b-', 'LineWidth', 2); % 파란색 실선 그래프
% 4. 축 범위 및 라벨 설정 (이미지 그래프 기준 반영)
xlim([0.0, 3.0]); % X축: 0.0V ~ 3.0V
ylim([3.9, 5.0]); % Y축: 3.9V ~ 5.0V
set(gca, 'XTick', 0.0:0.3:3.0); % X축 간격 0.3V 설정
set(gca, 'YTick', 3.9:0.1:5.0); % Y축 간격 0.1V 설정
% 5. 그래프 내부 디자인 꾸미기 (이미지 그리드 느낌 재현)
xlabel('Input Voltage (V)', 'Color', 'w');
ylabel('Output Voltage (V)', 'Color', 'w');
title('DC Sweep Analysis: V(v_in, v_out)', 'Color', 'w');
grid on;
set(gca, 'GridColor', [0.3 0.3 0.3], 'GridAlpha', 0.5); % 점선 형태의 그리드
set(gca, 'Color', [0 0 0], 'XColor', 'w', 'YColor', 'w'); % 검은 배경 화면 설정
|
| 단계 | 기능 | 주의점 |
| readmatrix | CSV를 숫자 행렬로 읽음 | CSV가 숫자 2열이라는 전제 |
| 1열 | VIN1 | X축 |
| 2열 | VOUT | Y축 |
| plot | DC transfer curve 작성 | 선형 축이 적절 |
| xlim/ylim | 관심구간 고정 | 범위 밖 값은 보이지 않음 |
| grid/style | 포트폴리오 시각화 | 회로 계산에는 영향 없음 |
현재 코드는 그래프 재현용이다. local gain과 knee를 자동 계산하지 않으므로 gradient를 추가하면 교육용 분석의 수준을 높일 수 있다.
8. MATLAB AC 코드 분석
업로드된 AC MATLAB 코드
|
% 1. CSV 파일 데이터 불러오기 (텍스트 파싱을 위해 readtable 사용)
opts = detectImportOptions('\IC_Process_Passive_Current_Source_Load_DiffAmp_ac.csv');
opts.VariableNamingRule = 'preserve';
db_table = readtable('\IC_Process_Passive_Current_Source_Load_DiffAmp_ac.csv', opts);
% 2. X축(주파수 Frequency) 추출
frequency = db_table{:, 1};
% 3. Y축 데이터 파싱 (LTspice 특유의 지수 표기법 텍스트 포맷 완벽 분리)
raw_ac_string = db_table{:, 2};
% [수정 포인트] e+01, e-02 같은 과학적 지수 표현식까지 모두 포함하여 매칭하도록 패턴을 확장했습니다.
gain_tokens = regexp(raw_ac_string, '^\((-?[0-9.]+e[+-][0-9]+|[0-9.]+)', 'tokens');
gain_db = zeros(size(frequency));
for i = 1:length(gain_tokens)
if ~isempty(gain_tokens{i})
gain_db(i) = str2double(gain_tokens{i}{1}{1});
end
end
% 4. 그래프 생성 및 스타일 설정 (Bode Plot 이득 특성용 다크 모드)
figure('Color', [0.1 0.1 0.1]);
% AC 주파수 축 로그 스케일 플롯
semilogx(frequency, gain_db, 'b-', 'LineWidth', 2.5);
% 5. 축 범위 및 간격 설정 (데이터 누락이나 잘림 방지를 위해 마진 최적화)
xlim([min(frequency), max(frequency)]);
% 지수 변환이 완료되었으므로 복원된 값의 최솟값/최댓값을 기준으로 Y축 범위를 자동 조정합니다.
ylim([min(gain_db)-3, max(gain_db)+3]);
% 6. 그래프 내부 디자인 꾸미기 (기존 스타일 계승)
xlabel('Frequency (Hz)', 'Color', 'w', 'FontSize', 11);
ylabel('Magnitude (dB)', 'Color', 'w', 'FontSize', 11);
title('AC Analysis: Voltage Gain (dB)', 'Color', 'w', 'FontSize', 13, 'FontWeight', 'bold');
grid on;
set(gca, 'XMinorGrid', 'on', 'YMinorGrid', 'on'); % 주파수 축 조밀한 로그 그리드 추가
set(gca, 'GridColor', [0.4 0.4 0.4], 'GridAlpha', 0.4);
set(gca, 'MinorGridColor', [0.2 0.2 0.2], 'MinorGridAlpha', 0.3);
set(gca, 'Color', [0 0 0], 'XColor', 'w', 'YColor', 'w');
|
| 단계 | 기능 | 핵심 |
| detectImportOptions/readtable | AC CSV를 table로 읽음 | 문자열 열 처리 |
| frequency | 1열 주파수 | 로그 X축 |
| regexp | '(XdB, phase)'에서 X만 추출 | gain 계산이 아니라 파싱 |
| semilogx | Bode 형태의 로그 주파수 축 | 1~100 MHz 표시 |
| ylim | gain 주위 ±5 dB | 평탄한 데이터에서도 가독성 확보 |
| MinorGrid | decade 내부 눈금 | 포트폴리오 시각화 |
'전자 > 아날로그 회로설계' 카테고리의 다른 글
| HIGH-HEADROOMFIVE-TRANSISTOR OTAwith PMOS Level Shifter(OTA 헤드룸 이슈 개선) (0) | 2026.08.16 |
|---|---|
| Five-Transistor OTA대신호 모델 설명 (0) | 2026.08.15 |