해결된 질문
작성
·
44
·
수정됨
0
26강 4:30에서 Ds가 0 또는 1로 간다고 하셨는데, 메타스태빌리티에서 캡처했기 때문에 값의 상태를 보장할 수 없다로 이해했습니다.
클럭 도메인을 건널 때마다 동기화기를 써서 안정 상태로 보낼 수는 있겠지만, 그 값이 어떻게 변할지 알 수 없다면 어떻게 제어를 할 수 있는지 이해가 잘 안갑니다.
답변 1
1
안녕하세요, 답변 남겨드립니다.
결론부터 말씀드리면, 단일 비트 신호와 멀티 비트 신호는 서로 다른 방식으로 제어하게 됩니다.
단일 비트 신호의 경우, 예를 들어 'write enable'이나 'interrupt'와 같이 토글되면 이벤트가 발생하는 신호라면, 이를 2플립플롭 동기화기를 거쳐서 안정화시킨 후, 후단에서는 신호의 상승/하강 에지를 검출하여 사용합니다. 이때 중요한 것은 동기화된 신호의 에지를 검출하는 것이지, 그 값 자체를 정확히 복원하는 것이 아닙니다. 즉, 신호가 변화했다는 이벤트 검출이 목적이기 때문에 "값이 바뀔 수도 있다"는 애매함은 문제되지 않습니다.
예시로, 송신 도메인에서 tx_req
신호가 High가 되면, 수신 도메인에서는 이 신호를 2단 동기화기 후, tx_req_sync
라는 이름으로 받아서 다음 클럭에서 이전 값과 XOR 하여 에지를 검출합니다. 이렇게 하면 메타스태빌리티가 제거된 신호의 '변화'만을 안정적으로 감지할 수 있습니다.
하지만 멀티 비트 데이터의 경우는 다릅니다. 예를 들어 8비트 데이터 버스를 비동기적으로 전달하면, 각 비트가 서로 다른 시간에 잡히면서 데이터 전체가 깨질 수 있기 때문에, 이를 위해 Async FIFO 같은 구조를 사용합니다. Async FIFO는 쓰기 클럭 도메인과 읽기 클럭 도메인 각각의 동기화 문제를 내부적으로 Gray code 포인터를 이용하여 안전하게 처리하며, 데이터 자체는 램 형태의 버퍼를 통해 전달되므로, 값이 정확히 어떻게 바뀔지 몰라도 적절한 클럭 도메인 간 제어 로직을 설계함으로써 항상 올바른 타이밍에 정확한 데이터를 전달할 수 있습니다.
즉, 메타스태빌리티로 인해 순간적인 불확실성이 생기더라도, 동기화기를 통한 에지 검출 방식 또는 FIFO를 통한 버퍼링 방식으로 그 '불확실성의 결과를 확률적으로 제어 가능한 안정 영역'으로 이동시키는 것이 핵심이며, 이로 인해 시스템 레벨에서 예측 가능성과 제어 가능성이 확보되는 것입니다.