2013-04-09 3 views
0

FPGA에서 DSO 컨트롤러를 구현하고 있는데 너무 많은 홀드 시간 위반 문제가있다. (지금까지 가장 좋은 결과는 P &이다. .홀드 타임 위반을 제거하는 방법 (자일링스 HDL)

내 문제의 핵심은 ADC 샘플 데시 메이터에서 입력 된 FIFO 버퍼가 있고 동기 FT245 (60MHz)로 출력된다는 것입니다. 입력 데시 메 이터는 ADC 샘플 (150MHz)의 클록 주파수를 또한 나눈 2의 제곱 (예 : 1, 2, 4, 8, 16 ...)으로 데시 메이트로 설정할 수 있습니다.

내 접근 방식은 데이터를 캡처 할 때 버퍼에 클록 주파수를 나누고 (또는 데시 메이터 비율이 0 인 경우 직접) 공급 한 다음 샘플을 PC로 푸시 할 때 FT245에서 60MHz 클록을 공급하도록 전환하는 것입니다. 시뮬레이션에서는 완벽하게 작동하지만, 문제는 위치와 경로에, 그 라우터는이 오류를 뱉어 : 그것은 나를 나를 알리는 보고서 타이밍 제공 때까지 10~15분을 위해 대량으로 분석 그리고

Route:466 - Unusually high hold time violation detected among 226 connections. The top 20 such instances are printed below. The 
    router will continue and try to fix it 

을 모든 설정 시간 제약이 만났고 150MHz 클럭에 대해 3 번의 홀드 시간 위반이 발생했습니다 (60MHz 클럭은 정상입니다).

그 문제는 FPGA가 시계를 제대로 분배 할 수 없다는 것을 읽었지만, FIFO의 클럭 게이팅 대신에 150MHz 클록을 FIFO에 직접 연결하고 FIFO에 데이터를 게이팅하는 방식으로 시도했습니다. dataReady (실제로는 이전에 게이팅 된 클럭과 동일한 신호가 됨)로 인해서 지금보다 훨씬 더 (50-60) 보류 시간 위반이 발생합니다.

다중 클럭 FIFO에 대한 몇 가지 알려진 방법이 있습니까? 단지 2 가지가 아닙니다 (이들은 자일링스 ISE의 ​​예에서도 충분히 볼 수 있습니다). 아니면 FPGA에서 ADC 샘플을 데시 메이팅하지 않을 생각인가?

대상 FPGA는 Spartan 6 LX25 속도 등급 -2입니다 (불행히도 나는 -3 속도 등급으로 내 손을 잡지 못했습니다). 여기

은 저를주고 여유의 예는 다음과 같습니다

Slack (hold path):  -2.031ns (requirement - (clock path skew + uncertainty - data path)) 
    Source:    decimator_clock_divisor/decimationRatio_0 (FF) 
    Destination:   trigger_analog1/previousValue_2 (FF) 

언급 된 소스는 실제로 내가 돈 때문에 GUI에 의해 제어됩니다, 신호 (그리고 날이 제공하는 모든 위반) 매우 자주 변경되지이다 거기에 어떻게 시간차 위반을 저지를 수 있었는지는 알지 못합니다. 데시 메 이터 비율에서 트리거 버퍼 (또는 다른 위반에서는 내 FIFO 버퍼)까지의 경로입니다.

기본적으로 제 질문은 이러한 위반에 대해서도 신경 써야합니까?

데시 메 이터의 비율을 변경 한 후에 트리거에서 데시 메터 결과를 실제로 사용하기 전에 수천 개의 클럭 사이클이 발생할 수 있습니다.

내가 라우터가 비동기 신호 (비동기식 신호를 60MHz 클록 도메인에서 설정했기 때문에)를 얼마나 자주 바꿀지 알 수없고, 일부 모듈의 결과를 사용하는 데 얼마나 걸릴지 알고 있습니다. 문제는이 3 가지 위반에 의해 막혀있는 다른 위반 사항이 없다는 것이 최종 결정 인 경우 완료된 PAR에 대해이 3 가지 위반 사항을 표시 할 때 내가 알지 못한다는 것입니다.

게시판에서 작동하는지 PAR 시뮬레이션 확인을 게시 할 수 있습니까? 나는 그것을 시험해 볼 것이지만 BGA 솔더링을 위해 2 주를 기다려야 만하고 논문을 완성하는데 4 주 밖에 남지 않았으므로 나의 디자인이 효과가 있다는 것을 확신하고 싶다.

답변

2

FIFO는 비동기로 작동 할 수 있습니다. 두 개의 주요 클록 도메인 인 60Mhz와 150Mhz 사이의 경계 브리지. 두 클럭 도메인의 로직을 엄격하게 분리하십시오.의사 소통을 위해서는 저속 제어 신호가 몇 개만 있어야합니다 (충분히 느려서 잘못된 경로 타이밍 제약이 적용될 수 있음). 예를 들어, GUI는 클럭 비율을 60Mhz 측면의 레지스터에 기록합니다. 그런 다음 새로운면에서 빠른쪽으로 신호를 보냅니다. 빠른 쪽에서는 알림을받은 후 일부 값 (예 : 메타 안정성에 대한 추가주의)으로이 값을 캡처합니다. 고속 측의 기능 로직은 항상 고속 측에있는이 쉐도우 레지스터의 출력을 사용합니다.

빠른 ADC 측에서 나누는 시계의 경우 전체 시계를 사용하고 설명대로 활성화 할 수 있으며 시계를 나눌 수도 있습니다. 클록을 분리 할 때 Xilinx 설명서의 예를 따르십시오. 예를 들어 시계를 분배하기 위해 때때로 시계 버퍼가 필요합니다.

홀드 경로 위반이 남아 있으면 소스 및 대상 FF의 클럭 및 클럭 도착 시간을 살펴보십시오. 때로는 목적지 FF의 캡쳐 클록이 지연 될 때 데이터가 빠르다. 라우터는 단순히 데이터를 지연시킴으로써이를 고칠 수 있습니다. 셋업 요구 사항이 추가 지연을 허용하지 않을 때이를 수정할 수 없습니다 (두 클럭 간의 불확실성이 너무 높을 수 있음).

+0

나는 타이밍 점수 0으로 PAR을 얻을 수 있었기 때문에 당신의 제안 덕분에 대답으로 받아들입니다. –