[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 해상도를 구현하려면 2- 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 1011= 1110
D= E+ E+ E+ E+ E+ E11 + E13 + E15 = 1
D= E+ E+ E+ E+ E10 + E11 + E14 + E15 = 1
D= E+ E+ E+ E+ E12 + E13 + E14 + E15 = 0
D= E+ E+ E10 + E11 + E12 + E13 + E14 + E15 = 1

3. Schematic

<Comparator(nMOS)>

<Flash ADC>
MSB에 해당하는 NAND는 vdd와 연결

<Inverter>                                                                                    <NOR>

<OR>

<OR 8-Input>

4. Setting & Result

Linear 증가 결과 확인
Vref가 일정하지 않아 전압 비교 시 오류 발생 가능

특정한 값(0.45V)을 기준으로 결과 확인
0.45V → E= 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 → 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

<D-FF>
주황색 사각형 : clk_int 신호가 들어오면 반전 신호인 clk_b, 같은 신호인 clk를 생성
초록색 사각형 : Inverter 역할
노란색 사각형 : 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)

<Comparator>
· 하늘색 사각형
비교기가 동작하지 않는 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

<sp 파일>

<Vin Sample & Hold>
Vin Hold가 0.6V로 일정하지 않음
Vin에 연결된 Capacitor 용량을 100fF에서 1pF로 증가시켜 오류 해결
※ Capacitor의 용량이 크면 Q = CV에 의해 전압 변화량이 작아져 Kickback Noise 억제력↑

<Shift with Vin Sample & Hold>
Vin hold가 0.6V로 일정하며, shift가 정상적으로 작동

<Output with Shift>
1010이 아닌 1011로 출력
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 연결

<Vin=0.6V → 1010>

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

Reset 및 Pre-Charge 단계 (SA_EN = 0)
① M8 Tr = Off → GND 경로 차단
② 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 증가

댓글

이 블로그의 인기 게시물

[Mini-NPU RTL] NN Reference Model

[Mini-NPU RTL] TPU (Study Paper)