Tôi có một mạch đồng bộ hóa xe buýt để vượt qua một thanh ghi rộng trên các miền đồng hồ.
Tôi sẽ cung cấp một mô tả đơn giản hóa, bỏ qua logic đặt lại không đồng bộ.
Dữ liệu được tạo ra trên một đồng hồ. Các bản cập nhật có rất nhiều (ít nhất một chục) cạnh đồng hồ:
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;
Tín hiệu điều khiển cho dữ liệu mới, được mã hóa NRZI (vì vậy một từ hợp lệ trên bus tương ứng với chuyển đổi trên tín hiệu điều khiển). Tín hiệu điều khiển đi qua chuỗi DFF hoạt động như một bộ đồng bộ hóa.
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;
Mạch đồng bộ hóa giới thiệu độ trễ ngắn, cung cấp nhiều thời gian để bus dữ liệu ổn định; bus dữ liệu được lấy mẫu trực tiếp mà không có rủi ro về tính di động:
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;
Điều này biên dịch và hoạt động tốt khi được tổng hợp thành một Cyclone II FPGA. Tuy nhiên, TimeQuest báo cáo thiết lập và giữ vi phạm thời gian, vì nó không nhận ra trình đồng bộ hóa. Tệ hơn, hướng dẫn sử dụng Quartus nói
Tập trung vào việc cải thiện các con đường cho thấy sự chậm chạp tồi tệ nhất. Fitter làm việc chăm chỉ nhất trên những con đường với sự chậm chạp tồi tệ nhất. Nếu bạn sửa các đường dẫn này, Fitter có thể cải thiện các đường dẫn thời gian thất bại khác trong thiết kế.
Vì vậy, tôi muốn thêm các ràng buộc thời gian phù hợp vào dự án của mình để Quartus sẽ dành nỗ lực Fitter của mình cho các lĩnh vực khác của thiết kế.
Tôi khá chắc chắn đó set_multicycle_path
là lệnh SDC (Synopsis Design Constraint) thích hợp, vì các dòng dữ liệu sẽ có nhiều chu kỳ của đồng hồ đích để ổn định, nhưng tôi không thể tìm thấy bất kỳ ví dụ hoàn chỉnh nào sử dụng lệnh này để mô tả logic vượt qua miền đồng hồ .
Tôi thực sự đánh giá cao một số hướng dẫn về cách viết các ràng buộc thời gian SDC cho đồng bộ hóa. Nếu bạn thấy một vấn đề với phương pháp này, xin vui lòng cho tôi biết điều đó.
Chi tiết đồng hồ:
Trình tạo đồng hồ bên ngoài: Hai kênh, refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz và có liên quan).
Altera PLL: src_clk = refclk * 9/5 = 36 MHz
Altera PLL: Dest_clk = refclk2 * 10 = 100 MHz
Tôi cũng có dữ liệu đi theo hướng khác, với 100 MHz src_clk và 36 MHz Dest_clk.
TL; DR: các ràng buộc thời gian SDC chính xác cho mã trên là gì?