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단으로 하기도)플립플롭 몇 개와 XORreq/ack의 동기화 회로와 양쪽의 상태 기계메모리, 포인터와 그레이 코드 변환, 동기화 회로, full과 empty 판정 회로
주요 용도인에이블 등의 제어 신호, 비동기 외부 입력빠른 도메인에서 1사이클만 나오는 완료나 인터럽트 통지제어 레지스터 설정값의 전달다른 클록으로 동작하는 버스나 인터페이스 사이의 데이터 전송

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

2단 동기화 회로
1비트 레벨 신호이며 수신 측 주기보다 충분히 길게 유지될 때. 모든 방식의 토대이며, 클록이 빠를 때나 MTBF를 더 길게 하고 싶을 때는 3단으로 합니다.
토글 동기화
빠른 도메인에서 나오는 짧은 펄스를 놓치지 않고 느린 도메인으로 전하고 싶을 때. 다음 펄스까지 수신 측의 몇 사이클 이상의 간격이 있는 경우로 한정됩니다.
핸드셰이크
설정값 같은 멀티비트 데이터를 가끔 확실하게 전달하고 싶을 때. 주파수 비와 관계없이 안전하지만, 한 번의 전송에 여러 사이클이 걸립니다.
비동기 FIFO
데이터를 연속으로, 또는 높은 빈도로 전달하고 싶을 때. 속도 차이나 버스트를 흡수할 수 있지만, 회로는 가장 커집니다.

자주 묻는 질문

멀티비트 데이터에 비트마다 2단 동기화 회로를 달면 안 되는 이유는 무엇인가요?

비트마다 변화를 이번 에지에서 받아들일지 다음 에지에서 받아들일지가 정해지지 않기 때문입니다. 예를 들어 0111에서 1000으로 바뀔 때, 일부 비트만 새 값이 된 1111이나 0000을 1사이클 받을 수 있습니다. 데이터 자체는 동기화하지 않고 유지해 두고 1비트 제어 신호만 동기화하는 핸드셰이크나, 비동기 FIFO를 씁니다. 카운터 값이라면 그레이 코드로 만들어 1비트씩만 바뀌게 하는 방법도 있습니다.

동기화 회로를 2단에서 3단으로 하면 무엇이 바뀌나요?

메타스테이블이 가라앉는 데 쓸 수 있는 시간이 약 1주기 늘어나, 평균 고장 간격(MTBF)이 지수 함수적으로 길어집니다. MTBF는 대략 e^(t_r/τ) ÷ (T_0 × f_clk × f_data)로 나타내며, 예를 들어 τ = 20 ps에서 t_r이 1 ns 늘어나면 MTBF는 e^50배(10의 21제곱 배 이상)가 됩니다. 그 대신 수신 측에 도달하기까지의 지연이 1사이클 늘어납니다.

비동기 FIFO의 포인터를 그레이 코드로 하는 이유는 무엇인가요?

바이너리 포인터는 0111에서 1000처럼 여러 비트가 동시에 바뀌므로, 따로따로 동기화하면 전혀 관계없는 값을 받을 수 있기 때문입니다. 그레이 코드라면 하나 나아갈 때마다 바뀌는 것은 1비트뿐이므로, 그 비트가 메타스테이블이 되어 새 값과 이전 값 중 어느 쪽으로 정해지더라도 결과는 나아가기 전이나 나아간 뒤의 값입니다. 조금 오래된 값을 볼 뿐이므로 full과 empty 판정은 안전한 쪽으로 작동합니다.

비동기 FIFO의 깊이는 어떻게 정하나요?

쓰기 버스트 동안 읽기가 따라가지 못해 쌓이는 최대량으로 정합니다. 쓰기 측 100 MHz, 읽기 측 80 MHz에서 100워드의 버스트를 매 사이클 쓰고 매 사이클 읽는다면 100 × (1 − 80/100) = 20워드입니다. 실제 설계에서는 포인터 동기화 지연만큼의 여유를 더합니다.

이해도 확인

2단 플립플롭 동기화기를 3단으로 늘렸을 때, 메타스테빌리티로 인한 고장의 평균 간격(MTBF)의 변화로 올바른 것은?

  1. A메타스테이블 상태가 해소되는 데 쓸 수 있는 시간이 약 1주기 늘어나 MTBF는 지수함수적으로 길어진다
  2. B단수에 비례하여 MTBF가 1.5배가 된다
  3. C메타스테빌리티의 발생 빈도는 입력 측에서 정해지므로 MTBF는 변하지 않는다
정답과 해설 보기

정답: A. 메타스테이블 상태가 해소되는 데 쓸 수 있는 시간이 약 1주기 늘어나 MTBF는 지수함수적으로 길어진다

동기화기의 MTBF는 대략 MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data)로 나타냅니다. t_r은 메타스테이블 상태가 해소되는 데 쓸 수 있는 시간, τ와 T_0는 플립플롭의 특성으로 정해지는 상수입니다. 단을 하나 늘리면 t_r이 약 1주기(정확히는 1주기에서 플립플롭의 출력 지연과 셋업 시간을 뺀 만큼) 늘어납니다. 예를 들어 τ = 20 ps에서 t_r이 1 ns 늘면 MTBF는 e^50배, 즉 10의 21제곱 배 이상으로 늘어납니다. 1단째가 메타스테이블 상태가 될 확률은 변하지 않지만, 그 앞으로 전달되기 전에 해소될 확률이 크게 높아지는 것입니다.

4비트 데이터의 각 비트에 각각 2단 동기화기를 달아 다른 클럭 도메인으로 전달했습니다. 데이터가 0111에서 1000으로 바뀔 때 일어날 수 있는 문제로 올바른 것은?

  1. A비트마다 캡처되는 사이클이 어긋나 1111이나 0000 같은 중간 값을 받는 경우가 있다
  2. B동기화기를 거치면 모든 비트가 같은 사이클에 맞춰지므로 문제는 일어나지 않는다
  3. C4비트 모두 메타스테이블 상태가 되어 그대로 0으로도 1로도 돌아오지 않게 된다
정답과 해설 보기

정답: A. 비트마다 캡처되는 사이클이 어긋나 1111이나 0000 같은 중간 값을 받는 경우가 있다

2단 동기화기는 비트마다 변화를 캡처하는 것이 이번 에지인지 다음 에지인지가 확정되지 않습니다. 0111에서 1000으로의 변화에서는 4비트가 모두 바뀌므로, 일부 비트만 새 값이 된 1111이나 0000, 0100 등을 1사이클 동안 받을 수 있습니다. 수신 측이 그 값을 사용하면 오동작합니다. 메타스테이블 상태는 시간이 지나면 0이나 1로 안정됩니다. 카운터 값이라면 그레이 코드로 변환하여 1비트만 바뀌도록 하고, 임의의 데이터라면 핸드셰이크나 비동기 FIFO를 사용합니다.

토글 동기화(송신 측에서 펄스가 올 때마다 반전하는 레벨 신호를 만들어 전달하는 방식)에서 수신 측이 원래 펄스를 복원하는 방법으로 올바른 것은?

  1. A동기화한 토글 신호를 그대로 펄스로 사용한다
  2. B동기화한 토글 신호와 수신 측 클럭의 AND를 취해 1사이클 폭의 펄스로 만든다
  3. C동기화한 토글 신호와, 그것을 1단 더 지연시킨 신호의 XOR를 취한다
정답과 해설 보기

정답: C. 동기화한 토글 신호와, 그것을 1단 더 지연시킨 신호의 XOR를 취한다

토글 동기화에서는 송신 측에서 펄스가 올 때마다 플립플롭의 값을 반전시켜, 0에서 1, 1에서 0으로의 변화로 이벤트를 나타냅니다. 레벨 신호이므로 수신 측 주기보다 짧은 펄스라도 사라지지 않습니다. 수신 측에서는 2단으로 동기화한 후 1단 더 지연시킨 값과 XOR를 취하면, 변화가 있었던 사이클에만 1이 되는 1사이클 폭의 펄스를 얻을 수 있습니다. 토글 신호를 그대로 사용하면 두 번째 이벤트에서 0으로 돌아갔을 때 놓칩니다. 클럭과의 논리 연산은 글리치의 원인이 됩니다.

  1. 핸드셰이크를 이용한 클럭 도메인 간 데이터 전송의 단점으로 올바른 것은?
  2. 비동기 FIFO에서 쓰기 포인터와 읽기 포인터를 그레이 코드로 변환한 후 상대 도메인으로 동기화하는 이유로 올바른 것은?
  3. 쓰기 측 100 MHz, 읽기 측 80 MHz인 비동기 FIFO에서 쓰기 측은 100워드의 버스트를 매 사이클 1워드씩 쓰고, 읽기 측은 매 사이클 1워드씩 읽습니다. 버스트 사이에는 충분한 휴지 기간이 있습니다. 넘치지 않기 위해 필요한 최소 깊이는 얼마입니까(동기화로 인한 지연은 무시합니다)?

타이밍 분석과 CDC 문제 풀기

주요 용어 설명

동기화 회로(Synchronizer)
비동기 신호를 수신 측 클록에 맞추는 회로로, 싱크로나이저라고도 한다. 2단 플립플롭을 직렬로 연결하는 구성이 기본이며, 1단째가 메타스터빌리티 상태가 되어도 다음 에지까지 안정될 확률을 높인다.
토글 동기화(Toggle Synchronizer)
송신 측에서 펄스가 올 때마다 반전하는 레벨 신호를 만들어 수신 측으로 동기화하고, 수신 측에서 1사이클 전의 값과 XOR을 취해 펄스로 되돌리는 방식. 수신 측 주기보다 짧은 펄스도 놓치지 않지만, 펄스 간격은 수신 측의 수 사이클 이상 띄워야 한다.
핸드셰이크(Handshake)
송신 측의 요구(req)와 수신 측의 응답(ack)을 주고받아 데이터를 확실하게 전달하는 방식. 클록 도메인 사이에서는 req와 ack만 동기화하고 그동안 데이터를 고정해 두므로 안전하지만, 1회 전송에 수 사이클 이상 걸린다.
비동기 FIFO
쓰기와 읽기를 서로 다른 클록으로 하는 FIFO로, 클록 도메인 사이에서 멀티비트 데이터를 전달하는 데 사용한다. 포인터를 그레이 코드로 변환하여 상대 도메인에 동기화하고, 가득 참(full)과 비어 있음(empty)을 판정한다. 포인터는 주소보다 1비트 많게 하여 순환을 구별한다.
클록 도메인(Clock Domain)
같은 클록, 또는 주파수와 위상의 관계가 정해진 클록으로 동작하는 플립플롭의 집합. 비동기 관계에 있는 클록 도메인 사이에서 신호를 전달할 때는 동기화 회로가 필요하다.
메타스터빌리티(Metastability)
플립플롭에서 셋업 시간이나 홀드 시간이 지켜지지 않을 때 출력이 한동안 0도 1도 아닌 상태로 정해지지 않는 현상. 비동기 신호는 2단 플립플롭으로 동기화하여 대처한다.
그레이 코드(Gray Code)
인접한 값 사이에서 1비트만 변하는 부호. 로터리 인코더나 서로 다른 클록 간의 카운터 값 전달에서 읽기 오류를 방지하는 데 쓰인다.
MTBF(평균 고장 간격)
고장이 일어나는 평균 간격. 동기화 회로에서는 메타스터빌리티가 해소되지 않고 후단으로 전달되는 평균 간격을 가리키며, MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data)로 나타낸다. 단수를 늘려 안정될 때까지의 시간 t_r을 늘리면 지수 함수적으로 길어진다.

관련 비교