2019년 3월 22일
순환중복검사 (CRC, Cyclic Redundancy Check)
I. 순환 중복 검사, CRC (Cyclic Redundancy Check)
가. CRC의 개념
- 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지 확인하기 위한 체크값을 결정하는 방식
- 송신측에서는 CRC값을 데이터에 붙인 코드워드를 전송하며, 수신측에서는 수신된 코드워드에서 CRC값을 이용하여 에러 발견
- 오류 제어를 위한 후진 오류 수정(BEC, Backward Error Correction) 방식 중 오류 검출 방식
나. CRC의 특징
- CRC 기법은 수학적 연산 과정은 복잡하나, 높은 오류 검출율과 간단한 H/W 구현 가능
- CRC-8/-10/-16/-32 유형 존재
II. CRC 기법의 상세 원리
가. CRC 기법의 동작 원리
- CRC는 에러 발견을 위해 전송 Data뒤에 CRC 검출 정보를 붙여 전송하는 기법
나. CRC 기법의 동작 상세 설명
단계 | 설명 |
---|---|
Encoding (CRC 계산) | – 데이터워드 + n-bit로 구성된 데이터를 (n+1)-bit Divisor로 나누어 CRC정보 생성 – 데이터워드 + CRC 이루어진 코드워드 생성 – Divisor는 0, 1 스트링보다 대수다항식 표현 |
Transmission (Data + CRC) | – 코드워드(데이터워드 + CRC)를 네트워크를 통해 수신측에 전송 – 손실, 순서 바뀜, 중복 등 에러 발생 가능 |
Decoding (에러체크) | – 수신된 코드워드를 Divisor 이용하여 나눔 – 나머지가 0인 경우 데이터 정상 수신 – 나머지 발생 시 에러 발생으로 간주, ARQ |
- CRC 기법은 Encoding 단계에서 CRC를 생성하여 송신하며, 수신측에서 Divisor로 나머지 값 여부로 에러 발생 여부 검증
III. CRC 기법 상세 사례
가. CRC 기법의 코드워드 계산 과정
구분 | 설명 |
---|---|
제시사례 분석 | – 데이터워드: 01101011 – Divisor: 100000111 // CRC-8 = x8 + x2 + x + 1 |
코드워드 계산 | |
전송 데이터 | – 코드워드 = 01101011 + 00010110 – 전송데이터 = 0110101100010110 |
- 수신측에서는 수신된 코드워드를 Divisor로 나누어 에러 여부 검증
나. CRC 기법의 에러 검증 과정
구분 | 설명 |
---|---|
검증 데이터 | – 수신된 데이터 = 0110101100010110 – Divisor: 100000111 // CRC-8 = x8 + x2 + x + 1 |
에러 검증 | |
검증 결과 | – Divisor 나누기 값이 0이므로 정상 데이터 수신 – 수신된 데이터의 데이터워드(01101011)를 추출하여 목적에 맞게 사용 |
- CRC 기법을 구현하기 위해 쉬프트 레지스터와 배타적 논리합 연산장치를 이용하여 구현 가능
IV. CRC의 D-FF 논리회로 기반 하드웨어 구현
[x3 + x + 1 의 논리 회로 구현] |
- 입력은 한 클럭 동안 하나의 bit를 입력하며, 출력은 O2, O1, O0로 3bit로, 직렬 입력에 대해 클럭마다 CRC값 출력
10 Comments
감사합니다
최고입니다
마지막 플립플롭은 이해가 좀 안됩니다. 진리표나 카르노맵에 대한 정리가 필요하지 않을까요?
진리표 정리(링크)와 카르노맵 정리(링크) 내용을 참고해주시고, 플립플롭을 이용한 CRC 논리회로에 대한 자세한 내용은 국내 위키 사이트(링크)의 하드웨어 구현 부분에 자세히 나와 있으니 참고해주세요. 이해에 도움이 되셨으면 좋겠습니다.^^
혹시 ◾입력은 한 클럭 동안 하나의 bit를 입력하며, 출력은 O2, O1, O0로 3bit로, 직렬 입력에 대해 클럭마다 CRC값 출력
이부분이 이해가 안가는데ㅠ 입력은 몇초간격으로, 클럭은 몇초간격으로 입력해야하나요?
먼저 클럭(clock)을 설명드리면, 클럭은 1초동안 움직이는 파장 속도, 즉 데이터를 처리할 수 있는 신호 속도를 의미하며, Hz 단위를 사용합니다. 예를 들어, 100Hz의 클럭이라면 1초동안 100개의 데이터를 처리한다는 의미입니다. 클럭은 데이터가 아니고 데이터를 처리하는 운반체 역할로, 클럭에 입력 데이터를 실어서 처리하는 것으로 이해하시면 됩니다. 클럭에 대한 자세한 내용은 위키 사이트(링크)를 참조해주세요~
질문 내용의 입력이란것은 2진수 데이터의 입력을 의미하는것이고, 이 2진수 데이터 하나(1 bit, 0 또는 1)를 입력(처리)하기 위해 하나의 클럭이 필요합니다. 예를 들어, 100Hz의 클럭으로 하나의 bit를 입력하면 0.01초 간격으로 입력되겠네요.. 이것을 현대의 컴퓨터에 적용해보면 최근에 출시된 CPU 중 Intel Core i9-109xx 프로세서의 최고 속도가 5GHz 정도 되니까 하나의 bit를 입력하기 위한 한 클럭은 0.0000000002초 정도의 간격이 되겠네요..
감사합니다 ㅠㅠ 정리가 정말 명쾌하네요 혼자 책 들여다보며 한참 고민했어요 ㅎㅎㅎ
혹시 divisor를 설정하는 방법은 따로 있나요? 아니면 임의로 설정하는 것인가요?
임의로 설정해도 되지만 일반적으로 사용하는 용도에 따라 CRC-8, CRC-16, CRC-32, CRC-64 등 사전에 약속된 다양한 divisor들이 있으며, 이를 CRC 다항식(Polynomials)이라고 합니다. 순환 중복 검사 위키백과 내용(링크)에서 다항식 사용처를 참고해주세요.