[OJT 2] Digital 논리 회로


1. 논리 회로의 TR 표현

 1) NAND

 2) NOR

 3) Compound Gates

 4) AND / OR

2. Karnaugh Map

3. Combinational / Sequential Logic

 1) 조합 회로(Combinational Logic)

 2) 순차 회로(Sequential Logic)

        Asynchronous Circuit

        Synchronous Circuit

        FSM

4. Flip-Flop / Latch

 1) Latch

 2) Flip-Flop


1. 논리 회로의 TR 표현

학부에서 ‘디지털논리회로’를 수강했다면, 우리는 이진법을 시작으로 AND, OR 게이트는 물론이고, Sum Of Product, Product Of Sum / Mux, Demux / Combi & Sequential Logic 등을 학습했을 것이다.

그 중 Gate 회로를 그리면서 딜레이를 계산하는 일도 적잖이 있었는데 그 때 교수님은 “현업에 가게 된다면, AND와 OR Gate 보다는 NAND와 NOR Gate 위주로 설계를 하게 된다.” 라는 한 마디를 하셨다. 당시에는 그냥 ‘해당 게이트의 면적이 커지니까’라는 말로 대수롭지 않게 넘어왔지만, 4학년이 됐을 때 ‘디지털VLSI’를 배우며 이미 그 중요성을 알아버리긴 했다.

이번 챕터에서는 CMOS로 논리 게이트(Logic Gate)를 설계 하면서 어떻게 해당 게이트를 만들 수 있는지 작성해보고자 한다.

 

이전 챕터에서 잠시 CMOS를 다뤘는데, Complementary 단어에 주의를 할 필요가 있을 것 같다.

무슨 말이냐 하면, 서로 상호보완 되는 성질을 지니고 있기 때문에, NMOS가 On이 되면 PMOS는 Off가 되어야 하는 것을 의미한다. 이 사실에 근거해서 우리는 인버터를 설계할 수 있었다.

이 성질을 갖고 더 설명하자면 다음과 같은 법칙이 적용된다.

<Rule of Conduction Complements>

) Pull-Up Network는 Pull-Down Network의 상호보완적 성격을 가진다.

→ 즉, 두 네트워크가 동시에 작용되는 상태는 없다는 것이다.

) 한 Network가 Parallel(병렬)로 이뤄져 있다면, 다른 Network는 반드시 Series(직렬)로 이뤄져 하는 것을 말하며, 역 또한 마찬가지다.

이 두 법칙을 갖고 로직 게이트를 설계하게 될 것이고, 이 법칙은 알게 모르게 적용이 될 것이기 때문에 암기할 부분은 아니다.

이 챕터에서 다루는 내용은 ‘CMOS VLSI Design’책을 따르며, 구글에서 검색하면 바로 나오니 이를 보면서 적용해보면 된다.

 

1) NAND

서두에서 밝혔듯이, AND와 OR 게이트를 사용하는 것이 아닌 첫 로직 설계는 NAND이다. 어차피 우리는 인버터 회로도를 알고 있기 때문에, NAND와 NOR에 각각 인버터를 하나 달아주면 AND와 OR가 된다.

사실상 이것이 핵심으로써, 우리가 AND와 OR을 사용하지 않는 이유는 인버터가 추가되며 CMOS가 하나 늘어나기 때문에 회로 면적이 커지는 것을 의미한다.

회로 면적이 증가한다. → 설계 비용이 증가한다. 에 직결하기 때문에, 우리는 최적화에 미쳐버린 엔지니어로서 항상 효율적인 설계를 택해야 한다.

A B Y
0 0 1
0 1 1
1 0 1
1 1 0

 

위는 NAND 게이트의 진리표(Truth Table)이다.

두 인풋이 1이 됐을 때에만, 아웃풋은 0이 된다. → NMOS는 직렬(Series)로 연결되어야 한다.

두 인풋 중 하나만 0이어도, 아웃풋은 1이 된다. → PMOS는 병렬(Parallel)로 연결되어야 한다.

우리는 진리표를 통해 위에서 밝혔던 법칙이 적용됨을 알 수 있다.

회로의 형태를 보면 인버터 두 개로 만들어졌다는 것도 확인할 수 있다.

그렇기 때문에, 이전 챕터에서 인버터를 먼저 설명했던 이유가 되기도 한다.

한 네트워크에 대해서 직/병렬 상태가 정해지면 나머지 네트워크는 반대 상태가 결정된다.

NAND에만 적용이 되는 것이 아니냐고 의심을 할 수 있기에, 바로 NOR에도 적용해보면 다음과 같다.

 

2) NOR

A B Y
0 0 1
0 1 0
1 0 0
1 1 0

 

 

진리표를 해석하면 다음과 같다.

두 인풋 중 1이 하나만 들어와도 아웃풋은 0이 된다. → NMOS는 병렬로 연결된다.

PMOS에 대한 해석없이 법칙에 의해 직렬로 연결된다.

3) Compound Gates

왜 AND / OR 게이트를 작성하지 않고, Compound Gate라는 이상한 소제목으로 넘어갔는지에 대한 생각은 잠시 접어둔다.

해당 개념을 알고 있어야, AND와 OR을 만드는 데에 좀 더 자명한 생각을 가질 수 있다고 파악한다.

‘CMOS VLSI Design’에서 챕터 1의 17 페이지를 보면 해당 제목이 보일 것이다.

 📌 Compound Gates can do any inverting function

 

예시는 본문에 있는 두 논리식을 사용하고, 추가적으로 만들어서 예시를 들어볼 것이다.

우선, 다음의 식이다.

해당 표현식에서 Bar를 제외하고 식을 본다.

그렇게 되면 A와 B, C와 D가 AND로 묶여있고 이 두 결과가 OR로 묶이는 것을 알 수 있다.

먼저 우린 NMOS에 대해서 판단을 해본다. NMOS의 AND에 대해서는 Series로, OR에 대해서는 Parallel로 묶임을 우리는 아까 NAND와 NOR로 연습을 했다.

그렇기에 NMOS에 대해서는 다음과 같은 회로가 그려진다.

위 NMOS에 대해 해석하면 A와 B, C와 D를 직렬로 묶고 이 결과를 병렬로 묶은 것이다.

여기서 끝나는 것이 아니라 PMOS에 대해서도 만들면 된다. 계산을 통해 만들 수 있지만, 지금 인풋이 4개다.

진리표 경우의 수가 16개가 나오는데… 이걸 굳이 해야 할까?

법칙이라는 것은 어디에나 적용이 되는 것인데…이를 안 쓰면 바보다.

NMOS에 적용된 것을 PMOS에서는 반대로 적용하면 된다. 병렬은 직렬로, 직렬은 병렬로.

그리고 이에 대한 아웃풋을 연결해주면 우리가 원하는 CMOS 설계가 만들어진 것이고, 논리 게이트가 만들어진 것이다.

최종 Transistor 구조
트랜지스터로 구현한 논리 게이트

 

또 다른 문제의 표현식이다.

단계별로 해나가는 것은 다음과 같다.

  1. Bar를 제거하고 생각한다.
  2. NMOS에 대해 AND는 Series, OR는 Parallel 상기.
  3. PMOS는 이에 대해 반대로 설계

이제 우리는 생각해야 하는 시간이 많은 것이 아니라, 그리는 시간이 많아졌다.

 

마지막 문제는 다음과 같다.

“어? Bar가 없는데요?”가 아니라, 양변에 Bar를 씌우는 것이다.

이제 여기서부터가, AND와 OR에 대한 설계를 자명하게 해주는 장치이다.

Bar를 씌우면 다음과 같이 나오게 된다.

우리가 해야하는 것은 위 문제들과 다르지 않다.

  1. Bar 제거하고 생각한다.
  2. NMOS에 대해 AND는 Series, OR는 Parallel.
  3. PMOS는 이에 대해 반대로 설계
  4. “그런데 좌변이 다른데?”

맞다. 그대로 여기서 끝내버리면 결과는 반대가 되어버린다.

반대가 되어버린다.

반대?

“아, Inverter를 씌워주면 되는구나.” 의 개념이 여기서 등장하는 것이다.

그래서 회로를 그리면 다음과 같이 나온다.

F Bar에 대한 결과를 인버터로 뒤집어주면 우리가 원하던 F를 얻을 수 있다.

Compound Gates라는 것이 처음 적용할 때는 잘 안 되는 부분이 있는데, 여기까지 직접 그려보면서 3단계만 적용할 수 있으면 다 된다.

 

4) AND / OR

위에서 Compound Gates를 설계한 후에, AND와 OR Gate 설계하려고 하면 좀 우스워진다.

NAND와 NOR Gate에 인버터를 달아주기만 하면 되고, 왜 달아주는지에 대해서 원리를 이해했기 때문에, 설명과 회로는 생략한다.


2. Karnaugh Map

아무리 어려운 논리식이어도 우리는 학부에서 Karnaugh Map(일명 K-Map)을 그리면 이를 보고 기존 논리식을 간소화하여 게이트를 연결할 수 있었다.

대부분 4개의 변수까지 K-map을 사용하며 그 이상부터는 힘들다. 하려고 하지 말자.

합의 곱인 POS와 곱의 합인 SOP을 만드는 것과, 최소항 Minterm, 최대항 Maxterm을 만들 줄 알면, K-Map을 만들고 나서 0으로 묶을지 1로 묶을지 판단한 다음 회로를 그리면 되기 때문에, 이 네 가지에 대한 개념을 알고 있으면 된다.

SOP(곱의 합) : 1st stage는 AND로 구성, 2nd stage는 OR로 구성된 논리식

POS(합의 곱) : 1st stage는 OR로 구성, 2nd stage는 AND로 구성된 논리식

Minterm(최소항) : 인풋을 모두 포함하는 AND 표현식으로, 인풋이 0이면 Bar를, 1이면 그대로 사용한 후에 AND로 해당 논리항을 모두 결합.

Maxterm(최대항) : 인풋을 모두 포함하는 OR 표현식으로, 인풋이 0이면 그대로, 1이면 Bar를 사용하여 OR로 해당 논리항을 모두 결합.

 

※ K-Map 파트는 워낙 방대하기도 하고, 학부에서 배우는 것이 더 자세하기 때문에, OJT 카테고리 보다는 이전에 제가 만들었던 카테고리에 따로 K-Map에 관련해서 여러 포스팅을 할 예정입니다. 한 학기 동안 A4로 대략 200페이지 정도로, 1년에 400페이지 정도를 만들었던 걸로 기억하는데, 이걸 여기에 부으려면 시간이 너무 부족해요 ㅠㅠ...


3. Combinational / Sequential Logic

두 회로를 간단하게 설명하면 다음과 같다.

Combinational Logic(조합회로) : 아웃풋을 만들어내는데 있어 인풋에 의해서만 만들어진다.

Sequential Logic(순차회로) : 아웃풋을 만들어내는데 있어 현재 인풋 뿐만 아니라 과거의 아웃풋과 조합되어 만들어진다.

현재 인풋에 의해서만 결정이 되는 조합 회로는 어떠한 디지털 회로를 만들어내는데 적합한가.

이전 값은 영향을 주지 못하기 때문에, 다음과 같은 회로와 게이트를 만들어 낼 수 있다.

→ 에더, 인코더, 디코더, 먹스, 디먹스 / AND, OR와 같은 논리 게이트

그렇다면 순차 회로는 무엇을 만드는데 적합한가. 과거의 아웃풋이 영향을 미치는 것이기 때문에, 데이터 정보를 전송하는 회로에서 주로 사용한다. ‘디지털 디자인’ 교재에 따르면 이를  “저장 회로의 상태는 이전 입력의 함수이므로 순차 회로의 출력은 현재 입력은 물론 이전 입력의 함수이다.” 라고 하나, 과거 아웃풋에 영향을 받는다 정도로 기억하고 있으면 될 것이다.

그렇기 때문에 이 순차 회로에서 사용하게 되는 구조는 래치와 제일 많이 사용하게 되는 플립 플롭(Flip-Flop)이다.

1) 조합 회로(Combinational Logic)

분석하는데 있어 첫 단계는 보고 있는 회로가 과연 ‘조합 회로인가, 순차 회로인가’를 판단하는 것이다. 과거 아웃풋에 영향을 받지 않는 조합 회로로서는 피드백 연결저장 회로가 없어야 한다.

설계 과정

  1. 회로의 설계 스펙에서 필요한 입출력의 개수를 구한다.
  2. 입출력 사이의 요구되는 관계를 정의한다. (진리표 / K-Map 등)
  3. 논리 회로를 그리고 설계를 검증한다.

2) 순차 회로(Sequential Logic)

피드백 패스(Feedback Path)를 형성하고 이를 통해 저장 요소는 정보를 저장할 수 있게 된다. 따라서 디지털 회로의 저장 요소는 입력에 의해 상태가 변하기 전까지 이전 상태를 유지할 수 있다. 임의의 주어진 시간에 저장되어 있는 정보는 그 시간에서의 상태를 말하는 것으로 흔히 이 상태를 state라고 일컫는다. 순차 회로는 타이밍에 따라 크게 두 유형으로 분류가 되는데 Synchronous 순차 회로와 Asynchronous 순차 회로이다.

Asynchronous Circuit

비동기 회로는 입력 신호에 따라 달라지며 이 회로에 쓰이는 저장 요소는 시간 지연 장치다. 신호가 소자를 통과하는 데 걸리는 시간에 따라 저장 장치가 변하는데, 왜 딜레이를 위한 버퍼 같은 소자를 사용하지 않냐면, 이 장치 내부에 Propagation Delay가 있기 때문이다.

“입력 신호에 따라 달라지면 이건 조합 회로 아냐? 왜 순차 회로라고 하는건데?”가 아니라, 이 시간에 의한 전파 지연이 필요한 저장 공간을 제공하기 때문에 순차 회로라고 보는 것이 타당하다.

Synchronous Circuit

동기 회로는 이산 시점, 그러니까 어떠한 펄스가 입력되고 그 펄스가 유지되는 순간 동안의 입력 신호에 따라 동작을 정의한다. 보통 이 펄스를 만들기 위해 설계자는 클락 제너레이터(Clock Generator)를 사용하고, 이를 사용해 클락 펄스를 주기적으로 생성한다. 이 펄스가 생성되면 설계자는 요구에 따라 치솟는 순간에서 유지되는 순간까지를 사용할 것인지, 떨어진 순간에서 유지되는 순간까지를 사용할 것인지를 결정한다.

FSM

유한 상태 머신(Finite State Machine)의 준말로, State Transition System을 모델링하기 위한 방법이다. 상태 천이 시스템에서 알 수 있듯이, 순차 회로의 모델링을 위한 기법이며 무어(Moore) 모델과 밀리(Mealy) 모델로 나뉜다.

무어 모델은 F/F의 현재 State만으로 아웃풋이 결정되는 머신이고, 밀리 모델은 현재 State 뿐만이 아니라 외부 인풋고 조합되어 아웃풋을 만들어내는 머신입니다. 따라서 현재 상태만을 고려하는 무어 모델이 비교적 빠르며, 밀리 모델은 현재 상태와 인풋(Ext Input)을 확인하기 때문에 출력은 다음 State에 나오게 됩니다.

무어 모델의 상태도에서 입력 값은 방향선에 표시되고, 출력 값은 원 안에 현재 상태와 함께 표시된다.

밀리 모델의 상태도는 State 사이를 연결하는 방향선에 사선으로 구분된 인풋과 아웃풋 둘 다를 나타낸다.


4. Flip-Flop / Latch

두 로직은 기본적으로 데이터 저장을 위한 로직임을 알아둘 필요가 있다. 또한, 본인이 RTL과 같은 디지털 설계 직무에 관심이 있고, 면접을 준비한다고 하면, 위 Combi / Sequential과 더불어 반드시 알아야 할 개념이다. 그만큼 해당 로직을 많이 사용하기 때문이다.

1) Latch

일반적인 설명은 다음과 같다.

래치는 인풋이 들어올 때 State가 정해진다. 따라서, 그 인풋에 의해 상태가 정해지는 것으로 우리는 레벨 트리거(Level Trigger)라고 부른다. 주로 비동기 회로(Async)를 설계할 때 사용한다.

비동기이기 때문에, Clock 인풋을 가지지 않는다. 따라서 명령에 대한 동시 수행이 가능하며, Sync 회로보다 속도가 빠른 장점이 있다.

 

2) Flip-Flop

플립플롭은 클락의 라이징 엣지와 폴링 엣지 순간에 들어온 입력에 따라 State가 정해진다. 따라서 그 펄스 순간에 값이 정해지는 것으로 우리는 엣지 트리거(Edge Trigger)라고 한다.

D 플립 플롭은 래치 두 개로 설계가 가능하다.

 

래치는 Async 회로이기 때문에 속도가 빠르다는 장점을 갖고 있다고 했다. 그럼에도 불구하고, 디지털 디자인에서는 래치보다 플립플롭을 선호한다. 클락을 사용하기 때문에 원하는 타이밍에 데이터를 전달할 수가 있기 때문에 안정성을 보장한다. 아무리 속도가 빠르다고 해도 데이터 저장에 있어 안정성이 없는 것은 크나큰 약점을 갖는 것이다.

“약점으로는 무엇이 있길래?” 라고 물어보면 레이스 컨디션(Race Condition)이 제일 직결되는 약점이라고 답할 수 있어야 한다. 개발자가 제어할 수 없는 부분이 존재해 출력이 불확실해진다는 것이다. 이는 명령에 대한 수행을 동시에 하기 때문에, 순서를 자기 멋대로 정해서 결과를 내놓게 되는 것을 의미한다.

Sync 회로인 Flip-Flop은 클락을 사용하기 때문에 하드웨어를 제어하기 매우 안정적이다는 것이지만, 여전히 단점이 있다. 클락은 계속해서 동작해야 하고 이를 계속해서 들어오는지 체크를 해야한다는 것인데, 이는 칩에서 대략 절반 정도의 전력 소모를 만들어낸다.

“그러면 그냥 Async에서 Race Condition이 일어나는 부분은 명령에 대해 Delay를 줘서 해결하면 되는 것 아닌가?”라고 한다면, 간단한 회로에서는 그럴 수 있겠지… 그런데 점점 복잡해짐에 따라 Race Condition과 같은 상황을 찾기 위해 검증 시간이 길어지고, 시간 손해가 장난 아니게 될 것이다. 그리고 딜레이를 그렇게 주다 보면 코딩도 길어지겠지.

그럼에도 불구하고, Sync 회로를 쓰는 것이 개발자에게, 사용자에게 있어 매우 안정적인 회로인 것이며, 최근에는 클락 게이트를 통제하여 현재 사용하지 않는 회로 부분이 있으면, 그와 관련된 블록에서의 클락 공급을 끊어버리는 ‘Clock Gating’과 같은 기법을 사용해 전력을 최소화하는 방법이 있다.

'SoC 설계 OJT' 카테고리의 다른 글

[OJT 3] Digital Peripheral에 대한 이해  (0) 2024.02.13
[OJT 1] Device Physics 기초  (0) 2024.01.10