Saat etki alanlarına geniş bir kayıt geçirmek için bir veri yolu eşleyici devresim var.
Eşzamansız sıfırlama mantığını atlayarak basitleştirilmiş bir açıklama sağlayacağım.
Veriler bir saatte üretilir. Güncellemeler birbirinden çok (en az bir düzine) saat kenarından oluşuyor:
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 kodlu taze veriler için kontrol sinyali (bu nedenle veri yolundaki geçerli bir kelime, kontrol sinyali üzerindeki bir geçişe karşılık gelir). Kontrol sinyali, bir eşleyici olarak işlev gören bir DFF zincirinden geçer.
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;
Senkronizör devresi, veri yolunun dengelenmesi için bolca zaman sağlayan kısa bir gecikme sağlar; veri yolu, metastabilite riski olmadan doğrudan örneklenir:
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;
Bu, bir Siklon II FPGA içine sentezlendiğinde derlenir ve iyi çalışır. Ancak TimeQuest, senkronizörü tanımadığından kurulum ve tutma süresi ihlallerini bildirir. Daha da kötüsü, Quartus el kitabı diyor
En kötü boşluğu gösteren yolları geliştirmeye odaklanın. Tesisatçı, en kötü gevşekli yollarda en çok çalışır. Bu yolları düzeltirseniz, Tesisatçı tasarımdaki diğer başarısız zamanlama yollarını iyileştirebilir.
Bu yüzden Quartus'un Fitter çabasını tasarımın diğer alanlarına harcayabilmesi için projeme doğru zamanlama kısıtlamalarını eklemek istiyorum.
set_multicycle_path
Doğru SDC (Synopsis Tasarım Kısıtı) komutunun olduğundan eminim , çünkü veri satırları hedef saatin stabilize edilmesi için birden fazla döngüye sahip olacak, ancak saat etki alanı geçiş mantığını tanımlamak için bu komutu kullanarak tam örnekleri bulamıyorum .
Senkronizörler için SDC zamanlama kısıtlamaları yazma konusunda bazı rehberliklerden gerçekten memnun olurum. Bu yaklaşımla ilgili bir sorun görürseniz, lütfen bunu da bana bildirin.
Saat detay:
Harici saat üreteci: İki kanal, refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz ve ilgili).
Altera PLL: src_clk = refclk * 9/5 = 36 MHz
Altera PLL: dest_clk = refclk2 * 10 = 100 MHz
Ayrıca 100 MHz src_clk ve 36 MHz dest_clk ile diğer yöne giden veri var.
TL; DR: Yukarıdaki kod için doğru SDC zamanlama kısıtlamaları nelerdir?