Làm thế nào để đồng bộ hóa 2-ff đảm bảo đồng bộ hóa đúng?


9

Sử dụng đồng bộ hóa 2-ff đã là một tiêu chuẩn cho tín hiệu vượt qua các ranh giới đồng hồ. Và có rất nhiều giấy / hình minh họa cho cơ chế, chẳng hạn như cái này:nhập mô tả hình ảnh ở đây

Có vẻ như bclk chỉ có thể lấy mẫu xung của adat một lần (ở cạnh tăng thứ hai của bclk ), điều này gây ra tính di động đầu ra trên bq1_dat . Làm thế nào bq1_dat có thể được lấy mẫu "cao" trên cạnh đồng hồ hoạt động tiếp theo?


Ngoài câu hỏi của tôi, tôi muốn thêm những gì tôi nghĩ để tín hiệu truyền qua miền đồng hồ khác một cách an toàn (giả sử 2-FF là đủ để đáp ứng yêu cầu của MTBF). Xin hãy sửa tôi nếu có lỗi.

nhập mô tả hình ảnh ở đây

ps: Trạng thái siêu bền không hiển thị dạng sóng "đi loanh quanh", nhưng mức không phải là '1' hay '0'. Hình dưới đây cho thấy một ví dụ về đầu ra siêu bền.nhập mô tả hình ảnh ở đây

Con số ban đầu đến từ các ghi chú bài giảng cho EE108A, Bài giảng 13: Khả năng di chuyển và thất bại đồng bộ hóa (ow Khi dép tốt bị hỏng) của WJ Dally.


4
Tôi chỉ muốn nói rằng các sơ đồ hiển thị đầu ra siêu bền "đi loanh quanh" là cực kỳ sai lệch. Đó không phải là những gì siêu di động trông giống như tất cả. Khi FF có thể di chuyển, đầu ra của nó sẽ chuyển sang một điện áp trung gian cụ thể (giá trị phụ thuộc vào công nghệ thực hiện) và vẫn ở đó. Sau một khoảng thời gian không thể đoán trước, điện áp sau đó sẽ dao động cao hoặc thấp, và cách nó đi cũng không thể đoán trước được.
Dave Tweed

@Dave Tweed ♦ Cảm ơn bạn đã bình luận. Trong hầu hết tất cả các tài liệu tôi đã đọc liên quan đến tính di động, tôi đã thấy các dạng sóng "đi loanh quanh". Tôi đã tìm kiếm xung quanh và tìm thấy một bài đăng ( Nếu một flip flop có vi phạm thiết lập và có thể di chuyển, nó có được đảm bảo để giải quyết giá trị đầu vào khi nó kết thúc dao động không? ) Có chứa một cảnh quay từ phạm vi o với trạng thái siêu bền được chụp. Một liên kết đến tham chiếu ban đầu của hình được bao gồm trong bài viết đó.
fiedel

Vâng, điều đó minh họa quan điểm của tôi một cách hoàn hảo, và bài thuyết trình Powerpoint mà nó xuất phát có rất nhiều thông tin tốt trong đó.
Dave Tweed

Câu trả lời:


8

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:

  1. 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.

  2. 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ì đó).

  3. 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.

  4. Đặ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.


Ngoài câu trả lời của Tom, tôi muốn thêm một tài liệu tham khảo về PoC , nơi có triển khai cho các trường hợp này. Các tài liệu đồng bộ hóa có sẵn trên RTD. Bổ sung cho lý thuyết xâu chuỗi 2 flip-flop cho bộ đồng bộ hóa 2-FF cơ bản, PoC cung cấp các triển khai chuyên dụng ( sync_Bits) cho Xilinx và Altera FPGA để cải thiện hành vi siêu bền. Bộ đồng bộ hóa 2-FF được sử dụng ví dụ sync_Strobeđể xây dựng các bộ đồng bộ hóa phức tạp hơn cho các xung.
Paebbels

Cảm ơn bạn đã giới thiệu chi tiết về các chiến lược đồng bộ hóa. Bức ảnh này xuất phát từ "Kỹ thuật thiết kế & xác minh miền đồng hồ (CDC) sử dụng systemverilog" của Clifford E. Cummings. Tôi hiểu rằng đối với tín hiệu một bit, độ rộng phải có ít nhất 1 chu kỳ xung nhịp + thời gian thiết lập + thời gian giữ của bên nhận để nó vượt qua an toàn. Trong ảnh này, tiêu chí này không được thỏa mãn vì xung của adat được lấy mẫu bằng các mẫu bclk chỉ một lần trên cạnh rơi của nó, khiến bq1_dat có thể di chuyển được.
fiedel

... Do đó, việc đọc bq1_dat ở cạnh tăng tiếp theo của bclk có thể là '0' hoặc '1'. Vì vậy, việc đồng bộ hóa trong hình ảnh dường như không thành công. Tôi có đúng không
fiedel

@Paebbels Cảm ơn bạn đã tham khảo. Sẽ xem xét =)
fiedel

Bạn nên chỉnh sửa câu hỏi này thành câu hỏi của bạn, không đăng nó dưới dạng câu trả lời, nhưng về cơ bản, vâng, bạn có thể hoặc không thể lấy 1 ở đầu ra trong ví dụ đó.
Tom Carpenter

1

1) Sử dụng bản vẽ của bạn làm ví dụ, aclk và bclk không đồng bộ với nhau. Nói cách khác, họ có các nguồn đồng hồ khác nhau. Họ đang hiển thị adat dưới dạng dữ liệu hợp lệ nhưng chỉ được đồng bộ hóa với aclk. Đây là nơi mà bộ đồng bộ hóa bclk phát huy tác dụng.

2) Bản vẽ này giả sử trường hợp xấu nhất, trong đó bq1_dat là đầu ra lộn xộn vì bq1 FF chỉ bắt được một phần của phần cuối của dữ liệu, tạo ra trạng thái có thể di chuyển mà đầu ra thường là rác. Đây là mẹo. Bq2 có cùng bclk với bq1, nhưng phải mất 2 chu kỳ xung nhịp của bclk để dữ liệu đi qua và xuất hiện tại bq2_dat.

3) Bclk đầu tiên đã thu được một phần dữ liệu, dẫn đến đầu ra lộn xộn, nhưng bclk thứ hai là một chu kỳ đồng hồ sau đó, đủ thời gian để dữ liệu mơ hồ từ bq1_dat chuyển sang trạng thái cao hoặc thấp. Xung bq1_dat lộn xộn chỉ tồn tại đủ lâu để bq2 thu được logic hợp lệ '1' (mức logic cao) và chuyển nó đến bq2_dat dưới dạng dữ liệu hợp lệ và hiện được đồng bộ hóa (mức logic cao).

4) Hạ lưu, bất kỳ đồng hồ nào sử dụng bclk sẽ có dữ liệu được đồng bộ hóa để làm việc. Lưu ý rằng chỉ FF bclk đầu tiên phải xử lý trạng thái siêu bền . Đầu ra có thể là mức logic thấp nếu adat chỉ là pico hoặc nano giây quá muộn. Hãy nhớ những flip-flop này chỉ lấy mẫu dữ liệu trên cạnh tăng của đồng hồ. Những gì xảy ra trước hoặc sau khi tăng cạnh được bỏ qua.


Tuy nhiên, xin lưu ý rằng độ trễ bclk chỉ cung cấp thước đo xác suất an toàn và số tiền chính xác phụ thuộc cả vào công nghệ FF và thời gian bclk. Trong một số trường hợp hi-rel 3 hoặc thậm chí nhiều giai đoạn có thể được yêu cầu để giảm tỷ lệ lỗi xuống mức chấp nhận được.
WhatRoughBeast

@WhatRoughBeast. Tôi biết rằng trong trường hợp xấu nhất, cần có nhiều giai đoạn đồng bộ hóa, cộng với lọc kỹ thuật số. Rõ ràng câu trả lời của tôi quá đơn giản.
Sparky256

@ Sparky256 Câu đố của tôi là 3) trong bình luận của bạn. Làm thế nào bq2 có thể chụp '1' khi bq1_dat ở trạng thái siêu bền?
fiedel

@fiedel, hai điều góp phần giúp bq2 có thể nắm bắt được đầu vào sạch (ít nhất là). Đầu tiên trạng thái siêu bền cần tồn tại trong một chu kỳ đồng hồ đầy đủ. Thứ hai, giá trị siêu bền (pseudo-mid-rail) từ bq1 có thể khó xảy ra (hoặc được tối ưu hóa để tránh) ở trong cửa sổ cũng sẽ khiến bq2 có thể di chuyển - nhưng chủ yếu là đầu tiên trong số này. Nói rằng công nghệ dẫn đến 5% cơ hội di căn vẫn tồn tại đủ lâu. giai đoạn đồng bộ 3-FF sẽ giảm điều này xuống 0,25% vì cả hai ô đều phải thất bại. Lộn xộn trong thực tế là một độ lệch hàm mũ được xác định rõ từ trạng thái gần như ổn định.
Sean Houlihane

@SeanHoulihane. Cảm ơn đã giải thích. Thuật ngữ 'cạnh tăng' gây nhầm lẫn cho một số người vì cửa sổ chấp nhận dữ liệu (siêu bền hoặc ổn định) nằm ở điểm giữa của cạnh tăng, chỉ kéo dài vài pico hoặc nano giây. Chỉ tại thời điểm đó, dữ liệu đầu vào ở mức logic '1' hoặc '0', cho dù nó có thể di chuyển hay ổn định, tùy thuộc vào mức điện áp của nó so với ngưỡng của IC đối với logic 1 hoặc 0.
Sparky256
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.