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로 구현해보는 것이 중요하겠죠.

위 코드는 4bit Gray code를 binary code로 변환하는 코드입니다(^는 xor 연산 기호입니다).
두 가지 구현 방법이 있는데 표현만 다릅니다.
글을 잘 못써서 한글로 읽는 것보단 그냥 코드 보시는게 빠를 것 같습니다...
두 번째 방법을 아래처럼 일반화해서 작성할 수 있습니다.


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

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