[SoC] Gray Code 개념 및 설계(Verilog코드)

새옹지마·2025년 1월 9일

SoC

목록 보기
3/5

Gray Code 개념

Gray Code는 이진수(Binary Code)의 한 종류로, 연속된 두 숫자 사이에 단 하나의 비트만 변하는 코드입니다. 이를 단일 비트 변경 코드 (Single Bit Change Code)라고도 합니다.

Gray Code는 주로 타이밍 오류를 방지하거나 데이터 전환 중 신뢰성을 높이기 위해 사용됩니다. CDC에서 주로 사용되죠.

왜 신뢰성이 높을까요?

Multi-bit CDC를 수행할 때, 동시에 여러 Bit이 다른 Clock domain으로 넘어가면 skew에 의해 전혀 다른 값이 전달될 수도 있습니다. 여기에서 살펴봐야 하는 점이 있다. skew에 의해 전혀 다른 값(의도와 다른 값, 예를들어 a를 b로 변경해서 전달하는데 c로 인식한 경우 의도와 다른 값이 전달.)이 전달되려면, 전달되는 Bit 중 2-bit 이상 데이터가 변경되어야 한다.

우리가 원래 쓰던 binary count에서 7은 2진수로 0111이고 8은 1000입니다. 각 자리수가 모두 값이 변해야하죠. 이런 counter의 값을 전달하는 경우(0111>1000), 모든 비트에서 metastability의 문제가 생길 수 있습니다.

그림에서와 같이 4비트 모두 0과 1 어느것도 될 수 있으므로 모든 경우의 수가 나올 수 있습니다. 7이 11로 전달될수도, 13으로 전달될 수도 있죠. 잘못 전달될 확률이 높습니다. 경우의 수를 줄이려면 변하는 bit의 수를 줄여야겠죠?


반면, gray code는 변하는 bit의 수를 1개로 고정했습니다. Gray code에서 7은 0100이고 8은 1100입니다. [3]위치의 비트만 변하므로 binary count에 비해 metastability에 빠질 가능성이 현저히 줄어듭니다.


우리가 위의 table을 보고 gray코드와 binary코드의 값을 매칭시키는 것은 쉽습니다.
하지만 우리는 verilog로 구현해보는 것이 중요하겠죠.

코드 구현

Gray to Binary

위 코드는 4bit Gray code를 binary code로 변환하는 코드입니다(^는 xor 연산 기호입니다).
두 가지 구현 방법이 있는데 표현만 다릅니다.

  1. Gray code의 최상위 비트부터 해당 비트까지 xor연산을 하면 구하고자 하는 비트의 값이 나옵니다.
  2. 다른 표현으로는 구하고자 하는 비트 index만큼 오른쪽으로 shift하고 남은 bit들을 xor연산을 해주면 됩니다.(1011을 오른쪽으로 2번 shift하면 0010이므로 1번 방법을 다르게 표현했을 뿐이라는 것을 알 수 있습니다.)

글을 잘 못써서 한글로 읽는 것보단 그냥 코드 보시는게 빠를 것 같습니다...
두 번째 방법을 아래처럼 일반화해서 작성할 수 있습니다.


Binary to Gray


Binary code를 gray code로 변경하는 코드입니다. Gray code의 [n]번째 비트는 binary[n] xor binary[n+1]이네요.
마찬가지로 일반화하면

입니다.

이렇게 작성한 Gray code를 어디에 사용할까요?
다음 글에서 알아보겠습니다🙌.


Reference

  1. https://secondspot.tistory.com/26 [소소하게 일상을 기록하는 페이지:티스토리]
profile
반도체, HW ,SW 탐구생활

0개의 댓글