ฉันเป็นวงจรซิงโครไนซ์บัสเพื่อส่งต่อการลงทะเบียนทั่วโดเมนนาฬิกา
ฉันจะให้คำอธิบายที่ง่ายขึ้นโดยไม่ใช้ตรรกะการรีเซ็ตแบบอะซิงโครนัส
ข้อมูลถูกสร้างขึ้นในหนึ่งนาฬิกา การอัพเดตมีขอบเขตนาฬิกา (อย่างน้อยหนึ่งโหล) เป็นจำนวนมาก:
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 อาจสามารถปรับปรุงเส้นทางเวลาที่ล้มเหลวอื่น ๆ ในการออกแบบ
ดังนั้นฉันต้องการเพิ่มข้อ จำกัด เวลาที่เหมาะสมให้กับโครงการของฉันเพื่อที่ Quartus จะใช้ความพยายามของช่างฟิตในด้านอื่น ๆ ของการออกแบบ
ฉันค่อนข้างแน่ใจว่า set_multicycle_path
เป็นคำสั่ง SDC (ข้อ จำกัด การออกแบบเรื่องย่อ) ที่เหมาะสมเนื่องจากบรรทัดข้อมูลจะมีนาฬิกาปลายทางหลายรอบเพื่อทำให้เสถียร แต่ฉันไม่สามารถหาตัวอย่างที่สมบูรณ์ได้โดยใช้คำสั่งนี้เพื่ออธิบายตรรกะการข้ามโดเมนนาฬิกา .
ฉันขอขอบคุณคำแนะนำเกี่ยวกับการเขียนข้อ จำกัด เรื่องเวลาของ SDC สำหรับ synchronizers หากคุณพบปัญหาเกี่ยวกับวิธีการนี้โปรดแจ้งให้เราทราบด้วย
รายละเอียดนาฬิกา:
ตัวสร้างสัญญาณนาฬิกาภายนอก: สองช่องสัญญาณ, refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz, และที่เกี่ยวข้อง)
Altera PLL: src_clk = refclk * 9/5 = 36 MHz
Altera PLL: dest_clk = refclk2 * 10 = 100 MHz
ฉันยังมีข้อมูลไปในทิศทางอื่นด้วย 100 MHz src_clk และ 36 MHz dest_clk
TL: DR: อะไรคือข้อ จำกัด เวลาของ SDC ที่ถูกต้องสำหรับโค้ดด้านบน