디지털 시스템과 수, 문자의 인코딩 방법

2024. 4. 14. 00:46CS/논리설계

728x90

* 본 글은 [Introduction to Logic Design, 3rd ed. - Alan B. Marcovitz] 를 바탕으로 작성하였습니다.

 

디지털 시스템이란?

디지털 시스템이란, 임의의 불연속적인 입력(A, B, ..)을 받아 임의의 출력(W, X, ...)을 만드는 시스템을 말한다. 입력은 클럭 등 다양한 방식에 의해 이루어진다. 예를 들어, 세 개의 입력 A, B, C를 받아 두 개의 입력이 1일 때만 출력 Z = 1을 출력하는 시스템은 디지털 시스템이다. 이처럼 출력이 입력의 현재 값에만 의존하는 회로를 조합회로(combinational)라고 한다. 반면, 지난 시간의 입력 상태를 알아야 하는 회로를 순차회로(sequential)라고 한다.

 

대표적인 불연속 입력은 이진수로 이루어진다. 예를 들어 0V가 들어오면 0, 5V가 들어오면 1을 나타내는 식이다.

 

수 체계

컴퓨터에서는 일반적으로 2진수 체계를 사용한다. 이산적인 입력을 표현하기 가장 쉬운 진법이기 때문이다. 십진법으로 나타낸 수를 이진법으로 나타내는 방법은 https://testbook.com/maths/decimal-to-binary 여기에 소개되어 있는데, 너무 기본적인 내용이므로 이 블로그에서는 다루지 않으려고 한다. 참고로, python의 int 함수에서는 argument로 "base"를 받는데, 이것을 이진수로 설정해 계산할 수도 있다. 예를 들어, 아래와 같이 입력을 넣을 경우, 101010(2)를 십진법으로 바꾼 42가 출력된다.

print(int('101010', 2))
# 출력: 42

 

컴퓨터 문서에서는, 이진수로 데이터를 나타내면 내용이 너무 방대해지므로, 일반적으로 4개의 비트를 묶어 16진수로 나타낸다. 9 이상의 숫자는 알파벳의 처음 6개 문자를 사용하여 10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F를 사용해 나타낸다. 위에서 언급한 int 함수의 base를 16으로 설정하면 아래와 같다.

print(int('FF', 16))
# 출력: 255

 

이진 덧셈

 

이진수를 받는 디지털 시스템에서 가장 보편적인 연산은 덧셈인데, 이진수의 덧셈은 아래 4가지를 기본으로 한다.

  • 0+0 = 0
  • 0+1 = 1
  • 1+0 = 1
  • 1+1 = 10

마지막 1+1 = 10에서, 앞의 1은 받아올림으로 다음 비트로 올라가는데, 이를 캐리(carry)라고 한다. 즉, 최하위 비트에서의 연산은 두 개의 이진수만 더하면 되는 2-operand 연산이지만, 그 다음 비트부터는 3-operand 연산이 된다. 예를 들어, 1101(2) + 0101(2) = 10010이 되는 것이다. 만약 n비트짜리 워드를 갖는 컴퓨터에서 연산 결과가 n+1비트가 된다면 어떻게 될까? 이를 "오버플로우"가 발생했다고 한다.

 

이때, 받아올림이 된 캐리를 c로 표기하고, 원래 더해야 하는 두 이진수를 a, b로 표기한다면, 각 자릿수의 연산은 아래와 같이 나타낼 수 있다. c_in은 받아올려진 캐리, c_out은 다음 비트로 올라간 캐리이다. 이러한 캐리를 포함한 1비트짜리 계산을하는 회로를 전가산기(full adder)라고 한다.

이러한 전가산기를 조합하면, 여러 비트를 가진 이진수의 합을 계산할 수 있다. 아래는 전가산기 4개를 조합하여 4비트짜리 가산기를 만든 것이다. 최하위 비트에는 캐리가 없으므로, c0 = 0으로 들어간다.

출처: FullChipDesign

부호화 수(signed numbers)

 

컴퓨터는 양수와 음수 연산을 모두 할 수 있는데, 부호는 +, - 두 가지가 있으므로, 한 개의 비트를 부호를 나타내는 것으로 할당하면 된다. 일반적으로 수의 첫 번째 비트가 부호를 나타내며 양수는 0, 음수는 1을 사용한다. 그리고 나머지 비트는 크기를 나타낸다. 예를 들어, 4비트 시스템에서는 아래와 같이 나타낼 수 있다.

+5 = 0101
-5 = 1101
-3 = 1011

 

하지만, 이런 방법으로 부호를 나타내면, 부호가 다른 수의 덧셈 혹은 뺄셈을 할 때 조금 성가신 부분이 생긴다. 예를 들어, (+5)+(-3)의 연산을 한다고 할 때, 먼저 부호를 제외한 절댓값이 어디가 더 큰지 비교해야 하고, 다음으로 큰 수에서 작은 수를 빼어 큰 수의 부호를 붙여야 한다. 이는 가산기, 감산기, 비교기 등을 조합했을 때 비효율성이 커지기 때문에, 실제 컴퓨터에서는 이런 방식으로 부호를 표현하지 않고 2의 보수법(two's complement)을 사용한다.

 

2의 보수법에서는, 양수의 경우 부호 비트가 0임은 변함이 없다. 그러므로 n비트짜리 수에서 저장할 수 있는 가장 큰 수는 2^(n-1) -1이다. 음수를 나타내는 방법이 조금 다른데, -a라는 음수는 2^n - a라는 2진수로 저장된다. 예를 들어, 4비트 연산에서 -5는 16-5 = 11 = 1011(2)로 저장되는 것이다. 읽을 때는 최상위 비트가 음수인 것을 확인하고, 10000(2)에서 다시 빼서 절댓값을 얻으면 되는 것이다.이때 저장할 수 있는 가장 큰 음수는 -2^(n-1)이다.

 

2의 보수법을 많이 쓰는 이유는 덧셈이 무지 간편하기 때문인데, 위에서 설명했던 if 연산이 안 들어가도 되고 그냥 2진 덧셈을 하면 된다. 그리고 최상위 비트에서 발생한 캐리는 버리면 된다. 예를 들어, -5(1011)와 +7(0111)을 더하면 +2(0010)이 된다. 이때, 문제는 합이 n비트에서 저장할 수 있는 가장 큰 수를 넘으면 오버플로우가 발생한다는 점이다. 2진 뺄샘은, 부호에 관계없이 두 번째 오퍼랜드에 2의 보수를 취하고 덧셈을 하면 된다.

 

이진화 십진 코드(BCD)

 

컴퓨터는 2진수로 연산하지만 사람과 컴퓨터의 인터페이스는 10진수로 되어야 하기 때문에, 2진수를 10진수로 바꾸는 것이 중요하다. 예를 들어, 739를 표현한다고 할 때, 7, 3, 9를 각각 생각하여 0111 0011 1001로 나타낼 수 있다. 이를 이진화 십진 코드(BCD)라고 한다. 그러나, BCD에서의 연산은 복잡한 데다, 사용하지 않는 이진수(10~15)가 생겨 비효율적이므로 대규모 시스템에서는 사용하기 어렵다.

 

일반적인 4비트 이진수 표현은 가장 높은 비트에 가중치 8, 그 다음부터 각각 4, 2, 1의 가중치를 붙여 십진수로 바꾸기 때문에, "8421 코드" 라고도 한다. BCD 코드에는 8421 코드 이외에도 5421, 2421, excess 3, 2 of 5 코드 등이 있다. 각 BCD 코드는 마찬가지로 미사용 이진수들이 생긴다.

 

ASCII 코드

 

알파벳 문자와 각종 특수문자는 디지털로 나타낼 때 일반적으로 ASCII(American Standard Code for Information Interchange) 코드로 나타낸다. 이는 7비트로 표현되며 아래와 같다. 앞자리가 00인 경우는 문자를 나타내기 위한 것이 아니라 제어신호를 위한 것이다.

Gray 코드

 

그레이 코드(Gray code)는 연속한 두 수 사이에 오직 한 비트만 차이가 나도록 설계된 코드이다. 이는 연속적인 디바이스의 위치를 코딩할 때, 하나의 비트만 바꾸면 되므로 유용하다. 

반응형

'CS > 논리설계' 카테고리의 다른 글

스위칭 대수와 게이트 회로(NAND, NOR, XOR)  (0) 2024.04.14
조합회로 시스템 설계 과정  (0) 2024.04.14