클럭 도메인 전체에 넓은 레지스터를 전달하기위한 버스 동기화 회로가 있습니다.
비동기 재설정 논리를 생략하고 간단한 설명을 제공하겠습니다.
데이터는 한 시계에서 생성됩니다. 업데이트는 시계 가장자리 (수십 개 이상)와 떨어져 있습니다.
PROCESS (src_clk)
BEGIN
IF RISING_EDGE(clock) THEN
IF computation_done THEN
data <= computation;
ready_spin <= NOT ready_spin;
END IF;
END IF;
END PROCESS;
새로운 데이터에 대한 제어 신호는 NRZI로 인코딩됩니다 (따라서 버스의 유효한 단어는 제어 신호의 전환에 해당합니다). 제어 신호는 동기화 기 역할을하는 DFF 체인을 통과합니다.
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
ready_spin_q3 <= ready_spin_q2;
ready_spin_q2 <= ready_spin_q1;
ready_spin_q1 <= ready_spin;
END IF;
END PROCESS;
동기화 회로는 짧은 지연을 발생시켜 데이터 버스가 안정화되는 데 충분한 시간을 제공합니다. 데이터 버스는 전이 가능성의 위험없이 직접 샘플링됩니다.
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
IF ready_spin_q3 /= ready_spin_q2 THEN
rx_data <= data;
END IF;
END IF;
END PROCESS;
이것은 Cyclone II FPGA로 합성 될 때 컴파일되고 잘 작동합니다. 그러나 TimeQuest는 동기화 프로그램을 인식하지 않기 때문에 설정 및 보류 시간 위반을보고합니다. 더 나쁜 것은, Quartus 매뉴얼은 말합니다
가장 느슨해 진 경로를 개선하는 데 집중하십시오. Fitter는 가장 느슨해 진 경로에서 가장 열심히 작동합니다. 이러한 경로를 수정하면 Fitter가 설계에서 다른 실패한 타이밍 경로를 개선 할 수 있습니다.
Quartus가 디자인의 다른 영역에 Fitter 노력을 기울일 수 있도록 프로젝트에 올바른 타이밍 제약 조건을 추가하고 싶습니다.
set_multicycle_path
데이터 라인이 안정화하기 위해 대상 클럭의 여러 사이클을 갖기 때문에 올바른 SDC (Synopsis Design Constraint) 명령 이라고 확신 하지만 클럭 도메인 교차 로직을 설명하기 위해이 명령을 사용하는 완전한 예제를 찾을 수 없습니다 .
싱크로 나이저를위한 SDC 타이밍 제약 조건을 작성하는 데 도움이 될만한 지침에 감사드립니다. 이 방법으로 문제가 발생하면 알려주십시오.
시계 세부 사항 :
외부 클록 생성기 : refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz 및 관련)의 두 채널.
알테라 PLL : src_clk = refclk * 9/5 = 36 MHz
알테라 PLL : dest_clk = refclk2 * 10 = 100 MHz
또한 100 MHz src_clk 및 36 MHz dest_clk와 함께 다른 방향으로 진행되는 데이터가 있습니다.
TL; DR : 위 코드에 대한 올바른 SDC 타이밍 제약 조건은 무엇입니까?