태그 보관물: fpga

fpga

2-ff 동기화 프로그램은 어떻게 적절한 동기화를 보장합니까? 가로 지르는 신호의 표준입니다. 그리고

2-ff 싱크로 나이저를 사용하는 것은 신호 경계를 가로 지르는 신호의 표준입니다. 그리고 다음과 같은 메커니즘을 설명하는 많은 종이 / 그림이 있습니다.여기에 이미지 설명을 입력하십시오

보인다 BCLK가 만의 샘플링 펄스 수 ADAT을 한 번 (두 번째 상승 에지에서 BCLK 의 출력 빌리티 발생) bq1_dat . 다음 활성 클럭 에지에서 bq1_dat를 어떻게 “높음”으로 샘플링 할 수 있습니까?


내 질문 외에도 신호가 다른 클럭 도메인으로 안전하게 통과 할 것이라고 생각하는 것을 추가하고 싶습니다 (2-FF는 MTBF 요구 사항을 충족시키기에 충분하다고 가정). 실수가 있으면 수정 해주세요.

여기에 이미지 설명을 입력하십시오

ps : 준 안정 상태는 “방황”파형을 표시하지 않지만 ‘1’또는 ‘0’이 아닌 레벨을 표시합니다. 다음 그림은 준 안정 출력의 예를 보여줍니다.여기에 이미지 설명을 입력하십시오

원래 그림은 WJ Dally의 EE108A, 강의 13 : 메타 스타 빌리티 및 동기화 실패 (이전의 플립 플롭이 나빠질 때)에 대한 강의 노트에서 발췌 한 것입니다.



답변

간단한 대답은 그들이 스스로하지 않는다는 것입니다. 동기화 기는 데이터를 가로 지르는 것이 아니라, 많은 다른 신호를 공급하고 문제를 일으키는 준 안정 신호로 끝나지 않도록합니다. 다이어그램에 표시된 두 번째 FF는 준 안정적인 첫 번째 FF 출력을 포착하여 디자인을 통해 더 이상 전파되는 것을 방지합니다.

다양한 종류의 신호가 있으며 동기화기를 포함하는 방법은 사용중인 신호에 따라 다릅니다. 그러나 몇 가지 일반적인 유형을 살펴 보겠습니다.

  1. 트리거 신호 -또는 기본적으로 실행중인 다른 것을 시작해야하는 펄스 인 신호. 이것들은 일반적으로 데이터를 가지고 있지 않으며, 당신이 관심있는 것은 다른 클럭 도메인에서 무언가를 시작하기 위해 상승 에지가 있다는 것입니다. 이것들을 극복하기 위해서는 동기화 기가 필요하지만 (필수적으로 다이어그램에 표시된 것을 수행) 조금 더 필요합니다.

    가장 간단한 옵션은 펄스를 연장하는 것입니다. 기본적으로 입력 펄스가 대상 클록의 1 클럭주기 이상 인지 확인하십시오 (대상 레지스터의 설정 및 홀드 시간보다 적어도 1주기 이상 길어야합니다) . 예를 들어, 20MHz 클럭에서 15MHz 클럭으로가는 경우 펄스가 입력에서 2 클럭 사이클이되어 대상 클록에 표시되고 손실되지 않도록해야합니다. 또한 신호가 어떻게 전달되는지에 대한 귀하의 질문에 답변합니다. 펄스가 하나의 대상 클럭주기보다 넓은 경우, 첫 번째 클럭 에지에서 준 안정화되고 0으로 표시되면 두 번째 클럭 에지에서 펄스를 확실히 포착합니다.

    이 유형의 신호를 사용하면 펄스가 도달 한 것에 만 관심이 있기 때문에 출력 신호가 시간의 높은 두 클럭 사이클로 끝나고 나머지는 한 사이클 만 끝나도 상관 없습니다. 단일 사이클 펄스인지 확인해야하는 경우 간단한 에지 검출기 회로를 인스턴스화 할 수 있습니다.

  2. 제어 버스 – 또는 가능한 유형의 데이터 버스. 멀티 비트 데이터 스트림이 있으면 동기화 상태를 유지해야하므로이 방법이 더 어려울 수 있습니다. 이 경우 “핸드 셰이 킹”이라는 것을 구현해야합니다. 기본적으로 소스 클럭에 데이터를로드하고 유지합니다. 그런 다음 동기화기를 통해 요청 신호 (1과 같은)를 보냅니다. 요청 신호가 전달되면 대상 버스에서도 데이터 버스가 안정화된다는 것을 알게됩니다. 그런 다음 대상의 레지스터 뱅크에 클럭킹 할 수 있습니다. 그런 다음 대상은 확인 펄스를 다시 보내 소스에 다음 단어를로드 할 수 있음을 알립니다.

    다른 종류의 버스를 보내기 전에 제어 워드를 보내야하는 대상 클럭에 제어 워드를 보내야하는 경우 (예 : 무언가 명령을 보내는 경우) 이러한 버스를 사용합니다.

  3. 데이터 버스 -데이터를 지속적으로 또는 버스트로 내뿜는 소스가있는 데이터의 경우 동기화 기보다 FIFO를 사용하는 것이 좋습니다. FIFO는 듀얼 클럭 메모리를 사용하여 데이터를 보유하고 카운터와 함께 FIFO에 얼마나 많은 데이터가 있는지 추적합니다. 공간이 있으면 FIFO에 데이터를 쓴 다음 쓰기 주소를 증가시킵니다. 이 주소는 다음 일반적으로 주소의 각 증가는 원인이 있음을 보장하는 “회색 코딩”기법으로 인코딩 주소 버스의 비트를 변경하려면 여러 비트를 동기화 할 필요가 없습니다. 그런 다음이 주소는 (동기화 체인 중 하나를 통해) 대상 도메인으로 전송되며 여기서 읽기 주소와 비교됩니다. FIFO에 데이터가 있으면 대상 클럭 포트를 사용하여 메모리에서 데이터를 읽을 수 있습니다. 읽기 주소는 마찬가지로 회색으로 코딩되고 다른 동기화기를 통해 소스로 다시 전송되므로 쓰기 포트가 FIFO에 공간이 있는지 계산할 수 있습니다.

  4. 리셋 신호 – 일반적으로 “비동기 어설트, 동기 디 어서 트”에서 수정 된 버전의 동기화를 사용합니다. 이 수정 된 버전에서, 제 1 플립 플롭에 입력 된 데이터는 GND에 연결되고, 대신 수신 리셋 신호는 동기화 기에서 각 플립 플롭의 비동기식 프리셋 신호에 연결된다. 결과적으로 출력 신호가 높을 때 완전히 비동기적인 출력 신호가 발생하지만 동기화 체인은 레지스터 체인에서 0을 통해 클럭함으로써 대상 클록과 동 기적으로 낮아지게합니다.

    이 유형의 동기 장치는 데이터 및 제어에 끔찍하지만 신호 재설정에 완벽하게 적합합니다. 모든 대상 논리가이 체인의 출력을 도메인에있는 모든 레지스터의 비동기 리셋 입력에 공급하는 경우 모든 레지스터가 알려진 상태로 강제 설정되므로 assert에서 메타 스타 빌리티에 대한 걱정이 거의 없습니다 (비동기 적 임에도 불구하고). 그런 다음 소스 도메인에서 리셋 신호가 디 어설트되면 대상 도메인에서 동 기적으로 디 어설트되므로 모든 레지스터는 동일한 클록 사이클 (비동기 디 어설트 인 경우 +/- 1 사이클이 아닌)에서 리셋되지 않습니다.


위에서 볼 수 있듯이 신호에 2 개의 플립 플롭 동기기를 붙이는 것보다 클록 도메인 교차를 수행하는 것이 훨씬 더 복잡합니다. 사용되는 정확한 방법은 응용 프로그램에 따라 다릅니다.


답변

1) 도면을 예로 사용하면 aclk와 bclk는 서로 비동기 적입니다. 즉, 클럭 소스가 다릅니다. 그들은 adat를 유효한 데이터로 표시하지만 aclk에만 동기화합니다. bclk 싱크로 나이저가 사용됩니다.

2)이 그림은 최악의 시나리오를 가정합니다. bq1 FF는 데이터 끝 부분의 일부만 포착하여 출력이 일반적으로 가비지 인 준 안정 상태를 생성하기 때문에 bq1_dat가 지저분한 출력입니다. 요령은 다음과 같습니다. Bq2는 bq1과 동일한 bclk를 갖지만 데이터가 통과하여 bq2_dat에 표시 되려면 2 클럭 사이클의 bclk가 필요합니다.

3) 첫 번째 bclk가 데이터의 일부를 캡처하여 지저분한 결과를 낳았지만 두 번째 bclk는 1 클럭 사이클 후에 bq1_dat의 모호한 데이터가 높거나 낮은 상태로 정착하기에 충분한 시간입니다. 지저분한 bq1_dat 펄스는 bq2가 유효한 논리 ‘1’(논리 높음)을 캡처하고 유효하고 현재 동기화 된 데이터 (논리 높음)로 bq2_dat에 전달할 정도로 오래 지속되었습니다.

4) 다운 스트림에서, bclk를 사용하는 모든 시계는 작업 할 데이터를 동기화합니다. 최초의 bclk FF만이 준 안정 상태를 다루어야한다는 것을 주목하라 . adat가 피코 또는 나노초에 너무 늦었다면 출력은 로직이 낮을 수 있습니다. 이 플립 플롭은 클럭의 상승 에지에서만 데이터 입력을 샘플링한다는 것을 기억하십시오. 상승 에지 전후에 발생하는 현상은 무시됩니다.


답변