본문 바로가기
IT_Study/ASIC_Study

[CDC] 06. Gray Code vs. Binary Code(2)

by 두번째얼룩 2022. 3. 28.

이전 포스트에서는 Gray Code와 Binary Code에 대해서 살펴보았다. Binary Code는 일반적으로 숫자를 세기 위해서 사용된다. 예를 들어 Binary Code에서는 '0001(1)'에 +1을 할 경우, 직관적으로 '0010(2)'이 됨을 알 수 있다. 그러나 Gray Code는 해당 값이 직관적으로 어떤 숫자를 나타낸다는 걸 알기 어렵다. 예를 들어 Gray Code는 순서에 따라서 '0001' 다음 '0011'이기 때문에, '0001'에 다음 값(+1)이 바로 '0011'이라고 생각하기 쉽지 않으며, 2라는 값을 생각하기 어렵다. 물론 Table 형태로 관리하여 '0001' <-> 1, '0011' <-> 2로 매칭해서 생각해도 된다. 그런데 Table로 관리하기 어렵다면, Gray Code를 Binary Code로 변환하여 덧셈 연산을 진행하고, 다시 Binaray Code에서 Gray Code로 변경하여 CDC를 수행할 수 도 있다.
우선, Gray Code를 Binaray로 변경하는 법을 알아보자

*[2] 4-bit gray to binary converstion

위의 예제는 4-bit Gray code('gray')를 4-bit Binary('bin')로 변경하는 코드이다. Gray Code의 최상위 bit부터 최하위 bit까지 XOR 연산을 수행하면 Binary code의 최하위 bit을 나타낸다. 그리고 Binary Code의 [1]-bit은 gray Code의 [0]-bit을 제외한 모든 bit을 XOR 연산을 수행하면 얻을 수 있다. 이때, Gray Code의 [0]-bit을 제외한다는 의미는 gray 값을 오른쪽으로 1만큼 Shift를 한 것과 같다. 다음 Binary Code의 [2]-bit은 gray 값을 오른쪽으로 +2만큼 Shift 하여 모든 값을 XOR 연산한 것과 같다.
이를 일반화하면 Binary Code의 [N]-Bit은 gray 값을 오른쪽으로 +N만큼 Shift 하여 모든 값을 XOR 연산을 수행하여 얻을 수 있다.

*[2] verilog Code, gray to binary

위의 코드는 SIZE 크기를 가지는 Gray Code를 Binary로 변경하는 모듈을 나타낸다.
반대로, Binary에서 Gray Code로는 어떻게 변경하는지 알아보자.

*[2] 4-bit binary to gray conversion

위의 예제는 4-bit Binary code('bin')를 4-bit Gray code('gray')로 변경하는 코드이다. Gray code의 [0]-bit은 Binary code의 최하위 bit과 그다음 bit의 XOR 연산을 수행한 값이다. 그리고 Gray code의 [1]-bit은 Binary code의 [1]-bit과 [1+1(2)]-bit과의 XOR 연산을 수행한 값이다. 이를 일반화하면 gray code의 [N]-BIT은 Binary Code의 [N]-bit과 [N+1]-bit 과의 XOR 연산을 수행한 값이다. 이때, SIZE를 넘어가는 N+1은 1'b0으로 취급한다.

*[2] binary to gray code

위의 예제는 아래와 같은 연산을 수행한다.
{bin>>1}:: {1'b0 , bin[SIZE-1] , ... , bin[2] , bin[1]}
XOR XOR XOR XOR
bin :: {bin[SIZE-1] , bin[SIZE-2] , ... , bin[1] , bin[0]}
=====================================
gray :: {gray[SIZE-1], gray[SIZE-2], ... , gray[1], gray[0]}
그러므로 위 연산을 수행하면 gray code array 값을 얻을 수 있다.

이번 포스트에서는 Gray Code to Binary Code, Binary Code to Gray Code conversion을 알아보았다. 다음 포스트에서는 이 변환을 활용하여 CDC를 위해 자주 쓰이는 Asynchronous FIFO의 구조를 알아보도록 하겠다.

Reference
*[1]: Understanding Metastability in FPGAs, Altera Corporation
*[2]: Cummings, Clifford E. "Clock domain crossing (CDC) design & verification techniques using SystemVerilog." SNUG-2008, Boston (2008).
*[3]: S. Beer, J. Cox, T. Chaney and D. M. Zar, "MTBF Bounds for Multistage Synchronizers", 2013 IEEE 19th International Symposium on Asynchronous Circuits and Systems, 2013, pp. 158-165, doi: 10.1109/ASYNC.2013.18.

댓글