Câu trả lời đơn giản là họ không tự mình làm được. Bộ đồng bộ hóa không có để đảm bảo dữ liệu được truyền qua, nhưng đảm bảo bạn không kết thúc với các tín hiệu siêu bền cung cấp nhiều tín hiệu khác và gây ra sự cố. FF thứ hai như sơ đồ cho thấy bắt được đầu ra FF đầu tiên siêu bền và ngăn không cho nó lan truyền thêm thông qua thiết kế.
Có nhiều loại tín hiệu khác nhau và cách bạn bao gồm các bộ đồng bộ hóa phụ thuộc vào tín hiệu bạn đang nói đến. Nhưng hãy nhìn vào một vài loại phổ biến:
Tín hiệu kích hoạt - hoặc bất kỳ tín hiệu nào về cơ bản là xung phải bắt đầu hoạt động khác. Chúng thường không có dữ liệu và tất cả những gì bạn quan tâm là có một lợi thế đang tăng lên để bắt đầu một thứ gì đó trong miền đồng hồ khác. Để vượt qua những điều này, bạn sẽ cần một bộ đồng bộ hóa (về cơ bản là thực hiện những gì được hiển thị trong sơ đồ của bạn), nhưng bạn cần thêm một chút nữa.
Tùy chọn đơn giản là mở rộng xung - về cơ bản bạn chắc chắn rằng xung đầu vào là hơn 1 chu kỳ đồng hồ của đồng hồ đích (nó nên dài hơn 1 chu kỳ ít nhất lớn hơn của việc thiết lập và giữ thời gian cho thanh ghi đích) . Ví dụ: nếu bạn đang đi từ đồng hồ 20 MHz đến đồng hồ 15 MHz, bạn sẽ đảm bảo xung của bạn là hai chu kỳ xung nhịp ở đầu vào để đảm bảo rằng nó được hiển thị cho đồng hồ đích và không bị mất. Điều này cũng trả lời câu hỏi của bạn trong cách tín hiệu được đảm bảo đi qua. Nếu xung rộng hơn một chu kỳ đồng hồ đích, điều đó có nghĩa là nếu nó di chuyển ở cạnh đồng hồ thứ nhất và cuối cùng được xem là 0, thì ở cạnh đồng hồ thứ hai, nó chắc chắn sẽ bắt được xung.
Bởi vì với loại tín hiệu này, bạn chỉ quan tâm rằng xung đã truyền qua, không thành vấn đề nếu tín hiệu đầu ra kết thúc với hai chu kỳ xung nhịp cao trong một khoảng thời gian và chỉ một chu kỳ còn lại. Nếu bạn cần đảm bảo đó là một xung chu kỳ đơn, bạn có thể khởi tạo một mạch dò cạnh đơn giản.
Xe buýt điều khiển - hoặc có thể các loại xe buýt dữ liệu. Điều này được cho là khó khăn hơn vì nếu bạn có luồng dữ liệu nhiều bit cần được đồng bộ hóa. Trong trường hợp này, những gì bạn sẽ làm là thực hiện một cái gì đó gọi là "bắt tay". Về cơ bản, bạn tải dữ liệu của mình trên đồng hồ nguồn và giữ nó. Sau đó, bạn gửi tín hiệu yêu cầu (như trong 1) qua bộ đồng bộ hóa. Khi tín hiệu yêu cầu xuất hiện, bạn biết rằng bus dữ liệu cũng sẽ được ổn định trong miền đích. Sau đó, bạn có thể đồng hồ nó vào một ngân hàng đăng ký tại điểm đến. Sau đó, đích sẽ gửi lại một xung xác nhận để thông báo cho nguồn rằng nó có thể tải từ tiếp theo.
Bạn sẽ sử dụng loại xe buýt này nếu bạn cần gửi một từ điều khiển đến đồng hồ đích mà bạn cần biết rằng nó đã đến đó trước khi bạn gửi một chiếc khác (ví dụ nếu bạn đang gửi lệnh để làm gì đó).
Xe buýt dữ liệu - đối với dữ liệu mà bạn có nguồn phát ra dữ liệu liên tục hoặc theo đợt, bạn có thể sử dụng một bộ xử lý tốt hơn so với bộ đồng bộ hóa. FIFO sử dụng bộ nhớ đồng hồ kép để giữ dữ liệu, cùng với các bộ đếm để theo dõi lượng dữ liệu trong FIFO. Bạn ghi dữ liệu vào FIFO khi có khoảng trống, sau đó tăng địa chỉ ghi. Địa chỉ này sau đó thường được mã hóa thành sơ đồ "Mã hóa xám", đảm bảo rằng mỗi lần tăng trong địa chỉ chỉ gây ra mộtbit trong bus địa chỉ để thay đổi (có nghĩa là bạn không cần phải đồng bộ hóa nhiều bit). Địa chỉ này sau đó được chuyển đến miền đích (thông qua một trong các chuỗi đồng bộ hóa của bạn), tại đó nó được so sánh với địa chỉ đọc. Nếu có dữ liệu trong FIFO, thì nó có thể được đọc ra khỏi bộ nhớ bằng cổng đồng hồ đích. Địa chỉ đọc tương tự như màu xám được mã hóa và gửi trở lại nguồn thông qua một bộ đồng bộ hóa khác để cổng ghi có thể tính toán nếu có bất kỳ khoảng trống nào trong FIFO.
Đặt lại tín hiệu - những cái này thường sử dụng một phiên bản sửa đổi của bộ đồng bộ hóa trong cái được gọi là "Xác nhận không đồng bộ, Xác nhận đồng bộ". Trong phiên bản được sửa đổi này, đầu vào dữ liệu cho lần lật đầu tiên được gắn với GND và thay vào đó, tín hiệu đặt lại đến được kết nối với tín hiệu đặt trước không đồng bộ của mỗi lần lật trong bộ đồng bộ hóa. Điều này dẫn đến tín hiệu đầu ra hoàn toàn không đồng bộ khi lên cao, nhưng chuỗi đồng bộ hóa đảm bảo rằng nó xuống thấp đồng bộ với đồng hồ đích bằng cách chạy qua các số không trong chuỗi đăng ký.
Kiểu đồng bộ hóa này rất tệ cho dữ liệu và điều khiển, nhưng hoàn toàn phù hợp để đặt lại tín hiệu. Nếu tất cả logic đích cung cấp đầu ra của chuỗi này vào đầu vào thiết lập lại không đồng bộ của bất kỳ thanh ghi nào trong miền, thì sẽ có một chút lo lắng về tính di động trên khẳng định (mặc dù nó không đồng bộ) vì tất cả các thanh ghi đều bị buộc ở trạng thái đã biết. Sau đó, khi tín hiệu đặt lại được xác nhận lại trong miền nguồn, nó sẽ đồng bộ lại trong miền đích có nghĩa là tất cả các thanh ghi ra khỏi thiết lập lại trên cùng một chu kỳ xung nhịp (chứ không phải là chu kỳ +/- 1 nếu đó là xác nhận không đồng bộ).
Như bạn có thể thấy ở trên, việc thực hiện vượt qua miền đồng hồ sẽ phức tạp hơn rất nhiều so với việc chỉ gắn một bộ đồng bộ hóa 2 lật trên tín hiệu. Phương pháp chính xác được sử dụng phụ thuộc vào ứng dụng.