회로가 작아짐에 따라 외부 노이즈 등에 보내고자 하는 정보가 바뀔 수 있습니다. 예를 들어 2진수 5비트 정보를 보내고 싶다고 가정 합시다. 10001 을 보내야하는데 10011이 보내질 수 있습니다. 잘못 보낸 정보를 확인, 수정을 하기 위해 어떤 방법이 있는지 살펴보겠습니다.
sent -> 10001
recieve -> 10011
위와 같이 1비트가 에러난 것을 Single bit - error 라고 합니다.
VRC ( Vertical redundancy check )
보내고싶은 데이터에 1비트를 추가해 Parity bit을 추가합니다. Parity bit의 역할은 1의 개수가 짝수가 될 수 있게 해주며 홀수가 나온다면 에러가 생겼다는 것을 확인 할 수 있습니다.
ex)
010001 ( o )
110011 ( o )
100011 ( x )
위와 같이 Single bit - error 를 감지할 수 있으나 VRC는 2개의 bit이 오류가 생긴다면 에러를 감지할 수 없습니다.
이를 Burst error 라고 합니다.
ex)
100001 ( x ) ( data[1], data[4] change )
위의 문제를 좀 더 보완하기 위해 LRC라는 방법이 있습니다.
LRC ( Longitudinal redundancy check )
쉽게 이해하기 위해 간단하게 설명하겠습니다. 다음과 같은 9비트의 정보가 있다고 가정합시다.
100011000 위 데이터를 나누어 줍니다 100_011_000
1 | 0 | 0 | |
0 | 1 | 1 | |
^ | 0 | 0 | 0 |
LRC | 1 | 1 | 1 |
나누어준 데이터를 정렬시키고 수직으로 계산해 1의 개수가 짝수가 되게 끔 해준 bit가 LRC가 되며 원래의 데이터에 붙여
111100011000과 같은 데이터를 전송하게 됩니다.
이렇게 Burst error를 감지 할 수 있으나 마찬가지로 같은 열에서 2개의 비트가 바뀌는 Burst error를 감지 할 수 없다는 문제가 있고 VRC, LRC 모두 디지털논리회로에서 XOR Gate를 통해 구현할 수 있습니다.
이외에 Parity bit 과 Hamming Code를 이용해 어떤 비트에서 오류가 생겼는지 특정할 수 있습니다.
Check - sum
다음으로 Check - sum 입니다.
전송할 16비트의 데이터가 있다고 가정해보겠습니다.
data = 1001110010011010
위의 데이터를 다음과 같이 분리해줍니다.
1001 | 1100 | 1001 | 1010 |
분리한 데이터를 모두 더 해줍니다.
1 | 0 | 0 | 1 | ||
1 | 1 | 0 | 0 | ||
1 | 0 | 0 | 1 | ||
+ | 1 | 0 | 1 | 0 | |
1 | 0 | 1 | 0 | 0 | 0 |
Carry 까지 다시 더해줘서 1010 이란 값을 얻게 되었고 1의 보수를 취해서 0101 이라는 데이터를 얻습니다. 이를 Check Sum 이라고 합니다
Check-sum 을 붙여서 01011001110010011010 을 보내게 되고 다시 Checksum 을 계산했을때 1111이라는 결과가 나온다면 오류가 없다는 것을 알 수 있습니다.
CRC ( Cyclic redundancy check )
CRC는 나누기를 사용합니다.
예를 들어 1011의 제수로 100100을 나눈다고 합시다 4bit -1bit = 3bit 의 값 000을 100100 뒤에 붙여주어 100100000을 나누게 되면 001의 나머지 값, 즉 CRC값이 나오게 됩니다. 이 CRC 값을 100100의 뒤에 붙여 100100001로 만들어줍니다.
다시 한번 1011의 제수로 100100001을 나누게되면 나머지가 0 이 나오며 오류가 없다는것을 표현해줍니다.
이 제수를 다항식으로 CRC에서는 각 자리수를 아래와 같이 다항식으로 표현합니다.
ex ) 1011 = x3 + x1+1
Error Detection Methods는 반도체의 Yield 개선에 기여할 수 있습니다.