마이크로 아키텍처

 

마이크로 아키텍처 혹은 CPU 아키텍처는 CPU 또는 이와 관련된 디지털 신호 처리기의 회로다. 기본적으로 CPU가 처리하는 일이 함수의 읽음 -> 해석 -> 실행 -> 결과기록이었던 것을 생각해보면 이것이 매우 세부적인 수준에서 기술되어있는 것이 마이크로 아키텍처라고 칭할 수 있겠다. 이것은 CPU 제조사 마다 달라지는데, 대중적인 CPU 종류는 다음과 같다


병렬처리

CPU는 그 높은 연산능력을 바탕으로 빠르게 지정된 연산을 수행한 후에 결과를 반환하는 소자이다. 병렬처리는 몇몇 명령어의 구조적인 최적화 등 일련의 방법을 통해서 명령어를 동시에 수행하는 기법이다. 대표적인 병렬처리 방식인 파이프라인 / 슈퍼스칼라를 알아보도록 하자

 

병렬처리 – 파이프라인(Pipeline)

명령어 파이프라인(Instruction Pipeline)은 명령어를 읽어 순차적으로 실행하는 프로세서에 적용되는 기술이다. 다음의 도표를 보자

꽤 직관적인 그림인데, 한 개의 행을 하나의 명령어로 볼 때 그 명령어들을 여러개의 단계로 구분하고 다음 명령어의 처리를 기다린다면 다른 명령어의 다른 단계를 수행하는 방식인 것이다. 위에사진은 명령어를 기반으로 구분되어있는데, CPU 클록 주기에 맞추어 더욱 병렬성을 높인 슈퍼파이프라인 방식도 존재한다.

 

병렬처리 – 슈퍼스칼라(SuperScala)

파이프라인이 그래도 한번에는 같은 스텝의 하나의 명령어를 수행한다면 슈퍼스칼라방식은 애초에 명령어를 처리할 수 있는 스레드를 여러가지 사용하는 방식이다.

다른 기법으로 VLIW(Very Long Instruction Word)가 있다. 동시 실행 가능한 여러 가지의 명령을 하나의 긴 명령으로 재 배열하여 처리하는 방식이다.(명령어의 합성)


파이프라인 해저드

파이프라인 해저드(Hazard)라는 용어가 있다. 병렬처리기법을 사용함에도 불구하고 오히려 속도가 저하되는 현상인데, 의존성이나, 순서등에 의해서 발생하며 데이터 해저드(명령어 의존성으로 발생), 제어 위험(순서에 의한 발생), 구조적위험(자원 동시 접근에 의한 위험) 으로 구분된다.

 

이러한 파이프라인 해저드는 어느정도는 보완할 수 있다. 예를 들면 최근에 발생한 분기의 결과를 토대로(분기 역사표) 다음의 분기를 예측하여 데이터/제어의 해저드를 어느정도 극복하는 방식이 있겠다.


정리

이번시간에는 CPU의 구조를 기술하는 마이크로 아키텍처의 개념과 여러 가지 병렬처리 기법 및 파이프라인의 해저드까지 간단하게 알아보았다.

 

다음시간에는

메모리 계층구조에대해서 알아보자

 

 

CPU(중앙처리장치)는 디지털 시스템에서 모든 연산을 처리하는, 따지면 뇌와 같은 기관이다. 빠른 연산속도를 가지고 명령의 해석이나 연산을 수행하는 기관으로 컴퓨터 논리기관의 핵심적인 소자라고 할 수 있다.

 

임베디드 기사에서는 위와 같은 이유로 CPU의 구조와 세부적인 내용을 시험으로 출제하고 있다. 하나하나 알아보자.


CPU의 개요

Central Process Unit, 중앙처리장치의 풀네임이다. 중앙에서 다 해먹는 중요한 처리장치라고 할 수 있겠다. 현대의 CPU구조는 1970년에 페드리코 페긴이 개발한 구조와 설계에서 기인했다고 한다. 컴퓨터 시스템은 운영 간 수많은 명령어를 처리하는데, 명령어를 기준으로 다음과 같은 기능을 가진다.

  • 인출(Fetch) : 저장공간상에 프로그램카운터(PC, 후술)이 가리키는 명령어를 가져와서 연산공간에 적재한다.
  • 해석(Decode) : 사용자나 시스템에 의해서 지정된 명령어를 해석하고 실행가능한 코드로 변환한다.
  • 실행(Execute) : 해석된 명령어에 따른 연산을 수행한다.
  • 쓰기(Writeback) : 명령어 수행결과를 다시 저장공간(메모리)에 작성한다.

CPU의 구성

CPU는 내부는 다음과 같은 개념도를 가진다.

<위키백과 - CPU - https://ko.wikipedia.org/wiki/%EC%A4%91%EC%95%99_%EC%B2%98%EB%A6%AC_%EC%9E%A5%EC%B9%98 >

위 그림에서 INPUT / OUTPUT과 저장공간(Main Memory)를 제외한 살구색 범위가 CPU의 내부 요소라고 보면 되겠다.

  • 제어부(Control Unit) : CPU와 전체 회로의 동작을 제어하게 되는 부품이다. 입출력장치와의 통신과 데이터처리를 수행한다.
  • 버스(Bus) : 데이터의 통신이 수행되는 모든 데이터의 전송경로를 Bus라고 부른다. 용도와 목적에 따라 입출력 버스 / 내부버스 등으로 구분되는데 CPU내부에 존재하는 버스는 내부버스라고 칭한다.
  • 산술논리장치(ALU;Arithmetic logic Unit) : CPU에서 연산을 전담하는 기관이다.
  • 레지스터 : CPU내부에서 특정한 기능을 수행하는 부품들이다. CPU를 구성하기 위해서 반드시 다음과 같은 레지스터가 필요하다.
    • 프로그램 카운터(Program Counter) : 다음 실행될 명령어의 주소를 가지고 있는 레지스터 이다. 다음 명령어가 인출(Fetch)된 이후에 다음 공간을 가리키기위해서 주소단위로 증가한다.
    • 명령어 레지스터(Instruction Register) ; 가장 마지막으로 실행된 명령어가 저장되어 있다.
    • 누산기(AC) : 연산을 위해서 일시적으로 저장되는 데이터를 가리키는 레지스터이다.
    • 메모리 버퍼 레지스터(MBR; Memory Buffer Register) : 기억장치에서 읽어들어온 데이터가 일시적으로 저장되는 레지스터다.
    • 메모리 주소 레지스터(MAR; Memory Address Register) : PC에 지정된 명령어 주소가 CPU로 넘어가기 전에 일시적으로 저장되는 공간이다.

명령어의 해석 

CPU나 마이크로 프로세서마다 길이와 구조가 달라진다. 실제로는 01의 연속된 임의의 길이로 구성되어있는데, 세상에 이것을 보고 작성할 수 있는 설계자가 어디있으랴, 이를 일정길이단위와 규격으로 기계어를 사람이 적어도 알아볼 수 있게 매핑해 둔 명령어 구조가 어셈블리어(Assembly)어 이다. 이를 통해서 우리는 CPU명령이 어떤 구조로 이루어져있는지를 알 수 있고 이 구소를 명령어 집합 구조(ISA; Instruction Set Architecture)라고 칭한다.

 

이 구조를 알기위해서 반드시 알아야하는 대표적인 CPU의 구조 구분으로 RISCCISC를 알아보겠다.

 

CISC vs RISC

RISC(Reduced Instruction Set Computer)은 지정된 CPU의 명령어 수를 압도적으로 줄여서 개별 명령어의 실행속도를 빠르게 한 컴퓨터 종류를 의미한다. 명령어 파이프라인(동시수행)을 통해 실행속도를 높여 후술될 비교대상군인 CISC의 느린속도 단점을 극복한다. 실제로 사용되는 명령어 개수가 적다는 점에서 착안하였다.

 

CISC(Complex Instruction Set Computer)은 반대로 RISC보다 많고 긴 명령어를 지원하는 컴퓨터 종류이다. 회로도 복잡해지지만 피연산자를 2~3개까지 지정할 수 있어서 일부 명령어는 재인출 없이 명령어 안쪽에서 처리되는 등(피연산자 12의 연산결과를 3에 지정) 직관적으로 변환한다. 요즈음은 실제로는 CISC구조 이더라도 내부적으로 파이프라인(병렬처리)를 다 수행하기 때문에 구분에 큰 의미가 없다는 정보도 뜨문뜨문 보이는거 같다.

 

명령어 지정방식

아무튼 명령어 지정방식에 컴퓨터구조에 따른 차이가 있다는 것을 알았고 본격적인 명령어의 지정방식에는 피연산자의 개수에 따라 0~3 operand가 존재한다.(Ex 1-operand면 피연산자가 1개이다.) 이 피연산자를 지정하는 방식이 여러 가지가 있는데, 다음과 같다.

  • 레지스터(Register) : 레지스터에 저장된 값을 접근할 때 사용한다.
  • 즉치방식(Immediately) : 명령어 자체에서 상수 값을 읽어올 때 지정한다.
  • 직접방식(Direct) : 고정된 주소의 메모리를 접근할 때 지정한다.
  • 레지스터 간접방식(Register Indirect) : 레지스터에 있는 주소의 메모리를 접근할 때 사용한다.
  • 거리방식(Distance) : 레지스터에 있는 주소에 일정 거리를 더한 주소의 메모리를 접근할 때 사용한다.
  • 인덱스방식(Index) : 레지스터에 있는 주소에 다른 레지스터 값에 해당하는 거리를 더한 주소의 메모리를 접근할 때 사용한다.

정리

중앙처리장치(CPU;Central Process unit)은 디지털 시스템의 뇌와 같은 기관으로 명령어의 해석 / 연산등을 담당한다. 내부에는 명령어 수행을 위한 레지스터와 제어부 같은 소자들이 존재한다. 이 명령어는 CPU의 방식(RISC vs CISC)에 따라 명령어의 구조나 길이가 달라진다.

 

다음시간에는

명령어의 병렬처리방식인 슈퍼스칼라방식과 파이프라인등을 알아보고 파이프라인의 해저드 등을 알아보도록 하겠다.

HDL

하드웨어 기술언어(HDL; Hardware Description Language)은 전자회로를 기술하는데 사용하는 컴퓨터언어이다. 즉 임베디드의 소자 제어를 위한 컴퓨터언어라고 할 수 있겠다.(이 무슨... 전자공학과 컴퓨터공학에 가교역할을 하는 혼종이란 말인가..) HDL은 설계(Design)과 기술(Description) 모든 목적으로 사용된다. 프로그램을 사용할 수 있으면 미리 회로를 작성하고 시뮬레이션하여 기댓값을 예측해 볼 수 있다.(비용 효율적!!)

 

FPGA(Field Programmable Gate Array)

FPGAHDL를 통해서 설계가 가능한 반도체 소자이다. 단순한 Gate(AND / NOR / NOT )이나 이를 활용한 조합논리나 순서논리회로를 내부에 포함하고 있고 이를 복제하여 사용자가 원하는 방향으로 커스터마이즈된 설계를 할 수 있다. 일반적으로 HDL의 표준으로 분류되는 VHDLVerilog를 사용한다. 둘다 임베디드 기사의 시험범위이기 때문에 간단하게 알아보자


HDL VHDL(VHSIC HW Description Language)

VHDL의 시작은 미국 국방부였다고 한다. 주문형 집적회로(ASIC)의 문서화를 위해서 사용된 언어였으나 오늘날에는 설계나 검증 등 범용적으로 사용되고 있다고 한다.

 

다음은 VHDL을 활용한 대표적인 코드 형태이다. (AND게이트)

-- (this is a VHDL comment)

-- import std_logic from the IEEE library
library IEEE;

use IEEE.std_logic_1164.all;

-- this is the entity

entity ANDGATE is
port (
I1 : in std_logic;
I2 : in std_logic;
O : out std_logic);
end entity ANDGATE;

-- this is the architecture
architecture RTL of ANDGATE is
begin
O <= I1 and I2;
end architecture RTL;

 

위를 통해서 알 수 있는 것은 주석(--), Library의 사용선언(Library)과 모듈 import(use) 게이트의 선언(entity ~ is ~ end entitiy) 키워드 등이 있는 것을 알 수 있다. 다행이도 직관적인거 같다. 조금 더 자세한 코드를 보면 아래 링크에 자세한 반복문과 제어문, 펄스생성등의 코드등이 존재한다. 읽어보면 직관적이어서 알기 쉽다.

 

VHDL - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 가산기를 표현하는 VHDL 소스. VHDL(VHSIC Hardware Description Language)은 디지털 회로 및 혼합 신호(mixed-signal, 아날로그 신호 포함)를 표현하는 하드웨어 기술 언어이다.

ko.wikipedia.org


HDL Standard – Verilog

무려 IEEE 1364으로 표준화가 되어있다. Verilogc언어와 비슷한 문법을 가지고 있어서 가독성이 높다. ifwhile과 같은 제어 반복문도 C와 동일하며 큰 차이점은 begin ~ end로 대체되는 중괄호 정도가 있겠다. VerilogVHDL보다 시험에서 정교하게 물어본다. 시험범위로 VHDL은 맥락적으로 질의하지만 Verilog는 이용한 논리회로 설계까지 물어보니 간단한 프로그램코드는 읽을 수 있게 하는게 좋을 거 같다.

 

Verilog 수

컴퓨터 상수 표현을 위해서 0x, 0o등을 사용하듯이 Verilog에서도 수를 특정한 방식으로 표현한다. [bit]’[진수][숫자] 순서로 표현되는데, 예시로 8’o4728비트 8진수 472를 의미한다.

 

Verilog에는 시스템 태스크라고 불리우는 특정 상수(일종의 기능포함)가 있다. 보통 테스트를 위해서 사용된다고 하며 대표적인 상수/함수는 다음과 같은 것들이 있다.

  • $display(인자) : 표준출력으로 표현하다. 개행이 포함되어있다.
  • $write(인자) : 표준출력으로 표현하나, 개행이 포함되어있지 않다.
  • $finish, $stop : 시뮬레이션을 종료한다. $stop의 경우 회로가 꺼지는 것은 아니고, 대기 상태가 된다. 반대로 $fisnish는 진짜 회로가 꺼진다.(제어권이 박탈된다.)
  • $time : 현재의 시간이 표현된다.
  • $random : 난수가 출력된다.

 

c와 비슷하다고 해서 필자도 공부를 위해 읽어보았는데, 이게 진짜 C랑 비슷한건지 싶긴했다... 코드로 작성된 것을 여러번 읽어보는게 좋을 거 같다. 사용되는 연산자도 의미가 살짝살짝 다르다. 아래의 Site에서 Verilog읽는 법을 공부할 수 있다.

 

Verilog Tutorial

This complete Verilog beginners tutorial will take you from basic datatypes to building hardware circuits in no time using real simple examples - click now !

www.chipverify.com


정리

이번시간에는 회로를 표현하고 설계할 수 있는 프로그래머블 언어인 HDL에 대하여 알아보았다. HDL에는 대표적으로 VHDLVerilog가 있고 시험을 위해서는 Verilog를 조금 더 구체적으로 알고 있어야 한다.

 

다음시간에는

다음시간에는 CPU대해서 자세하게 알아보는 시간을 가질 것이다. 구조부터 살펴보는 시간이 있겠다.

 

메모리

메모리는 컴퓨터의 정보를 저장하는 임시공간이다. 플립플롭에서 이야기는 안했는데, 플립플롭(1bit 저장회로)는 기본적으로 휘발성(클럭이 멈추면 데이터가 소멸) 그러니까 저장장치는 단순하게 보면 플립플롭의 조합으로 이루어지려면 전기가 끊기면 데이터가 사라지는 숙명을 가지고 있는거라고 볼 수 있겠다.

 

이에 따라 비활성의 데이터저장공간을 확보하는 것은 중요한 숙제였고 우리 이과형님들은 언제나 그렇듯 여러 가지 저장장치(메모리)를 만들면서 해결하였다. 아참 여기서 저장장치가 휘발성이냐 비휘발성이냐가 진보된 기술이냐를 반증하지는 않는다. 저장장치의 성능을 평가하기 위해서는 접근속도와 저장용량등 여러 가지특징 구분에 따라 결정되어야하기 때문이다. 이번 시간에는 디지털 회로로 구성된 여러 가지의 저장장치를 알아보도록 하겠다.


메모리 – RAM(Random Access Memory)

RAM은 자유롭게 내용을 읽고 쓰고 지울 수 있는 저장장치이다. 전자장비의 전원이 들어오는 순간부터 처리장치(보통 CPU)의 연산을 보조하며(연산결과의 기억 등) 전원이 종료되는 순간까지 그 내용을 기억하고 있는 소자이다. 방식에 따라 SRAMDRAM으로 구분된다.

 

DRAM(Dynamic RAM)

동적 RAM이라고도 부른다. 일정시간마다 전원 공급과정(Refresh)를 해야 내용을 기억할 수 있다. 이는 구성이 커패시터(축전기)를 통해 만들어져있기 때문인데, 사용 중 충전시간이 필요하기에 SRAM에 비해 상대적으로 속도가 느리지만(컴퓨터가 느려봤자 얼마나 느리겠는가) 가격이 저렴하다.(트랜지스터1개와 축전기로 구성) 주로 컴퓨터의 메인 메모리에 사용된다.

 

SRAM(Static RAM)

정적 RAM이라고 부른다. 정적(Static)이라는 이름에 걸맞게 전원이 계속하여 공급된다는 가정하에 SRAM은 정보가 유지된다.(DRAMRefresh없으면 지워짐) Refresh가 없다는점과 더불어 또한 속도가 빠르지만 가격이 비싸고(트랜지스터 다수로 구성) 고속 저용량 접근이 필요한 캐시메모리등에 사용된다.

 

NVRAM(Non Volatile RAM)

사실 RAM이라고 다 휘발성은 아닌가 보다. NvRAM은 후술할 EEPROM과 결합하여 정보를 저장하고 휘발성을 다소 버리면서도 임의접근 메모리의 장점을 취할 수 있다.


메모리 – ROM(Read Only Memory)

ROM은 영문만을 해석해보면 읽기 전용 메모리이다. 즉 읽기만 하고 쓸 수는 없는 메모리라는 건데, 시간이 지나면서 여러번의 재기록도 지원하게 되었다. RAM과의 대표적인 차이점은 비휘발성이라는 점인데, 아예전원이 나가도 내용이 기록되고 잊혀지지 않는다. 이를 이용하여 보통 펌웨어나 다른 영구적으로 저장이 필요한 데이터가 이곳에 기록되게 된다.

 

Masked ROM

가장 ROM다운 ROM이다. 회사에서 ROM생산 당시에 정보를 기록하면 두 번다시는 바꿀 수 없다. 마스크라는 이름은 제조시에 사용하는 얇은 막(마스크)의 명칭을 가져왔으며 역시 공장이 그렇듯 대량생산에 적합하다

 

PROM(Programmable ROM)

사용자가 맨 처음 1회에 한하여 내용을 기록할 수 있는 ROM으로 Masked ROM과의 차이점은 벤더가 기록하는가 아니면 사용자가 기록하는가에 차이다.

 

EPROM(Erasable PROM)

기록된 PROM을 자외선을 활용하여 내용을 지우고 다시 쓸 수 있는 형태의 ROM이다.

 

EEPROM(Electrically Erasable PROM)

자외선을 사용하지 않아도 된다! 전기적으로 그 내용을 지우고 여러번 재사용할 수 있는 ROM이다. 자외선을 발산하기위한 EPROM Writer라는 기계도 필요없게 되었다. 가격은 당연히 상대적으로 비싸다.

 

플래시 메모리(Flash Memory)

최종적으로 진화한 ROM의 현대형태이다. EEPROM의 변형형태로 NAND 게이트를 직렬로 연결한 Read 저속 Write 고속 형태와 NOR 게이트를 병렬로 구성한 Read 고속 Write 저속 형태의 NOR 형태가 존재한다.

 

정리하면 다음과 같은 계층도를 가질 거 같다.


정리

이번시간에는 기억소자에 대해서 알아보았다. 휘발성 유무에 따라 RAMROM으로 분류를 하고 여라가지 형태의 RAMROM을 공부해 보았다.

 

다음시간에는

다음시간에는 필자도 잘 모르는 HDL과 프로그래머블 로직에 대해서 공부해 보겠다.

 

순서논리회로 개요

 

본 포스팅에서 사용되는 도표는 정보통신기술용어해설에서 차용하였습니다.

정보통신기술용어해설 : http://www.ktword.co.kr/test/view/view.php?no=4078

 

지난 시간에 우리는 여러 가지의 게이트로 존재하는 조합논리회로를 알아보았다. 불대수의 논리식과 도표로 표현되는 조합논리회로(가산기 디코더 등)을 배우고 이번시간에 같이

공부해볼 내용은 순서 논리회로이다. 순서논리회로를 정확하게 알기 위해서는 펄스의 동작이나 회로도의 표현방식(Active High Low)등도 알아야하는데, 전자전공이 아닌 필자가 그것을 자신있게 설명하기에는 이치에 맞지 않는 거 같아서 순서논리회로는 시험에 합격할 정도만 바라보고 비교적 가볍게 넘어갈 거 같다.

 

순서 논리회로는 현재의 상태에 따라 다음의 출력상태가 결정되는 논리회로 이다. 즉 단순한 게이트의 나열이 아니라 현재상태라는 것이 저장되어있고 그 상태에 따라 출력이 달라지는 회로라는 이야기 이다.

순서 논리 회로는 동기화된 타이밍이 주어지는가 아닌가에 따라서 비동기 순서회로(흔히 래치)와 동기 순서회로(플립플롭)으로 구분된다. 특이한 동작답게 피드백(출력이 입력으로 들어가는 구성)을 가지고 클록 펄스에 의해서 동기화되는 특징을 가진다.


래치(Latch)

래치는 짝수개의 반전소자로 구성된 순서논리회로이다. 래치는 순서신호를 받아들이지 않는 비동기형 순서회로 이며 인버터형 래치, SR래치, D 래치등의 종류를 가진다.

 

플립플롭(Flip Flop)

플립플롭은 구성상으로만 보면 래치 순서논리회로에 동기신호인 클럭이 들어가는 형태이다. 1개의 플립플롭은 1비트의 정보를 보관하고 유지하는 순차 회로의 단위로 구분한다. 자주사용되는 JK플립플롭의 형태를 알아보고 나머지는 개념정도만 알아두자.

JK플립플롭은 RS 플립플롭을 개선한 형태로 게이트의 출력을 피드백 받는 구성이다. 이렇게 하여 JK입력에(원래 각각 RS에 대응) 1이 들어갈 때, 알 수 없던 동작을 토글(반전)으로 개선한 플립플롭이다.

 

이외에도 플립플롭은 현재상태를 캡처하기 위해 사용되는 지연 플립플롭(D Flip-Flop)과 현재상태를 반전시킬 수 있는 플립플롭(T Flip Flop)이 있다.


정리

이번시간에는상태를 저장하는 회로인 순서논리회로를 알아보았다. 순서논리회로는 동기식 펄스(타이머)가 존재하는지 여부에 따라 래치형(비동기식;단순 피드백)과 플립플롭(동기식)으로 구분되었다. 플립플롭에는 RS(Reset-Set)형과 이를 개선시킨JK, 딜레이(D), 토글(T)형이 존재하고 래치형은 인버터, SR래치(SR플립플롭에서 신호빠진거), D래치가 존재한다.

 

다음시간에는

여러 가지 형태의 메모리에 대해서 알아보겠다.

패리티 비트와 해밍코드

이진세계에서 오류수정이라는 것은 오류수정 알고리즘을 통하여 데이터 전송이나 데이터 처리간에 잘못 전송될 수 있는 정보를 탐지하거나 수정하는 것을 의미한다. 가장 기본적으로 사용되는 패리티 비트와 해밍코드를 알아보자.


패리티 비트(Parity Bit)

패리티 비트는 정보전송간에 발생할 수 있는 오류를 탐지하는 것을 목적으로 한다. 원리는 매우 단순 하다.

데이터를 전송하는 두 송수신자 간에 홀수 혹은 짝수식 Parity를 사용할지 미리 설정한다. 7비트의 데이터와 1비트의 패리티비트(오류검출비트)1Byte로 데이터를 처리하며 Parity비트는 1Byte내 모든 1의 개수가 짝수/홀수 개가 되도록 설정한다. 만약 홀수 패리티비트를 설정하였는데, 수신된 1byte의 패리티비트를 포함한 1의 개수가 짝수라면 에러가 발생함을 감지 할 수 있다는 것이다. 물론 한 개의 Byte내에서만 검출 불가한 것으로 보이지만 이것들이 모이고 Parity도 여러 Bit로 사용한다면 꽤나 높은 수준의 검출율을 보여줄 수 있다.

 

해밍 코드(Hamming code)

오류의 검출을 목적으로 하는 패리티비트에서 한발자국 더 나아가서 해밍코드는 오류의 수정까지를 목표로 한다. 1940년 벨연구소에서 해밍이라는 아자씨가 만든 코드로 데이터 비트에 몇 개의 추가 비트를 써넣어서 오류를 자가 수정할 수 있도록 만든 방식이다.

 

사실 데이터에 추가비트가 들어간다는 점은 데이터 전송에 손실이 발생한다는 이야기와 크게 다르지 않다. 원래 100개를 한번에 발송할 수 있던게 오류수정을 위해서 테스트 데이터 10개를 넣는다면 90개를 전송할 수 있는 것이니 말이다. 따라서 해밍코드를 사용하기 위한 수정 비트는 최소화 하는 것이 좋은데,

(d : 데이터비트, p : 검사비트)르 만족하는 최소한의 p값을 찾아야한다. 1byte(8bit)라 할 때 p4이면 16>=13으로 최소한 만족을 한다. 8개의데이터 비트와 4개의 패리티 비트가 사용될 때의 예시이다.

 

다른 크기의 데이터도 위의 수식과 검사위치를 대입하면 쉽게 알 수 있을 것이다.

해밍코드는 기본적으로 패리티비트의 원리를 사용해서 중첩된 패리티비트로 에러의 위치를 찾아서 수정하는 것을 목적으로 한다. 예시를 보자

비트단위로 이루어지는 오류의 검출과 수정은 패리티비트와 해밍코드를 사용하지만 조합된 컴퓨터에서는 이를 응용하여 ECCARQ같은 오류 검출과 수정방식을 사용한다. 물론 패리티의 연장선에 존재한다.


정리

이번시간에는 2진 세상에서 데이터의 오류를 검출하고 수정하는 패리티비트와 해밍코등에 대해서 공부해보았다.

 

다음시간에는

순서논리회로인 래치와 플립플롭을 공부해보도록 하겠다.

 
 
 
 
 

 

+ Recent posts