클럭 도메인 전체에 넓은 레지스터를 전달하기위한 버스 동기화 회로가 있습니다.
비동기 재설정 논리를 생략하고 간단한 설명을 제공하겠습니다.
데이터는 한 시계에서 생성됩니다. 업데이트는 시계 가장자리 (수십 개 이상)와 떨어져 있습니다.
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 타이밍 제약 조건은 무엇입니까?