비동기 FIFO란?

쓰기와 읽기를 서로 다른 클록으로 하는 FIFO로, 클록 도메인 사이에서 멀티비트 데이터를 전달하는 데 사용한다. 포인터를 그레이 코드로 변환하여 상대 도메인에 동기화하고, 가득 참(full)과 비어 있음(empty)을 판정한다. 포인터는 주소보다 1비트 많게 하여 순환을 구별한다.

일본어 명칭: 非同期FIFO

비동기 FIFO은(는) 타이밍 분석과 CDC, IC 설계 흐름과 EDA 등 2개 분야의 연습 문제 11개에 나와요.

비동기 FIFO의 구성 쓰기 측(wclk) 읽기 측(rclk) 듀얼 포트 RAM 두 클록으로 읽기/쓰기 쓰기 데이터 쓰기 포인터 그레이 코드화 읽기 데이터 읽기 포인터 그레이 코드화 2단 동기화 empty 판정 2단 동기화 full 판정 그레이 코드 포인터 그레이 코드는 1 증가할 때 1비트만 바뀜
비동기 FIFO의 구성 · 도해에서 보기

분야: 타이밍 분석과 CDC

도전해 보기: 비동기 FIFO 관련 문제

비동기 FIFO에서 쓰기 포인터와 읽기 포인터를 그레이 코드로 변환한 후 상대 도메인으로 동기화하는 이유로 올바른 것은?

  1. A그레이 코드로 하면 비트 수가 절반이 되어 동기화기가 적게 들기 때문에
  2. B하나 증가할 때마다 1비트만 바뀌므로, 변화 도중에 캡처하더라도 증가 전이나 후의 올바른 값이 되기 때문에
  3. C그레이 코드 신호는 메타스테이블 상태가 되지 않으므로 동기화가 필요 없어지기 때문에
정답과 해설 보기

정답: B. 하나 증가할 때마다 1비트만 바뀌므로, 변화 도중에 캡처하더라도 증가 전이나 후의 올바른 값이 되기 때문에

바이너리 포인터는 예를 들어 0111에서 1000처럼 여러 비트가 동시에 바뀌므로, 각 비트를 따로 동기화하면 전혀 관계없는 값을 받는 경우가 있습니다. 그레이 코드라면 한 번 증가할 때 바뀌는 것은 1비트뿐이므로, 그 비트가 메타스테이블 상태가 되어 새 값과 이전 값 중 어느 쪽으로 정해지더라도 결과는 증가 전이나 증가 후의 값이 됩니다. 약간 오래된 값을 볼 뿐이므로 FIFO가 망가지지는 않습니다. 비트 수는 변하지 않으며, 메타스테빌리티 자체도 일어날 수 있으므로 동기화기는 필요합니다.

깊이 16워드인 비동기 FIFO에서 쓰기 포인터와 읽기 포인터를 주소보다 1비트 많은 5비트로 하는 이유로 올바른 것은?

  1. A16워드의 주소를 나타내는 데 5비트가 필요하기 때문에
  2. B포인터가 일치했을 때 같은 바퀴면 빈 상태, 한 바퀴 차이면 가득 찬 상태로 구별할 수 있도록 하기 위해
  3. C여분의 비트를 패리티로 사용하여 포인터의 오류를 검출하기 위해
정답과 해설 보기

정답: B. 포인터가 일치했을 때 같은 바퀴면 빈 상태, 한 바퀴 차이면 가득 찬 상태로 구별할 수 있도록 하기 위해

16워드의 주소는 4비트로 나타낼 수 있지만, 4비트 포인터만으로는 읽기와 쓰기 주소가 일치했을 때 전부 다 읽은 빈 상태인지, 한 바퀴분을 써서 따라잡은 가득 찬 상태인지를 구별할 수 없습니다. 5번째 비트를 바퀴를 나타내는 비트로 추가하면, 바이너리로 비교하는 경우 5비트가 모두 일치하면 빈 상태, 최상위 비트만 다르면 가득 찬 상태로 판정할 수 있습니다. 그레이 코드 포인터에서는 가득 찬 상태를 판정하는 비교 방법이 조금 달라집니다. 패리티로 사용하는 것은 아닙니다.

해설 속 비동기 FIFO

비동기 FIFO이(가) 나오는 문제 (11)

  1. 비동기 FIFO에서 쓰기 포인터와 읽기 포인터를 그레이 코드로 변환한 후 상대 도메인으로 동기화하는 이유로 올바른 것은?
  2. 깊이 16워드인 비동기 FIFO에서 쓰기 포인터와 읽기 포인터를 주소보다 1비트 많은 5비트로 하는 이유로 올바른 것은?
  3. 5비트 그레이 코드 포인터를 사용하는 깊이 16워드의 비동기 FIFO에서, 쓰기 측에서 가득 참(full)을 판정하는 조건으로 올바른 것은?
  4. 비동기 FIFO에서는 상대의 포인터를 동기화해서 사용하므로, 보이는 포인터 값이 2~3사이클 오래된 값이 됩니다. 이 지연이 full/empty 판정에 미치는 영향으로 올바른 것은?
  5. 쓰기 측 100 MHz, 읽기 측 80 MHz인 비동기 FIFO에서 쓰기 측은 100워드의 버스트를 매 사이클 1워드씩 쓰고, 읽기 측은 매 사이클 1워드씩 읽습니다. 버스트 사이에는 충분한 휴지 기간이 있습니다. 넘치지 않기 위해 필요한 최소 깊이는 얼마입니까(동기화로 인한 지연은 무시합니다)?
  6. 비동기 FIFO의 그레이 코드 포인터를 상대 도메인으로 전달하는 경로를, 비동기라는 이유로 제약 없음(폴스 패스)으로 하면 문제가 될 수 있는 이유로 올바른 것은?
  7. 서로 다른 클록으로 동작하는 회로 사이에서 신호를 주고받는 부분에 동기화 회로가 올바르게 들어 있는지 전용 툴로 확인하는 검증을 무엇이라고 하는가?
  8. 4비트 데이터의 각 비트에 각각 2단 동기화기를 달아 다른 클럭 도메인으로 전달했습니다. 데이터가 0111에서 1000으로 바뀔 때 일어날 수 있는 문제로 올바른 것은?
  9. 멀티비트 데이터를 다른 클럭 도메인으로 안전하게 전달하는 방법으로 올바른 것은?
  10. 토글 동기화로 펄스를 빠른 클럭 도메인에서 느린 클럭 도메인으로 전달할 때의 제약으로 올바른 것은?
  11. 핸드셰이크를 이용한 클럭 도메인 간 데이터 전송의 단점으로 올바른 것은?

관련 용어

그레이 코드(Gray Code) 핸드셰이크(Handshake) 폴스 패스(False Path) 배치 배선(P&R) 동기화 회로(Synchronizer) 플립플롭(flip-flop) 메타스터빌리티(Metastability) 토글 동기화(Toggle Synchronizer) 리커버리 체크(Recovery Check) 멀티사이클 패스(Multicycle Path)

용어집으로 돌아가기