[SRAM-PIM Core Circuit] Design 4-bit Flash ADC & SAR ADC
"4-bit Flash ADC & SAR ADC"
[4-bit Flash ADC]
1. Introduction
N-bit 해상도를 구현하려면 2N - 1개의 Comparator가 병렬로 배치
→ 저항 직렬 연결을 통해 기준 전압을 여러 단계로 나누어 각 비교기에 공급하여 입력 전압을 동시에 비교 (병렬 처리)
→ Comparator의 츨력을 Binary Code로 변환 (1의 개수로 출력 값 파악 = Thermometer Code)
· 장점 : Clock 한 번에 즉시 Digital 값을 출력 (ADC 구조 중 가장 빠름)
· 단점 : 해상도를 높일 때마다 필요한 회로 면적과 전력 소모가 기하급수적으로 증가(Ex. 8-bit = 255개 Comparator)
2. Operation
▶ 현재 단계와 위의 단계 모두 Vin이 Vref를 넘는 경우
① 현재 단계와 위의 단계의 비교기는 모두 1을 출력
② 위의 단계 비교기의 출력은 Inverter를 거쳐 1 → 0 변환
③ NAND와 Inverter 차례로 통과 시 0 출력 = 경계점 X
▶ 현재 단계는 Vin이 Vref를 넘고, 위의 단계는 Vin이 Vref를 넘지 못하는 경우
① 현재 단계의 비교기는 1, 위의 단게의 비교기는 0을 출력
② 위의 단계 비교기의 출력은 Inverter를 거쳐 0 → 1 변환
③ NAND와 Inverter 차례로 통과 시 1 출력 = 경계점 O
위 단계 진행 후, 경계에 해당하는 지점을 1의 개수로 지정하고 OR 연산을 통해 Binary Code로 변환
Ex) E11 = 1 → E11 지점이 한계점 → 1의 개수 11개 ▶ By. Truth Table 10112 = 1110
D0 = E1 + E3 + E5 + E7 + E9 + E11 + E13 + E15 = 1
D1 = E2 + E3 + E6 + E7 + E10 + E11 + E14 + E15 = 1
D2 = E4 + E5 + E6 + E7 + E12 + E13 + E14 + E15 = 0
D3 = E8 + E9 + E10 + E11 + E12 + E13 + E14 + E15 = 1
3. Schematic
4. Setting & Result
Linear 증가 결과 확인
Vref가 일정하지 않아 전압 비교 시 오류 발생 가능
특정한 값(0.45V)을 기준으로 결과 확인
0.45V → E4 = 1 → 0100, but 0101 출력 & Kickback Noise 발생
※ Kickback Noise : 비교기 내부의 Switching 동작 발생 시, 기생 Capacitor를 통해 급격한 전류 변화나 전하가 입력단으로 역류
Comparator 앞단에 1pF Capacitor 연결 시 Vref의 Kickback Noise 일정 부분 안정화
※ 멀리 있는 전원부 대신 Capacitor가 즉각적으로 전하를 공급/흡수하여 저항쪽으로 흐르는 전류 변화를 줄여 Vref를 일정하게 유지
Capacitor를 1pF에서 1uF으로 증가 시 Vref 안정화
But, 여전히 0100이 아닌 0101로 출력
※ Capacitor의 용량이 크면 Q = CV에 의해 전압 변화량이 작아져 Noise 억제력↑
→ But, 초기 구동 시 또는 전압 변화 시 Capacitor를 채워야 하기에 Vref가 목표 전압에 도달하는 시간(Settling Time)↑ & 면적↑
Comparator의 Vin과 Vref와 연결된 nMOS의 Width를 100n에서 500n로 증가
0101이 아닌 0100으로 정확히 출력
※ Width↑ → Noise↓, gm↑(= Gain↑ = 감도↑), Vth의 표준 편차↓(= 소자 불일치↓)
다시 Linear 결과 출력 시 모든 Vref가 안정한 것을 확인 가능
Pulse 증가로 Setting
하위-bit Comparator 출력 이상
비교기의 입력이 nMOS라서 낮은 전압을 잘 구분하지 못함
→ 비교기의 입력을 pMOS로 변경하여 낮은 전압을 잘 구분하도록 함
→ 비교기의 입력을 pMOS로 변경하기 위해서는 비교기 전체를 바꿔야 함
→ 비교기의 입력을 pMOS로 변경하기 위해서는 비교기 전체를 바꿔야 함
① pMOS → nMOS / nMOS → pMOS
② 출력이 반전되어 나오므로 Vout에 Inverter를 추가하여 출력을 반전시킴
③ Oscillation → Flat 출력이어야 하는데 Flat → Oscillation 출력이므로 Vin과 Vref 위치 변경
④ pMOS Comparator를 6번째 Comparator까지 사용
⑤ SA_EN_b에 반응해야 하므로 top module에서 Inverter로 SA_EN_b 신호 생성
· 파형이 Oscillation → Flat으로 변화하는 원리
1) Vin < Vref (Oscillation 구간)
① SA_EN_b = High(SA_EN = Low)인 경우 아래 M16 Tr On → GND와 연결
② Vout을 출력하는 Inverter와 연결된 Node가 M16 Tr에 의해 Low(∴ Vout = High)
③ SA_EN_b = Low(SA_EN = High)인 경우 M9 Tr On → Vdd와 연결
④ pMOS이므로 Gate 전압이 낮을수록 더 많은 전류를 흘려 보내서 net02 = High / net12 = Low가 됨
⑤ net02 = High → Vout = Low
→ SA_EN_b = High(SA_EN = Low) : Vout = High / SA_EN_b = Low(SA_EN = High) : Vout = Low
∴ Vin < Vref 구간은 SA_EN 신호에 따라 Oscillation 되는 구간
2) Vin > Vref (Flat 구간)
① SA_EN_b = High(SA_EN = Low)인 경우 아래 M16 Tr On → GND와 연결
② Vout을 출력하는 Inverter와 연결된 Node가 M16 Tr에 의해 Low(∴ Vout = High)
③ SA_EN_b = Low(SA_EN = High)인 경우 M9 Tr On → Vdd와 연결
④ pMOS이므로 Gate 전압이 낮을수록 더 많은 전류를 흘려 보내서 net02 = Low / net12 = High가 됨
⑤ net02 = Low → Vout = High
→ SA_EN_b = High(SA_EN = Low) : Vout = High / SA_EN_b = Low(SA_EN = High) : Vout = High
∴ Vin > Vref 구간은 SA_EN 신호에 따라 Flat 되는 구간
하위-bit 해결
MSB 출력 이상
MSB의 NAND 연결을 vdd로 하지 않고 16번째 Dummy Comparator를 추가하여 해결
Out 출력이 제대로 변화하는 것을 확인 가능
[4-bit SAR ADC]
1. Introduction
Successive Approximation Register ADC로 이진 탐색 알고리즘(Up/Down)과 1개의 Comparator를 사용
→ 전체 전압 범위의 중간값과 입력 전압을 비교하여 MSB부터 LSB까지 순차적으로 결정 (순차 처리)
· 구조가 단순하여 면적↓ & 전력 효율↑ → 중~고해상도(8~18-bit) 구현에 유리
· bit 수에 비례하여 변환 시간이 길어지므로, Flash ADC에 비해 속도↓
2. Operation [Vin = 0.6V, Vref = 0.9V]
① 위에서 왼쪽 1번째 D-FF의 D는 접지에 연결되어 항상 0을 전달
② rst에 1을 인가하여 모든 D-FF를 Reset하여 0을 Q로 출력하고, Capacitor의 잔여 전하를 방전
③ set에 1을 인가하여, 위에서 왼쪽 1번째 D-FF가 1을 출력하도록 함 → clk와 상관없이 Q는 1을 출력(1000)
④ clk_int가 처음으로 High가 되면 D의 상태가 Q로 출력되므로 2번째 D-FF의 Q가 1을 출력(0100)
⑤ clk_int가 2번째로 High가 되면 3번째 D-FF의 Q가 1을 출력(0010)
⑥ clk_int가 3번째로 High가 되면 4번째 D-FF의 Q가 1을 출력(0001)
⑦ clk_int가 4번째로 High가 되면 5번째 D-FF의 Q가 1을 출력(0000)
▶ shift_1 = 1인 경우 (1000)
① 아래 왼쪽 1번째 D-FF의 set=1, rst=0 인가 → clk 상관없이 Q(out<3>)=1, Q_b(out3_b)=0
② out3_b=0이므로 Vref가 연결되어 Capacitor에 800fF/1600fF만큼 충전 후, Vin과 비교
③ 0.45V보다 Vin이 더 크므로 비교기가 1 출력 → 모든 D-FF의 D에 1 인가
▶ shift_2 = 1인 경우 (0100)
① 아래 2번째 D-FF의 set=1, rst=0 인가 → clk 상관없이 Q(out<2>)=1, Q_b(out2_b)=0
② Q(out<2>)=1이므로 1번째 D-FF의 clk가 High가 되어 D에 대기하고 있는 1이 Q(out<3>)로 출력
③ out3_b=0, out2_b=0이므로 Vref가 연결되어 Capacitor에 (800fF+400fF)/1600fF만큼 충전 후, Vin과 비교
④ 0.675V보다 Vin이 더 작으므로 비교기가 0 출력 → 모든 D-FF의 D에 0 인가
▶ shift_3 = 1인 경우 (0010)
① 아래 3번째 D-FF의 set=1, rst=0 인가 → clk 상관없이 Q(out<1>)=1, Q_b(out1_b)=0
② Q(out<1>)=1이므로 2번째 D-FF의 clk가 High가 되어 D에 대기하고 있는 0이 Q(out<2>)로 출력
③ out3_b=0, out2_b=1, out1_b=0이므로 Vref가 연결되어 Capacitor에 (800fF+200fF)/1600fF만큼 충전 후, Vin과 비교
④ 0.5625V보다 Vin이 더 크므로 비교기가 1 출력 → 모든 D-FF의 D에 1 인가
▶ shift_4 = 1인 경우 (0001)
① 아래 4번째 D-FF의 set=1, rst=0 인가 → clk 상관없이 Q(out<0>)=1, Q_b(out0_b)=0
② Q(out<0>)=1이므로 3번째 D-FF의 clk가 High가 되어 D에 대기하고 있는 1이 Q(out<1>)로 출력
③ out3_b=0, out2_b=1, out1_b=0, out0_b=0이므로 Vref가 연결되어 Capacitor에 (800fF+200fF+100fF)/1600fF만큼 충전 후, Vin과 비교
④ 0.61875V보다 Vin이 더 크므로 비교기가 0 출력 → 모든 D-FF의 D에 0 인가
▶ shift_end = 1인 경우 (0000)
① 아래 5번째 D-FF의 set=1, rst=0 인가 → clk 상관없이 Q=1, Q_b=0
② Q=1이므로 4번째 D-FF의 clk가 High가 되어 D에 대기하고 있는 0이 Q(out<0>)로 출력
∴ 최종 출력 = 1010
3. Schematic
노란색 사각형 : clk가 Low일 때 D 입력을 반전시켜 D_b 출력(그 뒤 Inverter가 다시 반전)
연보라 사각형 : ① rst_b=1, clk=1 ② rst_b=1, clk=0 ③ rst_b=0, clk=1 ④ rst_b=0, clk=0
① 초록색 사각형의 출력을 통해 반전된 신호가 다시 반전되어 초록색 사각형 Gate로 연결(피드백을 통한 데이터 유지)
② 노란색 사각형을 통해 새로운 데이터 받을 준비(데이터 샘플링)
③ 초록색 사각형 Gate에 1을 연결하여 Inverter 출력으로 항상 0을 출력(D=Q=0)
④ 노란색 사각형을 통해 새로운 데이터 받을 준비(데이터 샘플링)
하늘색 사각형 : clk가 High일 때 왼쪽에 대기하던 값을 빨간색 사각형으로 전달
빨간색 사각형 : ① rst_b=1, clk=1 ② rst_b=1, clk=0 ③ rst_b=0, clk=1 ④ rst_b=0, clk=0
① 하늘색 사각형을 통해 전달된 신호가 반전되어 Q_b 출력, 이후 Inverter를 통해 Q 출력
② 하늘색 사각형과 연결이 끊어지고, 피드백을 통해 이전에 전달된 신호가 유지되도록 함
③ Q_b를 항상 1로 설정(∴ 항상 Q=0 ∵ Inverter)
④ Q_b를 항상 1로 설정(∴ 항상 Q=0 ∵ Inverter)
회색 사각형 : set이 High일 때 값을 접지로 흘려보내 Q_b를 항상 0으로 설정(∴ 항상 Q=1 ∵ Inverter)
비교기가 동작하지 않는 Low SA_EN 신호에 pMOS를 켜서 vdd 상태로 초기화 시켜 내부 노드에 이전 결과가 남아있지 않도록 함
· 노란색 사각형
Vout Node는 다음 단의 회로와 연결 = 배선의 길이↑ & 다음 회로의 Gate Capacitance 추가 = 무거운 상태
→ 가벼운 쪽 Node에 Dummy Capacitor를 연결하여 양쪽 노드의 무게를 비슷하게 맞춤
∴ 미세한 전압 차이도 구분 가능
<SAR ADC>
· (800, 400, 200, 100, 100)fF와 연결된 Tr(Inverter 역할)의 Width를 100n에서 500n로 증가
→ Ron↓ → Capacitor 충·방전 시간 ↓
· 비교기가 동작하기 전 Vin을 Switch on을 통해 Capacitor에 충전
· 비교기 동작 시 Switch off를 통해 Kickback Noise가 입력단에 영향을 주지 않도록 함
4. Setting & Result
<Vin Sample & Hold>
Vin Hold가 0.6V로 일정하지 않음
Vin에 연결된 Capacitor 용량을 100fF에서 1pF로 증가시켜 오류 해결
※ Capacitor의 용량이 크면 Q = CV에 의해 전압 변화량이 작아져 Kickback Noise 억제력↑Comparator의 2 입력(Vin, Vref)을 Gate로 사용하는 nMOS Tr의 Width : 100n → 500n
Comparator의 2 입력(Vin, Vref)을 Gate로 사용하는 nMOS Tr의 Lenth : 30n → 60n
Comparator의 SA_EN 신호를 Gate로 사용하는 nMOS Tr의 Width : 100n → 500n
Comparator의 2 입력(Vin, Vref)을 Gate로 사용하는 nMOS Tr의 Drain : pMOS 연결
Comparator의 Vout 반대편 Node에 Capacitor 연결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import random # 기준 전압 Vref = 0.9 # LSB 크기 LSB = Vref / 16 # 0~0.9 사이 랜덤 Vin 생성 Vin = random.uniform(0, Vref) # 각 비트 weight 정의 weights = [ Vref * (1/2), # MSB Vref * (1/4), # MSB-1 Vref * (1/8), # MSB-2 Vref * (1/16) # LSB ] dac_value = 0 bits = [] # SAR 알고리즘 for w in weights: if Vin >= dac_value + w: bits.append(1) dac_value += w else: bits.append(0) # Upper bound 계산 upper_bound = dac_value + LSB # 결과 출력 binary_code = ''.join(map(str, bits)) print(" <Step Of Vref>") print(" 0000 : ~ 0.05625V") print(" 0001 : ~ 0.11250V") print(" 0010 : ~ 0.16875V") print(" 0011 : ~ 0.22500V") print(" 0100 : ~ 0.28125V") print(" 0101 : ~ 0.33750V") print(" 0110 : ~ 0.39375V") print(" 0111 : ~ 0.45000V") print(" 1000 : ~ 0.50625V") print(" 1001 : ~ 0.56250V") print(" 1010 : ~ 0.61875V") print(" 1011 : ~ 0.67500V") print(" 1100 : ~ 0.73125V") print(" 1101 : ~ 0.78750V") print(" 1110 : ~ 0.84375V") print(" 1111 : ~ 0.90000V\n") print(f"Vin = {Vin:.5f} V") print(f"Upper Bound = {upper_bound:.5f} V") print(f"4-bit SAR output = {binary_code}") | cs |
<검증을 위한 Python 코드>
<Vin=0.32221V → 0101>
<Vin=0.75285V → 1101>
5. Thinking
Comparator
② M0, M3 Tr = On → 양쪽 내부 Node가 모두 High로 충전 & M1, M2 Tr = Off
평가 및 증폭 단계 (SA_EN = 1)
① M0, M3 Tr = Off → 충전 중단
② M8 Tr = On → GND 경로 Open
③ 충전되어 있던 양쪽 Node의 전하가 아래로 빠져나감
④ Vin > Vref → M5 Tr이 M7 Tr보다 전류를 더 많이(빠르게) 흘림
⑤ 이와 연결된 M2 Tr의 Gate 전압이 낮아져 M2 Tr = On → Vdd를 Vout Node에 공급해 전압을 순식간에 다시 끌어 올림
⑥ 반대쪽 Node인 M1 Tr은 계속 Off되어 0V 유지
⑦ 전압 차이를 감지해 0/1로 확 찢어놓음
1) Strong ARM Comparator (회로에서 사용한 비교기)
· Clock 신호(SA_EN)에 의해 동작하는 동적 비교기
▶ Flash ADC에서 사용
· 일반적인 Op-Amp 기반 비교기는 항상 전류를 흘려야 하므로, 수백 개의 비교기를 쓰면 전력 소모↑
→ Strong ARM Latch는 Clock이 칠 때만 잠깐 전류가 흐르고, 비교가 끝나면 전류가 흐르지 않아 전력 효율↑
· 양의 피드백을 이용한 재생성 방식이라 반응 속도↑
▶ SAR ADC에서 사용
· Strong ARM Latch는 대기 상태에서 전력을 전혀 쓰지 않으므로, 전체 ADC의 에너지 효율↑
· 비교 결과가 바로 Digital-Level로 출력되어 추가 증폭 회로 없이 Digital-Logic을 구동할 수 있어 회로가 단순
2) Open-Loop Comparator (Op-Amp 기반 비교기)
· 높은 Gain을 가진 연산 증폭기를 피드백 없이 사용
· Clock 없이 연속 시간으로 동작
· 높은 해상도 : Op-Amp의 Gain이 높을수록 아주 작은 전압 차이도 구별 가능
· Kickback Noise X : Latch 구조가 없으므로 입력단으로 Noise가 튀지 않음
· 느린 속도 : 높은 Gain을 얻으려면 대역폭이 줄어들어 반응 속도↓
· 높은 정적 전력 : 항상 Bias 전류가 흘러야 하므로 전력 소모↑
∴ 속도보다는 정밀도가 중요한 Sigma-Delta ADC 또는 저속 Slope ADC 등에 사용
3) Pre-Amplifier + Latch Comparator (Pre-Amp 기반 Latch)
· 동적 비교기의 치명적인 단점인 Kickback Noise와 입력 Offset을 줄이기 위해 고안된 구조
· 동적 Latch 앞단에 저이득 Pre-Amp를 배치
· Kickback Noise 감소 : Latch에서 발생하는 급격한 전압 변화가 입력단으로 역류하는 것을 Pre-Amp가 막음
· Offset 감소 : Pre-Amp가 입력 신호를 미리 증폭해서 Latch에 넘겨주므로, Latch 자체가 가진 Offset 전압의 영향 감소
· Pre-Amp 추가로 인해 정적 전력 소모가 발생하고, 전체 면적↑
∴ Flash ADC와 같이 비교기 간의 간섭이 치명적인 고속 ADC에서 거의 표준처럼 사용
4) Double-Tail Comparator
· Strong ARM Latch의 진화형으로, 저전압 공정에서 가장 많이 연구되고 사용되는 구조
· 입력단과 Latch단의 Tail 전류원을 분리
· 저전압 동작 : Tr 스택이 줄어들어 낮은 전압에서도 잘 동작
· 속도 최적화 용이 : 입력단과 Latch단의 전류를 따로 조절할 수 있어, 속도와 Power 간의 Trade-Off를 조절하기 쉬움
· Kickback Noise 감소 : Strong ARM보다 입력단과 출력단의 분리도가 좋아 Kickback Noise↓
∴ 초미세 공정을 이용한 고속 SAR ADC 또는 Flash ADC
전압이 높을수록 비교기 내부 Tr가 활짝 열려서, 전하를 더 많이 뱉어냄 → Kickback Noise 증가
댓글
댓글 쓰기