이번 포스트에서는 CDC(Clock Domain Crossing)를 수행할 때 가장 많이 쓰이는 Asynchronous FIFO에 대해서 알아보도록 하겠다. FIFO는 First In First Out의 약자로 처음 넣은 데이터가 처음 나오는 기능을 수행한다. 즉 순차적으로 입력한 데이터가 순차적으로 출력된다. 이런 동작을 수행하기 위해서 FIFO에서 Write Pointer, Read Pointer가 존재한다. Write를 수행하면 Write Pointer가 '+1' 증가되며, Read를 수행하면 Read Pointer가 '+1' 증가된다. 두 Pointer 간의 비교를 통해서 FIFO 내부에 데이터가 존재하는지(empty) 혹은 꽉 찼는지(full)를 알 수 있다. 예를 들어 Pointer가 0~7까지 가질 수 있고, Write Pointer가 2, Read Pointer가 0이라면 현재 FIFO에는 2개의 데이터가 존재하고, empty가 아닌 상태이다. 또 Write Pointer가 7, Read Pointer가 0이라면 현재 FIFO에는 7개의 데이터가 존재하고, 한 번의 Write가 더 수행되면 Full 인 상태이다.
아래 그림은 5-bit Pointer를 이용하여 16개의 데이터를 저장하는 FIFO의 FULL, EMPTY 신호를 생성하는 방법에 대해서 나타내었다. 여기에서는 Write Pointer를 'waddr', Read Pointer를 'raddr'로 표기하였다. 그런데 특이한 점은 저장할 수 있는 데이터는 16개인데, Pointer는 32개까지 증가하도록 하였다. 이는 EMPTY, FULL을 구분하기 위한 신호로 MSB를 사용하기 때문이다. 4-bit만 사용했다면, EMPTY, FULL Condition을 Pointer로만으로 구분하기 어렵기 때문이다. 굳이 4-bit만 사용한다면, almost_full과 같이 DEPTH-1을 검출 할 수 있도록 구성할 수 도 있다.
FIFO에서는 Pointer를 통해서 데이터가 존재하는 지, 꽉 찼는지 판단할 수 있다. FIFO에 데이터를 쓰는 부분은 Full 신호를 보고 쓸지 말지를 결정하며, FIFO로부터 데이터를 읽는 부분은 Empty 신호를 통해서 데이터를 읽을지 말지를 결정한다.
그렇다면 FIFO에 쓰는 부분과 FIFO로부터 데이터를 읽는 부분이 서로 다른 Clock domain을 갖는다면 어떻게 해야 할까?
Full과 Empty는 Read Pointer/Write Pointer 간의 관계를 통해서 알 수 있다. 그러므로 FIFO에 쓰는 부분은 Read Pointer를 CDC 수행하여 Write Pointer와 비교하여 Full 신호를 생성하고, FIFO로부터 읽는 부분은 Write Pointer를 CDC 수행하여 Read Pointer와 비교하여 Empty 신호를 생성하면 된다. Pointer는 Multi-bit 이므로 CDC를 수행할 때 조심해야 한다. Pointer를 Binary Code로 전송하는 것보다 Gray Code로 전송하는 것이 안전하다. 또한 Gray Code를 사용하면 Counter 역활을 해야한다.
다음 포스트에서는 Gray Code Counter에 대해서 알아보도록 하겠다.
*Reference
[4] Clifford E. Cummings, “Simulation and Synthesis Techniques for Asynchronous FIFO Design,” SNUG 2002 - www.sunburst-design.com/papers/CummingsSNUG2002SJ_FIFO1.pdf
'IT_Study > ASIC_Study' 카테고리의 다른 글
[CDC] 09. Asynchronous FIFO(3) (8) | 2022.04.13 |
---|---|
[CDC] 08. Asynchronous FIFO(2) (2) | 2022.03.31 |
[CDC] 06. Gray Code vs. Binary Code(2) (5) | 2022.03.28 |
[CDC] 05. Gray Code vs. Binary Code(1) (4) | 2022.03.26 |
[CDC] 04. Multi-bit Clock Domain Crossing(2) (8) | 2022.03.21 |
댓글