2단 동기화 회로·토글 동기화·핸드셰이크·비동기 FIFO의 차이: 전달할 수 있는 신호·전송 속도·제약 비교
비동기 클록 도메인 사이에서는 수신 측 플립플롭이 셋업 시간이나 홀드 시간을 만족하지 못하는 순간이 반드시 오므로, 메타스테이블이 일어나는 것을 전제로 한 회로로 신호를 전달합니다. 기본은 2단의 플립플롭으로 1비트 레벨 신호를 받는 동기화 회로입니다. 짧은 펄스를 전달하려면 토글 동기화, 멀티비트 데이터를 가끔 전달하려면 핸드셰이크, 데이터를 연속으로 대량 전달하려면 비동기 FIFO를 씁니다. 어느 것이든 동기화하는 것은 1비트 신호이거나, 하나 나아갈 때마다 1비트만 바뀌는 그레이 코드로 한정한다는 생각은 공통입니다.
| 비교 항목 | 2단 동기화 회로 | 토글 동기화 | 핸드셰이크 | 비동기 FIFO |
|---|---|---|---|---|
| 전달할 수 있는 것 | 1비트 레벨 신호(천천히 바뀌는 제어 신호) | 1비트 펄스(사건의 발생) | 멀티비트 데이터(가끔 1워드씩) | 멀티비트 데이터의 흐름(연속으로 대량) |
| 구조 | 수신 측 클록으로 2단의 플립플롭에 통과시켜, 1단째의 메타스테이블이 2단째에 들어가기 전까지 가라앉기를 기다린다 | 송신 측에서 펄스마다 반전하는 레벨 신호를 만들어 동기화하고, 수신 측에서 1단 늦춘 값과 XOR을 취해 펄스로 되돌린다 | 데이터를 유지한 채 req를 동기화해 전달하고, 수신 측이 받아들이면 ack를 동기화해 되돌린다 | 듀얼 포트 메모리에 쓰고, 그레이 코드로 만든 포인터를 상대 도메인으로 동기화해 full과 empty를 판정한다 |
| 동기화하는 신호 | 그 신호 자체 | 토글 신호(1비트) | req와 ack(각 1비트). 데이터는 동기화하지 않는다 | 그레이 코드의 포인터(하나 나아가면 1비트만 바뀐다) |
| 전송 속도 | 신호의 변화는 수신 측 주기보다 충분히 느려야 한다 | 펄스 간격을 수신 측이 변화 검출을 끝내는 몇 사이클 이상 두어야 한다 | 느리다. 4상에서는 한 번의 전송에 양쪽 도메인을 합쳐 8사이클 이상 걸린다 | 빠르다. 매 사이클 1워드씩 쓰고 읽을 수 있다 |
| 수신 측에 도달하기까지의 지연 기준 | 수신 측 클록으로 약 2사이클 | 수신 측 클록으로 약 2~3사이클 | req가 도달하기까지 약 2사이클. ack가 돌아와 다음을 보낼 수 있을 때까지는 다시 왕복만큼 걸린다 | 쓴 워드가 읽기 측에 보일 때까지 약 2~3사이클 |
| 주요 주의점 | 멀티비트에 쓰면 비트마다 받아들이는 사이클이 어긋나 중간 값이 보인다. 빠른 도메인에서 온 짧은 펄스는 사라질 수 있다 | 펄스 간격이 짧으면 토글 신호가 원래대로 돌아가 2번분의 사건을 놓친다 | 데이터는 ack가 돌아올 때까지 바꾸면 안 된다 | 깊이는 버스트 길이와 읽기·쓰기 속도의 차이로 정하고, 동기화 지연만큼의 여유를 더한다 |
| 회로 규모 | 플립플롭 2개(고속 클록에서는 3단으로 하기도) | 플립플롭 몇 개와 XOR | req/ack의 동기화 회로와 양쪽의 상태 기계 | 메모리, 포인터와 그레이 코드 변환, 동기화 회로, full과 empty 판정 회로 |
| 주요 용도 | 인에이블 등의 제어 신호, 비동기 외부 입력 | 빠른 도메인에서 1사이클만 나오는 완료나 인터럽트 통지 | 제어 레지스터 설정값의 전달 | 다른 클록으로 동작하는 버스나 인터페이스 사이의 데이터 전송 |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.