개요 (Introduction)
논리설계에서는 소프트웨어 디자인과는 달리 물리적인 하드웨어를 설계하는 것에 초점을 둔다.
그러기 위해 기본적인 회로들을 학습한 후 이를 조합하여 복잡한 회로를 설계하는 방법을 배운다.
또, HDL을 활용하여 이러한 회로를 설계하는 방법도 배울 예정이다.
그럼 논리설계가 어디에 쓰일까?
→ CPU, USB, 모니터, 키보드, 스마트폰, 등등 모든 전자기기의 기본이 되는 하드웨어를 설계하는 데 사용
세계의 프로세서 / 컨트롤러의 수요를 보면 단순히 desktop cpu 외에도 8bit, 4bit 프로세서가 월등히 많이 쓰이는 것을 확인할 수 있다.
그러한 cpu들은 각각의 용도에 맞게 사용될 것이다.
즉, 용도에 맞게 하드웨어를 설계하는 것 또한 중요함을 알 수 있다.
자, 이제 논리설계의 기본인 gate와 그 구현을 배우고자 한다.
CMOS 회로
CMOS(Complementary Metal-Oxide-Semiconductor) 회로는 전력 소모가 적고 빠른 속도를 가지는 회로이다.
그리고 총 세개의 단자로 구성되어 있다: Source, Drain, Gate.
MOS의 물리적 구현 및 동작원리까지 설명하면 좋겠지만, 여기서는 회로를 만드는 사용자 입장에서만 다루고자 한다.
MOS의 Source로 들어온 입력 신호는 Gate의 입력 신호에 따라 Drain으로 전달되거나 전달되지 않는 성질이 있다.
바로 이 성질을 활용하여 이산수학이나 컴퓨팅의 기초에서 배운 논리게이트를 구현할 수 있는 것이다!
n-channel MOS
위 그림은 n-channel MOS의 구조이다.
n-channel MOS는 주로 Source가 low일 때 사용되며 Gate가 high일 때 Drain으로 전달 된다.
따라서 통상적으로 회로를 구성하게 되면 Gate가 high일 때 Drain이 low가 되는 것이다.
note
Gate가 low일 경우에는 Drain으로 전달되지 않는다. 예를 들어 주어진 회로에서 n-channel의 Gate가 low일 경우 Drain은 어느 단자에도 연결되어 있지 않은 것과 동일한 상태인 것이다.
p-channel MOS
위 그림은 p-channel MOS의 구조이다.
p-channel MOS는 주로 Source가 high일 때 사용되며 Gate가 low일 때 Drain으로 전달 된다.
따라서 통상적으로 회로를 구성하게 되면 Gate가 low일 때 Drain이 high가 되는 것이다.
note
앞으로 CMOS를 이용해서 회로를 설계할시 n-channel과 p-channel을 적절히 조합하여 사용하게 된다.
n-channel을 이용하여 output이 low인 회로를 구성하고 반대로 p-channel을 이용하여 output이 high인 회로를 구성하게 된다.
이 과정에서 헷갈리기 쉬우니 주의하자.
간단한 논리게이트
위 내용을 바탕으로 간단한 논리 게이트를 살펴보자.
그림에서 $V_{DD}$는 전원을 의미하며, $V_{SS}$는 접지를 의미한다. 예를 들어 $V_{DD}$가 5V이고 $V_{SS}$가 0V라면, $V_{DD}$는 high, $V_{SS}$는 low를 의미한다.
만약 A에서 high가 입력되었다고 가정하자.
그렇다면 n-channel쪽의 회로를 보면 Gate에 high가 입력된 것이므로 Drain은 low가 된다.
반대로 p-channel쪽의 회로를 보면 Gate에 high가 입력된 것이므로 Drain에 출력되는 값은 없다.
만약 A에서 low가 입력되었다고 가정하자.
그렇다면 n-channel쪽의 회로를 보면 Gate에 low가 입력된 것이므로 Drain에 출력되는 값은 없다.
반대로 p-channel쪽의 회로를 보면 Gate에 low가 입력된 것이므로 Drain은 high가 된다.
위 내용을 조합하면 주어진 회로는 NOT 게이트를 구현한 것임을 알 수 있다.
그렇다면 아래 회로는 어떤 논리게이트일까?
정답은 NAND 게이트이다. 확인은 스스로 해보자!
A | B | Out |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
회로 - combinational vs sequential
회로는 크게 두 가지로 나뉜다: combinational과 sequential이다. 이미 컴퓨터 구조에서도 다룬바 있듯이 두 회로의 가장 큰 차이점은 state라 할 수 있다. Combinational circuit은 입력값에만 의존하지만, Sequential circuit은 입력값 뿐만 아니라 이전의 입력값들에도 의존한다.
실질적인 구현과정에서는 레지스터와 클락이 관여하느냐로도 설명을 할 수 있지만, 그 부분들은 나중에 다루기로 하고 이 정도로 이해한 뒤 각각의 회로의 설계에 집중하자.
example - Calender System
입력값(month)에 따라 해당 달의 날의 수를 출력하는 회로를 만든다고 가정하자. 회로를 소프트웨어로 구현한다고 했을 때 psuedo code는 아래와 같을 것이다.
int number_of_days(int month, int leap_year_flag){
switch (month){
case 1: return 31;
case 2: return leap_year_flag ? 29 : 28;
case 3: return 31;
case 4: return 30;
case 5: return 31;
case 6: return 30;
case 7: return 31;
case 8: return 31;
case 9: return 30;
case 10: return 31;
case 11: return 30;
case 12: return 31;
}
}
이를 combinational circuit으로 구현한다면 어떻게 될까?
우선 블록 다이어그램을 그려보자. 어떠한 회로가 있어 입력값을 넣어주면 출력값을 반환한다고 하자.
이렇게 입력값 출력값, 그리고 어떻게 인코딩할지도 정해서 위처럼 그려주면 된다.
(그림에서 output=0은 28일, output=1은 29일, output=2는 30일, output=3은 31일을 의미한다.)
여기서 바로 회로 구현으로 들어갈 수도 있겠지만,,,, 현실적으로 회로가 복잡해지면 한 번에 정확한 회로를 구현하는데에 어려움이 있을 수 있다. 따라서 진리표를 그리며 회로를 구현하는 것이 좋다.
m8 | m4 | m2 | m1 | leap | | | d2 | d1 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | | | - | - |
0 | 0 | 0 | 1 | 0 | | | 1 | 1 |
0 | 0 | 1 | 0 | 0 | | | 0 | 0 |
0 | 0 | 1 | 0 | 1 | | | 0 | 1 |
0 | 0 | 1 | 1 | 0 | | | 1 | 1 |
0 | 1 | 0 | 0 | 0 | | | 1 | 0 |
0 | 1 | 0 | 1 | 0 | | | 1 | 1 |
0 | 1 | 1 | 0 | 0 | | | 1 | 0 |
0 | 1 | 0 | 1 | 0 | | | 1 | 1 |
0 | 1 | 1 | 0 | 0 | | | 1 | 0 |
0 | 1 | 1 | 1 | 0 | | | 1 | 1 |
1 | 0 | 0 | 0 | 0 | | | 1 | 1 |
1 | 0 | 0 | 1 | 0 | | | 1 | 0 |
1 | 0 | 1 | 0 | 0 | | | 1 | 1 |
1 | 0 | 1 | 1 | 0 | | | 1 | 0 |
1 | 1 | 0 | 0 | 0 | | | 1 | 1 |
1 | 1 | 0 | 1 | 0 | | | - | - |
... | ... | ... | ... | ... | | | ... | ... |
이렇게 진리표를 그렸다. 자, 그렇다면 이제 회로를 구현하기 위해 진리표를 회로로 바꿀 준비를 하자.
$d_1 = (m_1 \cdot \overline{m_2} \cdot \overline{m_4} \cdot \overline{m_8} \cdot \overline{leap}) + (m_1 \cdot m_2 \cdot \overline{m_4} \cdot \overline{m_8} \cdot \overline{leap})+...$
$d_2 = (m_1 \cdot \overline{m_2} \cdot \overline{m_4} \cdot \overline{m_8} \cdot \overline{leap} )+ ...$
note: $\cdot$는 AND, $\overline{m}$은 NOT, $+$는 OR를 의미한다.
이후에는 위 식을 정리한 후 회로로 구현하면 된다. 만약 바로 정리된 식을 찾을 수 있다면 그렇게 해도 되지만, 일반화된 과정을 설명했다.
위 예제에서 한 행동들은 정리하면...
combinational circuit을 설계할 때
- 블록 다이어그램을 작성한다.
- 진리표를 그린다.
- 구현한다.
이렇게 정리할 수 있다.
example - Door Lock System
이번에는 sequential circuit에 맞는 예제를 공부해보자. 0-9까지의 숫자패드가 있는 4key 도어락을 구현한다고 하자. 비밀번호는 시스템에 저장되어 있고 입력값은 new
라는 와이어가 1일때 value
라는 와이어를 읽어오는 식으로 시스템이 구성된다고 하자. 이 시스템의 출력값은 open/close 두 가지가 있다.
이를 소프트웨어로 구현한다면 아래와 같을 것이다.
int doorlock(){
int val1 = 0, val2 = 0, val3 = 0;
static int password[3] = {1, 2, 3};
int wrong = 0;
while (!new);
val1 = read();
if (val1 != password[0]) wrong = 1;
while (!new);
val2 = read();
if (val2 != password[1]) wrong = 1;
while (!new);
val3 = read();
if (val3 != password[2]) wrong = 1;
if (wrong) return 0;
else return 1;
}
Combinational circuit의 예제와는 달리 위 예제에서는 이전의 입력값들에도 의존한다. 즉, state가 존재하는 것이고 이를 감안하여 sequential circuit을 설계해야 한다.
이를 위해 state 다이어그램을 그려보자.
(아래 그림은 state diagram보다는 FSM에 가깝다. state diagram을 그릴 때에는 더 단순화 시켜서 그리면 되고 data/control part를 딱 나눠서 그릴 필요는 없다.)
state diagram을 그렸다면 이것을 data path와 control path로 나누어야 한다.
data path
비교나 저장, 연산 등을 담당한다.
control path
- fsm의 제어부에 해당
- data path를 제어
- clock과 함께 동작
이를 위해 finite state machine(FSM)을 사용한다. finite state machine은 상태와 상태간의 전이를 나타내는 그래프이다. 이를 통해 어떤 상태에서 어떤 상태로 전이되는지를 알 수 있다.
state diagram으로 쓴 그림은 현재 control과 data path가 나눠져 있어 4key 도어락의 FSM으로도 볼 수 있다. 이를 바탕으로 state table을 작성하면 아래와 같다.
reset | new | equal | state | next state | mux | open/closed |
---|---|---|---|---|---|---|
1 | - | - | - | S1 | C1 | closed |
0 | 0 | - | S1 | S1 | C1 | closed |
0 | 1 | 0 | S1 | ERR | - | closed |
0 | 1 | 1 | S1 | S2 | C2 | closed |
0 | 0 | - | S2 | S2 | C2 | closed |
0 | 1 | 0 | S2 | ERR | - | closed |
0 | 1 | 1 | S2 | S3 | C3 | closed |
0 | 0 | - | S3 | S3 | C3 | closed |
0 | 1 | 0 | S3 | ERR | - | closed |
0 | 1 | 1 | S3 | OPEN | - | open |
0 | - | - | OPEN | OPEN | - | open |
0 | - | - | ERR | ERR | - | closed |
실제 회로에서는 state가 모두 bit로 구현되어야 하므로 적당한 인코딩이 필요하다.
state가 5개이므로 3bit로 인코딩하면 되고, mux는 3개이므로 2bit로 인코딩하면 된다.
예를 들어 S1은 000, S2는 001, S3은 010, OPEN은 011, ERR은 100으로 인코딩할 수 있다. 이렇게 인코딩을 하면 state table을 truth table처럼 작성할 수 있다.
이제 state table을 바탕으로 회로를 구현하면 된다.
위처럼 회로를 설계하고 encoded state table에 맞추어 세부적인 회로를 완성하면 된다.
위 예제에서 한 행동들은 정리하면,
sequential circuit을 설계할 때
- 블록 다이어그램을 그린다.
- state 다이어그램을 그린다.
- 구조를 데이터파트와 제어파트로 나눈다.
- 제어파트를 위해 FSM을 작성한다.
- 구현한다.
'컴퓨터 > 논리설계' 카테고리의 다른 글
[논리설계] 10강 - CPLD와 FPGA (0) | 2025.06.08 |
---|---|
[논리설계] 9강 - 순차회로 설계 / Sequential Design Practice (0) | 2025.06.08 |
6강-순차회로 (0) | 2025.05.29 |