이전 포스트에서는 Gray Code를 FIFO의 Pointer로 사용하기 위한 방법에 대해서 알아보았다. 이번 포스트에서는 이 Gray Code를 이용하여 FIFO의 Empty/Full 상태를 알아보는 방법에 대해서 이야기하고자 한다. 일반 Binary Counter를 Pointer로 사용하는 FIFO의 Empty와 Full 상태는 아래와 같은 방법으로 알 수 있다.
1. Empty Condition
if(Write Pointer == Read Pointer) Empty = 1;
else Empty = 0;
2. Full Condition
if((Write Pointer[MSB] != Read Pointer[MSB]) & (Write Pointer[MSB-1:0] == Read Pointer[MSB-1:0]) Full = 1;
else Full = 0;
Empty의 경우, Write Pointer와 Read Pointer가 같다는 의미는 앞으로 들어오는 데이터를 저장하는 위치와 읽어야하는 위치가 같다는 말과 같다. 즉, 읽어야 하는 위치에는 아직 데이터가 없다는 의미이므로 FIFO 내부에는 데이터가 하나도 없다.
Full의 경우, Write Pointer의 MSB와 Read Pointer의 MSB가 다르다는 이야기는 한 Pointer는 FIFO Depth 이상 Pointer가 증가하였고, 또 다른 Pointer는 FIFO Depth 이하로 Pointer가 증가하였다는 의미와 같다.
(엄밀히 말하면 (N-1)xFIFO Depth < PTR < NxFIFO Depth or NxFIFO Depth < PTR <(N+1) FIFO Depth를 의미한다)
그런데 MSB를 제외한 부분이 서로 같으면 두 Pointer의 차이는 FIFO Depth 만큼 차이가 난다. 이때, Write Pointer는 Read Pointer를 넘어설 수 없으므로 FIFO 내부에는 FIFO Depth만큼 데이터가 꽉 차있다는 걸 알 수 있다.
이와 같은 방식을 Gray Counter를 사용하는 Pointer에 적용하면 아래와 같다.
1. Empty Condition
if(Write Gray Pointer == Read Gray Pointer) Empty = 1;
else Empty = 0;
2. Full Condition
if(Write Gray Pointer[MSB] != Read Gray Pointer[MSB]) & (Write Gray Pointer[MSB-1] != Read Gray Pointer[MSB-1]) & (Write Gray Pointer[MSB-2:0] == Read Gray Pointer[MSB-2:0])) Full = 1;
else Full = 0;
Empty의 경우, Binary Counter 방식 사용할 때와 동일하다. Gray Code 역시 두 Pointer가 같다는 건 같은 위치에 있다는 걸 의미하기 때문이다.
Full 신호의 경우, Binary Counter 방식과 그 형태가 조금 다르다. 아래 예제는 이전 포스트에 예시로 들었던 4-bit Gray Code를 나타낸다.
Gray Converted Address Gray Converted Address
0(0000) --> 0(000) <-> 15(1000) --> 7(100)
1(0001) --> 1(001) <-> 14(1001) --> 6(101)
2(0011) --> 2(011) <-> 13(1011) --> 5(111)
3(0010) --> 3(010) <-> 12(1010) --> 4(110)
4(0110) --> 4(110) <-> 11(1110) --> 3(010)
5(0111) --> 5(111) <-> 10(1111) --> 2(011)
6(0101) --> 6(101) <-> 9 (1101) --> 1(001)
7(0100) --> 7(100) <-> 8 (1100) --> 0(000)
두 Pointer가 서로 FIFO Depth 만큼 차이나는 경우를 기술하면 아래와 같다.
0(0000) --> 0(000) [---] 8 (1100) --> 0(000)
1(0001) --> 1(001) [---] 9 (1101) --> 1(001)
2(0011) --> 2(011) [---] 10(1111) --> 2(011)
3(0010) --> 3(010) [---] 11(1110) --> 3(010)
4(0110) --> 4(110) [---] 12(1010) --> 4(110)
5(0111) --> 5(111) [---] 13(1011) --> 5(111)
6(0101) --> 6(101) [---] 14(1001) --> 6(101)
7(0100) --> 7(100) [---] 15(1000) --> 7(100)
빨간색으로 표현한 부분을 보면 두 Pointer는 서로 다른 값을 가지고 있다. 즉, 정반대의 값을 가지고 있다. 반면 녹색 영역을 보면 동일한 값을 가지고 있는 것을 알 수 있다. 이러한 현상이 발생한 이유는 Gray Code 값으로부터 Address로 변환할 때 MSB과 MSB-1번째 값을 서로 XOR 연산을 했기 때문이다. XOR 연산 값이 같으려면 각각 MSB과 MSB-1번째 값이 서로 같거나(ex, 00, 11) 달라야 한다(ex, 10, 01). 그렇기 때문에 아래의 수식에 빨간색으로 표기한 부분이 추가되었다.
2. Full Condition
if(Write Gray Pointer[MSB] != Read Gray Pointer[MSB]) & (Write Gray Pointer[MSB-1] != Read Gray Pointer[MSB-1]) & (Write Gray Pointer[MSB-2:0] == Read Gray Pointer[MSB-2:0])) Full = 1;
else Full = 0;
이번 포스트에서는 Gray Counter를 Pointer로 사용했을 때, Empty와 Full 신호를 구하는 방법을 알아보았다. 다음 포스트에서는 Asynchrous FIFO의 전체적인 구조에 대해서 살펴보도록 하겠다.
'IT_Study > ASIC_Study' 카테고리의 다른 글
[CDC] 10. Asynchronous FIFO(4) (5) | 2022.04.25 |
---|---|
[CDC] 08. Asynchronous FIFO(2) (2) | 2022.03.31 |
[CDC] 07. Asynchronous FIFO(1) (4) | 2022.03.29 |
[CDC] 06. Gray Code vs. Binary Code(2) (5) | 2022.03.28 |
[CDC] 05. Gray Code vs. Binary Code(1) (4) | 2022.03.26 |
댓글