Thứ Bảy, 1 tháng 2, 2020

[Multi-clock Design] Bài 3 - Kỹ thuật đồng bộ tín hiệu nhiều bit

Bài viết này trình bày về các phương pháp và kỹ thuật phổ biến dùng để đồng bộ một tín hiệu nhiều bit, 2 bit trở lên, khi tín hiệu này được lan truyền giữa hai miền clock bất đồng bộ (asynchronous clock) trong các chip sử dụng nhiều nguồn clock khác nhau.
Một số từ khóa và từ viết tắt:
  • Trạng thái bất ổn định (metastability)
  • Mạch đồng bộ (synchronizer)
  • FF (Flip-Flop)
Các bài viết liên quan:

1) Vấn đề đồng bộ tín hiệu nhiều bit
Đối với tín hiệu 1 bit, việc đồng bộ có thể đơn giản là chỉ cần 2 hoặc nhiều Flip-Flop (FF) mắc nối tiếp. Nếu trạng thái bất ổn định (metastability) xảy ra và ổn định trước khi lan truyền đến FF cuối cùng trong mạch đồng bộ thì giá trị ngõ ra của mạch đồng bộ sẽ là giá trị trước đó hoặc giá trị mới được mong muốn. Điểm này rất quan trọng vì nó giúp miền nhận không xử lý sai khi dùng tín hiệu ngõ ra mạch đồng bộ làm tín hiệu điều khiển các logic khác.
Hình 1: Hiện tượng bất ổn định xảy ra trên tín hiệu 1 bit
Trong hình minh họa trên, khi hiện tượng bất ổn định xảy ra ở FF đầu tiên, pre_out sẽ ổn định về giá trị 0 (giá trị trước đó) hoặc 1 (giá trị mới). Điều này làm cho ngõ ra mạch đồng bộ sync_out chỉ có thể là 0 (giá trị trước đó) hoặc 1 (giá trị mới) ở chu kỳ tiếp theo.
  • Nếu sync_out=0 (giá trị cũ) thì nó sẽ không làm thay đổi trạng thái của logic mà nó sẽ điều khiển. Khi giá trị ngõ vào async_in vẫn duy trì mức tích cực thì sync_out=1 và lái logic mà nó điều khiển đến trạng thái mới như mong muốn
  • Nếu sync_out=1 (giá trị mới) thì nó lái logic đến trạng thái mới như mong muốn.
Do hiện tượng bất ổn định, một tín hiệu nhiều bit (2 bit trở lên) như bus dữ liệu, bus địa chỉ, giá trị trạng thái, … thường không thể chỉ được đồng bộ chỉ bằng 2 hoặc nhiều FF như đối với tín hiệu 1 bit. Chú ý, "thường không thể" nghĩa là một tín hiệu nhiều bit vẫn có thể chỉ cần đồng bộ bằng 2 hoặc nhiều FF nối tiếp trong một số trường hợp đặc biệt. Nguyên nhân, nếu hai hoặc nhiều bit thay đổi giá trị và cùng gây ra hiện tượng bất ổn định thì một giá trị không mong muốn có thể được sinh ra trên ngõ ra của mạch đồng bộ.
Hình 2: Ảnh hưởng của hiện tượng bất ổn định trên tín hiệu nhiều bit
Trong hình minh họa trên đây, khi xảy ra hiện tượng bất ổn định thì giá trị sync_out có thể là một trong các tổ hợp 00/01/10/11. Nếu tổ hợp xảy ra là 00 (giá trị cũ) hoặc 11 (giá trị mới) thì miền nhận có thể xử lý đúng như mong muốn. Nhưng, nếu một trong hai tổ hợp 01 10 xuất hiện thì miền nhận có thể xử lý sai vì đây là hai trạng thái không mong muốn. Vì vậy, đối với tín hiệu nhiều bit, một cơ chế hoặc phương pháp đồng bộ cần được áp dụng để tránh nhận các giá trị không mong muốn.
Để thực hiện cơ chế đồng bộ cho một tín hiệu nhiều bit, chúng ta cần tập trung vào 2 điểm sau đây:
  • Việc sinh ra các giá trị không mong muốn là do 2 hoặc nhiều bit của tín hiệu cùng thay đổi mức logic. Điều này làm cho hiện tượng bất ổn định có thể xảy ra cùng lúc trên các bit được thay đổi mức logic. Như vậy, một tín hiệu nhiều bit có thể chỉ cần đồng bộ bởi 2 hoặc nhiều FF mắc nối tiếp nếu chỉ 1 bit thay đổi tại một thời điểm trong suốt quá trình hoạt động. Nghĩa là, giá trị trên tín hiệu không bao giờ thay đổi giá trị nhiều bit cùng một lúc. Trong trường hợp này, nếu hiện tượng bất ổn định xảy ra thì giá trị của tín hiệu này sẽ chỉ có thể là giá trị trước đó hoặc giá trị mới như mong muốn chứ không xuất hiện tổ hợp giá trị không mong muốn.
  • Khi hiện tượng bất ổn định xảy ra, trong lần cập nhật giá trị mới đầu tiên, tại thời điểm T2 của hình 2, giá trị ngõ ra của mạch đồng bộ là một giá trị ngẫu nhiên. Để đảm bảo ngõ ra cập nhật được giá trị logic mới thì ngõ vào mạch đồng bộ phải duy trì ổn định giá trị mới trong một khoảng thời gian đảm bảo cho miền clock nhận bắt được giá trị đúng. Khoảng thời gian này phải lớn hơn (chu kỳ của clock nhận + thời gian setup của FF + thời gian hold của FF). Theo hình 2, async_in có thể được giữ 2 chu kỳ xung clock rclk để đảm bảo một giá trị đúng có thể được bắt bởi cạnh lên T2.
2) Ví dụ về đồng bộ sai tín hiệu nhiều bit
Một giá trị của máy trạng thái (FSM) cần được truyền từ xung clock tclk sang miền xung clock rclk. Giá trị này gồm 2 bit tên bus_state[1:0] quy định các trạng thái như sau:
IDLE = 2’b00;
ACTIVATE = 2b01;
RUN = 2’b10;
DEACTIVATE = 2’b11;
Hình 3: Ví dụ sai về việc đồng bộ một giá trị trạng thái nhiều bit
Trong hình vẽ trên, trạng thái được chuyển đổi lặp lại theo thứ tự IDLE->ACTIVATE->RUN->ACTIVATE. Giả sử bus_state[1:0] chỉ được đồng bộ bằng 2 FF tại miền xung clock rclk:
  • Nếu trạng thái chuyển từ IDLE (2’b00) -> ACTIVATE (2’b01) hoặc chuyển từ RUN (2’b10) -> DEACTIVATE (2’b11) thì miền clock nhận rclk sẽ phát hiện đúng trạng thái cho dù hiện tượng bất ổn định xảy ra vì chỉ một bit thay đổi giá trị.
  • Nếu trạng thái chuyển từ ACTIVATE (2’b01) -> RUN (2’b10) hoặc chuyển từ DEACTIVATE (2’b11) -> IDLE (2’b00) thì miền clock nhận rclk có thể nhận được một trạng thái sai nếu hiện tượng bất ổn định xảy ra. Ví dụ, ACTIVATE có thể chuyển sang trạng thái IDLE (2'b00) hoặc DEACTIVATE (2'b11) trước khi chuyển sang trạng thái RUN.
Một ví dụ khác, giá trị của một bộ đếm lên nhị phân truyền từ miền clock tclk sang miền clock rclk. Nếu giá trị bộ đếm này chỉ đồng bộ bằng các FF mắc nối tiếp, ví dụ như 2 FF, thì giá trị nhận được tại miền clock rclk có thể sẽ không tuần tự, tăng đều một đơn vị như bên miền clock tclk khi hiện tượng bất ổn định xảy ra.
Hình 4: Ví dụ sai về việc đồng bộ một bộ đếm nhị phân nhiều bit
Trong hình minh họa trên đây, một bộ đếm lên nhị phân 4 bit, bcounter[3:0],
  • Miền tclk: 0000 (0) -> 0001 (1) -> 0010 (2) -> 0011 (3) -> 0100 (4) -> …
  • Miền rclk: 0000 (0) -> 0001 (1) -> (0, 3) -> 0010 (2) -> 0011 (3) -> (0, 1, 2, 5, 6, 7) -> 0100 (4) -> …
Trong ví dụ trên đây khi bộ đếm tăng giá trị từ 1 lên 2, hai bit cuối thay đổi trạng thái logic. Tại miền clock rclk, nếu xảy ra hiện tượng bất ổn định trên 2 bit, giá trị bộ đếm nhận được có thể là 0 hoặc 3 trước khi đạt đến giá trị 2. Tương tự, tại thời điểm giá trị bộ đếm tang từ 3 lên 4, 3 bit cuối thay đổi mức logic. Nếu hiện tượng metastable xảy ra trên cả 3 bit, giá trị bộ đếm nhận được trên miền rclk có thể là 0, 1, 2, 5, 6 hoặc 7 trước khi đạt đến giá trị đúng là 4.
3) Các phương pháp đồng bộ tín hiệu nhiều bit
Việc đồng bộ tín hiệu nhiều bit cần giải quyết 2 vấn đề:
  • Hạn chế sự lan truyền trạng thái bất ổn định của tín hiệu đến các logic bên trong miền clock nhận
  • Lấy mẫu đúng giá trị mong muốn hoặc miền clock nhận không xử lý (hoạt động) sai khi hiện tượng bất ổn định xảy ra và triệt tiêu trên những tầng đầu tiên của mạch đồng bộ nhiều FF mắc nói tiếp.
Tùy vào trường hợp cụ thể, một trong các phương pháp đồng bộ sau đây có thể được áp dụng để đồng bộ tín hiệu nhiều bit:
  • Sử dụng logic kiểm tra giá trị tín hiệu nhận được để đảm bảo nhận được giá trị đúng
  • Sử dụng tín hiệu cho phép (enable) để xác định thời điểm giá trị hợp lệ
  • Sử dụng cơ chế chuyển đổi giá trị thay đổi nhiều bit thành giá trị chỉ thay đổi 1 bit
  • Sử dụng giao thức bắt tay giữa hai miền clock để nhận biết khi nào giá trị được truyền và khi nào giá trị đã được nhận. Có hai loại giao thức bắt tay phổ biến là:
    • Bắt tay 4 pha (4-phase handshake)
    • Bắt tay 2 pha (2-phase handshake)
  • Sử dụng bộ nhớ đệm giữa hai miền như FIFO, RAM, ...
Xin nhấn mạnh rằng, việc áp dụng phương pháp nào để đồng bộ phải căn cứ trên yêu cầu thực tế vì mỗi phương pháp sẽ có ưu điểm và nhược điểm riêng. Các mục tiếp theo sẽ mô tả tổng quát các phương pháp trên.
4) Phương pháp kiểm tra sự ổn định của giá trị nhận được
4.1) Mô tả nguyên lý
Như đã trình bày ở các mục trên, khi hiện tượng bất ổn định xảy ra ở các tầng FF trước tầng FF cuối cùng, giá trị nhận được có thể sai. Giá trị này chỉ tồn tại một chu kỳ xung clock miền nhận, rclk, nếu ngõ vào từ miền clock truyền, tclk, tiếp tục giữ ổn định giá trị trong nhiều chu kỳ xung clock rclk tiếp theo.
Hình 5: Mạch nguyên lý của phương pháp kiểm tra sự ổn định của giá trị nhận
Trong hình minh họa trên, một tầng FF được sử dụng ngay sau mạch đồng bộ để lưu lại giá trị ngõ ra của mạch đồng bộ, sync_out, theo từng chu kỳ xung clock rclk. Giá trị của tầng FF này, sync_tmp, sẽ được so sánh với ngõ ra của mạch đồng bộ, sync_out. Nếu hai giá trị này bằng nhau thì đây là giá trị ổn định được truyền từ miền clock tclk. Ngõ ra bộ so sánh, data_valid, sẽ tích cực để báo hiệu một giá trị hợp lệ cần được nhận. Trong ví dụ minh họa, khi data_valid tích cực, thanh ghi rec_data sẽ cập nhật giá trị mới. Giá trị mới có thể lấy từ sync_tmp hoặc sync_out vì lúc này, giá trị của hai tín hiệu này bằng nhau và bằng giá trị ổn định được truyền từ miền tclk.
4.2) Điều kiện sử dụng
Điều kiện sử dụng của mạch này là tín hiệu ngõ vào, async_in, phải duy trì ổn định giá trị mới đủ để rclk bắt đúng giá trị này từ 2 lần trở lên.
Chi tiết hơn, chúng ta hãy xem xét chi tiết sự tích cực của tín hiệu data_valid trong trường hợp xấu nhất để hiểu rõ hoạt động của cơ chế so sánh này.
Trường hợp xấu nhất là trường hợp xảy ra vi phạm timing khi ngõ thay đổi giá trị. 
Hình 6: Một waveform của ví dụ hình 5
Trong hình minh họa trên đây, async_in được duy trì trong 3 chu kỳ xung clock rclk. Điều này đảm bảo rclk chắc chắn bắt được giá trị đúng tại cạnh lên ở T2 và T3. Lưu ý, async_in được lái theo clock tclk nhưng tclk không được thể hiện ở đây.
Trường hợp xấu nhất, thời điểm T1 và T4 đều vi phạm timing, giá trị sync_out chỉ chắc chắn có giá trị mong muốn là 2'b11 trong 2 chu kỳ từ T3 đến T4 và từ T4 đến T5. Điều này ứng với việc data_valid chỉ đảm bảo chắc chắn tích cực trong chu kỳ từ T4 đến T5, lúc data_tmp=data_out=2'b11.
Nếu vi phạm timing tại T1 làm giá trị pre_out ổn định về 2'b11 thì data_valid sẽ tích cực trong chu kỳ từ T3 đến T4.
Nếu vi phạm timing tại T4 làm giá trị pre_out ổn định về 2'b11 thì data_valid sẽ tích cực trong chu kỳ từ T5 đến T6.
Như vậy độ rộng tối thiểu là data_valid là 1 chu kỳ rclk và độ rộng tối đa của data_valid là 3 chu kỳ rclk.
4.3) Ưu điểm và chú ý
Mục này nêu ra các ưu điểm và chú ý khi dùng phương pháp này. "chú ý" có thể là nhược điểm của phương pháp này hoặc không.
Ưu điểm:
  • Cơ chế đồng bộ đơn giản
  • Không cần tạo thêm tín hiệu giao tiếp mới giữa hai miền lock truyền và nhận
Chú ý:
  • Phải tuân thủ ràng buộc về độ rộng xung của tín hiệu, một giá trị mới phải duy trì trong khoảng thời gian đủ để miền clock nhận chắc chắn bắt đúng từ 2 lần trở lên. Điều này làm cho miền clock truyền, tclk, có thể phải thêm logic để duy trì độ rộng xung của các tín hiệu như yêu cầu.
  • Số lượng FF của mạch đồng bộ càng lớn khi số lượng bit tín hiệu càng nhiều. Điểm này ảnh hưởng đến tài nguyên và công suất tiêu thụ.
  • Tài nguyên bộ so sánh giá trị lớn khi số lượng bit càng nhiều. Điểm này ảnh hưởng lớn đến độ trễ trên logic mạch tổ hợp.
  • Thời gian tối thiểu để miền nhận có thể nhận biết đúng giá trị mới là 4 chu kỳ rclk, từ lúc ngõ vào thay đổi giá trị ở T1 đến lúc nhận biết được data_valid tích cực ở T5.
  • Không sử dụng cho trường hợp một giá trị giống nhau được dùng nhiều lần liên tiếp. Nếu miền clock tclk truyền liên tiếp một giá trị nhiều lần, ví dụ như truyền 10 lần giá trị 2'b00, và các giá trị này là phân biệt nhau thì phương pháp này không thể nhận biết được số lần truyền nhận vì nó chỉ giữ tích cực tín hiệu data_valid liên tiếp nhiều chu kỳ trong trường hợp này.
5) Phương pháp dùng tín hiệu cho phép
5.1) Mô tả nguyên lý
Thay vì để miền nhận tự kiểm tra giá trị hợp lệ. Miền truyền tclk sẽ tạo thêm một tín hiệu 1 bit để báo hiệu thời điểm giá trị truyền hợp lệ. Trong cơ chế này, chỉ tín hiệu cho phép là cần được đồng bộ qua mạch nhiều FF mắc nối tiếp.
Hình 7: Mạch nguyên lý của phương pháp đồng bộ dùng tín hiệu cho phép
Trong mạch nguyên lý trên, data_valid được đồng bộ bằng 2 FF để tạo thành data_en. Sau đó, data_en được dùng để điều khiển thời điểm cập nhật giá trị mới từ async_in đến rec_data.
5.2) Điều kiện sử dụng
Điều kiện sử dụng của phương pháp này là:
  • Tín hiệu cho phép data_valid phải ổn định đủ để miền clock rclk chắc chắn bắt được đúng giá trị tích cực. Thời gian này phải lớn hơn "một chu kỳ rclk + thời gian setup của FF + thời gian hold của FF"
  • Tín hiệu ngõ vào async_in phải duy trì ổn định giá trị cần truyền trong mọi trường hợp data_en tích cực.
Xem xét waveform sau đây để xác định mối liên hệ giữa data_valid và thời gian duy trì giá trị cần truyền trên async_in.
Hình 8: Một waveform của ví dụ hình 7
Trong hình minh họa trên đây, data_valid được duy trì trong 2 chu kỳ xung clock rclk. Điều này đảm bảo rclk chắc chắn bắt được giá trị đúng tại cạnh lên ở T2. Lưu ý, data_valid async_in được lái theo clock tclk nhưng tclk không được thể hiện ở đây.
Thời điểm từ T3 đến T4, data_en chắc chắn tích cực.
Nếu vi phạm timing tại T1 làm giá trị pre_en ổn định về 1 thì data_en sẽ tích cực trong chu kỳ từ T2 đến T3.
Nếu vi phạm timing tại T3 làm giá trị pre_en ổn định về 1 thì data_en sẽ tích cực trong chu kỳ từ T4 đến T5.
Trường hợp này, độ rộng tối thiểu là data_en là 1 chu kỳ rclk và độ rộng tối đa của data_en là 3 chu kỳ rclk. Để đảm bảo miền clock luôn bắt đúng dữ liệu thì async_in phải duy trì ổn định giá trị trong trường hợp xấu nhất, khi data_en tích cực 3 chu kỳ. Trong ví dụ này, async_in được lái giá trị mới cùng thời điểm cạnh lên của data_valid theo clock tclk và duy trì ổn định trong 5 chu kỳ xung clock rclk
5.3) Ưu điểm và chú ý
Ưu điểm:
  • Cơ chế đồng bộ đơn giản
  • Chỉ dùng mạch đồng bộ nhiều FF nối tiếp trên tín hiệu cho phép nên logic đồng bộ tốn ít tài nguyên và công suất tiêu thụ so với cơ chế tự kiểm tra sự ổn định của giá trị
  • Số lượng FF của mạch đồng bộ không đổi khi số lượng bit tín hiệu tăng.
  • Có thể dùng trong trường hợp truyền nhiều giá trị giống nhau liên tục căn cứ trên số lần tích cực của tín hiệu cho phép.
Chú ý:
  • Phải tuân thủ ràng buộc về độ rộng xung của tín hiệu, một giá trị mới phải duy trì trong khoảng thời gian đủ để miền clock nhận chắc chắn bắt đúng giá trị trong trường hợp xấu nhất, trường hợp độ rộng xung tín hiệu cho phép ở ngõ ra mạch đồng bộ, data_en, dài nhất. Điều này làm cho miền clock truyền, tclk, có thể phải thêm logic để duy trì độ rộng xung của các tín hiệu như yêu cầu.
  • Thời gian tối thiểu để đảm bảo miền nhận lấy đúng giá trị mới là "4 chu kỳ rclk + thời gian setup của FF + thời gian hold của FF", tình từ thời điểm T1.
6) Phương pháp chuyển đổi giá trị
6.1) Mô tả nguyên lý
Như đã trình bày, vấn đề của việc đồng bộ một tín hiệu nhiều bit bằng nhiều FF mắc nối tiếp là sinh ra giá trị không mong muốn nếu hiện tượng bất ổn định xảy ra khi nhiều bit cùng thay đổi giá trị.
Để giải quyết vấn đề này, một phương pháp đồng bộ có thể được áp dụng là chuyển đổi giá trị làm thay đổi nhiều bit thành một giá trị chỉ làm thay đổi 1 bit so với giá trị trước đó ở miền clock truyền. Tại miền clock nhận, tín hiệu sẽ được đồng bộ bằng mạch đồng bộ nhiều FF. Sau đó, giá trị ngõ ra mạch đồng bộ được khôi phục lại giá trị ban đầu.

Hình 9: Mạch nguyên lý phương pháp chuyển đổi giá trị thay đổi nhiều bit thành giá trị thay đổi 1 bit trước khi đồng bộ
Trong hình minh họa trên, binary_data là một tín hiệu nhiều bit. Giá trị của binary_data có thể thay đổi nhiều bit cùng lúc. Nó được chuyển đổi thành data_in thông qua một logic chuyển đổi. data_in được đồng bộ bằng mạch đồng bộ 2 FF. Ngõ ra mạch đồng bộ 2 FF là sync_out sẽ đi qua logic khôi phục lại giá trị ban đầu, data_out.
Sau logic chuyển đổi ở miền tclk, một tầng FF có thể được thêm vào giúp loại bỏ độ trễ gây ra do mạch tổ hợp trên đường data_in. Đồng thời loại bỏ glitch có thể sinh ra trên từng bit của tín hiệu nếu có.
6.2) Điều kiện sử dụng
Điều kiện để sử dụng phương pháp này là dữ liệu cần truyền giữa hai miền clock phải thay đổi theo một quy luật cố định, không được thay đổi ngẫu nhiên hay tùy ỳ.
Dữ liệu thay đổi có quy luật có thể là giá trị bộ đếm lên hoặc đếm xuống, máy trạng thái, ... như ví dụ trong "mục 2".
Bộ chuyển đổi thường được dùng trong phương pháp này là bộ chuyển đổi giữa mã binary và Gray. Tuy nhiên, bạn có thể sử dụng bất kỳ loại mã nào miễn là nó phải đảm bảo chỉ thay đổi logic của 1 bit khi giá trị cần truyền thay đổi.
Nếu dữ liệu cần truyền là bộ đếm lên hoặc đếm xuống 1 đơn vị thì nó có thể được chuyển đổi thành mã Gray như trong link tham khảo sau. Việc chuyển đổi ngược từ mã Gray thành binary được thực hiện như mạch nguyên lý sau đây.
Hình 10: Mạch nguyên lý chuyển đổi từ mã nhị phân (binary) thành mã Gray
Tương tự đối với FSM, thay vì mã hóa trạng thái nhị phân, chúng ta có thể chuyển thành mã Gray. Quay lại ví dụ FSM ở mục 2, FSM này chuyển trạng thái theo thứ tự lặp lại IDLE->ACTIVATE->RUN->DEACTIVATE. Trong trường hợp này, chúng ta có thể chuyển giá trị mã hóa trạng thái theo thứ tự mã Gray như sau:
IDLE = 2’b00;
ACTIVATE = 2'b01;
RUN = 2’b11; //thay vì 2'b10
DEACTIVATE = 2’b10; //thay vì 2'b11
Như đã trình bày, tùy vào trường hợp cụ thể, chúng ta có thể dùng bất kỳ loại chuyển đổi nào miễn là tuân thủ quy tắc "hai giá trị liên tiếp chỉ thay đổi mức logic của 1 bit". Xét ví dụ sau đây:
Hình 11: Một FSM mà giá trị trạng thái cần được truyền từ miền clock tclk sang miền clock rclk
Hình trên là một FSM được tạo ra trên miền clock tclk và giá trị trạng thái cần được truyền sang miền clock rclk. FSM có 5 trạng thái nên chúng ta không thể dùng mã hóa Gray thông để mã hóa tuần tự cho từng trạng thái. Trường hợp này, một bộ giá trị sẽ được lựa chọn để đảm bảo khi chuyển trạng thái chỉ có 1 bit thay đổi, tạm gọi cách gán trạng thái này là "custom code".
IDLE                = 3’b000;
ACTIVATE      = 3'b100;
PRE_RUN       = 3’b101;
POST_RUN     = 3'b111;
DEACTIVATE = 3’b110;
Chú ý, trong trường hợp này, khi reset bằng cách tích cực tín hiệu rst_n, thì FSM sẽ về trạng thái IDLE. Nếu FSM đang ở trạng thái PRE_RUN, POST_RUN hoặc DEACTIVATE thì việc nhảy về RESET sẽ làm thay đổi giá trị của 2 bit. Vì vậy, việc gán trạng thái này chỉ được dùng ở một trong hai trường hợp sau:
  • Tín hiệu reset rst_n sẽ reset cả hai miền clock tclkrclk.
  • Tín hiệu reset rst_n chỉ reset miền tclk nhưng khi miền rclk phát hiện FSM là IDLE thì sẽ khởi tạo lại từ đầu (giống như được reset) hoặc không quan tâm đến các trạng thái hoạt động trước đó. Trường hợp này, cho dù giá trị FSM thay đổi nhiều bit và có thể sinh ra một trạng thái sai khi đồng bộ sang miền rclk nhưng nó không ảnh hưởng đến hoạt động của miền rclk vì miền này sẽ khởi tạo và hoạt động lại.
6.3) Ưu điểm và chú ý
Ưu điểm:
  • Cơ chế đồng bộ đơn giản
  • Hữu dụng cho việc đồng bộ giá trị bộ đếm và FSM đơn giản. FSM đơn giản được hiểu là FSM có số lượng chuyển trạng thái ít và không có nhiều nhánh chuyển trạng thái. Đây là một nhận xét mang tính tương đối.
Chú ý:
  • Chỉ dùng được trong trường hợp giá trị cần truyền giữa hai miền clock thay đổi có quy luật.
  • Tài nguyên dành cho mạch chuyển đổi giá trị lớn khi số bit cần truyền tăng. Khi tài nguyên mạch tổ hợp chuyển đổi giá trị ở miền tclk lớn đáng kể thì cần chèn thêm một tầng FF tại ngõ ra trước khi truyền sang miền rclk, điều này làm tăng công suất tiêu thụ
7) Phương pháp giao thức bắt tay
7.1) Mô tả nguyên lý
Phương pháp dùng giao thức bắt tay (handshake) là phương pháp thông tin hai chiều giữa miền truyền và miền nhận. Miền truyền dữ liệu sẽ gửi dữ liệu kèm một tín hiệu yêu cầu truyền (request), tín hiệu req, đến miền nhận. Miền nhận đồng bộ tín hiệu yêu cầu bằng mạch đồng bộ nhiều FF mắc nối tiếp theo clock rclk. Miền nhận sẽ phát hiện mức tích cực của tín hiệu yêu cầu để nhận dữ liệu. Sau khi nhận dữ liệu, miền nhận sẽ thông báo lại cho miền truyền bằng các tích cực một tín hiệu phản hồi, tín hiệu ack. Miền truyền sẽ đồng bộ lại tín hiệu ack theo clock tclk. Miền truyền sẽ tiếp tục truyền dữ liệu mới sau khi phát hiện ack tích cực.
Hình 12: Mạch nguyên lý của phương pháp đồng bộ bằng giao thức bắt tay
Trong hình minh họa trên đây:
  • Request logic là thành phần quyết định khi nào tích cực tín hiệu req và cập nhật dữ liệu truyền mới dựa trên thông tin từ tín hiệu sync_ack, tín hiệu ack sau khi đã đồng bộ, và trạng thái hoạt động của miền tclk.
  • Ack logic là thành phần quyết định khi nào tích cực tín hiệu ack dựa trên thông tin từ tín hiệu sync_req, tín hiệu req sau khi đã đồng bộ, và trạng thái hoạt động của miền rclk.
Có hai loại giao thức bắt tay là:
  • Bắt tay 2 bước
  • Bắt tay bốn bước
Hình 13: (a) Giao thức bắt tay 2 bước và (b) giao thức bắt tay 4 bước
Giao thức bắt tay 2 bước được thực hiện dựa trên việc lặp lại 2 bước sau đây:
  • (1) Miền tclk, tín hiệu req chuyển trạng thái, từ 0 lên 1 hoặc từ 1 xuống 0,  kèm với dữ liệu cần truyền
  • (2) Miền rclk, sau khi đã nhận được dữ liệu, tín hiệu ack chuyển trạng thái, từ 0 lên 1 hoặc từ 1 xuống 0.
Trong giao thức bắt tay 2 pha, tín hiệu req chỉ chuyển trạng thái khi có dữ liệu cần truyền. Miên tclk chỉ truyền dữ liệu khi đã phát hiện sự chuyển trạng thái trên ack, ứng với thời điểm.
Hình 14: Mạch nguyên lý cơ chế đồng bộ bằng giao thức bắt tay 2 pha
Trong hình vẽ trên:
  • Tại miền tclk: req đảo giá trị và async_in cập nhật giá trị mới cần truyền chỉ khi phát hiện được ack từ miền rclk, sync_ack=req. data_valid là một tín hiệu sinh ra từ logic của miền tclk, chỉ tích cực khi có dữ liệu mới cần truyền.
  • Tại miền rclk: ack đảo giá trị và rec_data cập nhật giá trị mới chỉ khi phát hiện được req từ miền tclk, mức logic của sync_req  khác mức logic của ackrec_ready là một tín hiệu sinh ra từ logic của miền rclk, chỉ tích cực khi có thể nhận dữ liệu.
Giao thức bắt tay 4 bước được thực hiện dựa trên việc lặp lại 4 bước sau đây:
  • (1) Miền tclk, tín hiệu req tích cực kèm với dữ liệu cần truyền
  • (2) Miền rclk, sau khi đã nhận được dữ liệu, tín hiệu ack tích cực.
  • (3) Miền tclk, tín hiệu req thôi tích cực sau khi đã phát hiện ack tích cực.
  • (4) Miền rclk, tín hiệu ack thôi tích cực sau khi đã phát hiện req thôi tích cực.
Trong giao thức bắt tay 4 pha, mỗi lần truyền dữ liệu req ack đều phải trải qua 2 trạng thái là tích cực và không tích cực. Một dữ liệu mới chỉ được phép truyền khi miền tclk nhìn thấy cả req ack đang trong trạng thái không tích cực.
Hình 15: Mạch nguyên lý của có chế đồng bộ bằng giao thức bắt tay 4 pha
Trong hình vẽ trên:
  • Tại miền tclk:
    • req chỉ được tích cực khi sync_ack=req=0 và data_valid=1. data_valid là tín hiệu sinh ra từ logic của miền tclk. Tín hiệu này chỉ tích cực khi miền tclk có dữ liệu muốn truyền. Thời điểm req tích cực cũng là lúc giá trị mới được nạp vào FF async_in.
    • req thôi tích cực khi sync_ack=1.
    • req giữ nguyên giá trị trong các trường hợp khác.
  • Tại miền rclk:
    • ack chỉ được tích cực khi ack=0, sync_req=1 và rec_ready=1rec_ready là tín hiệu sinh ra từ logic của miền rclk. Tín hiệu này chỉ tích cực khi miền rclk có thể nhận dữ liệu. Thời điểm ack tích cực cũng là lúc giá trị mới được nạp vào FF rec_data.
    • ack thôi tích cực khi sync_req=0.
    • ack giữ nguyên giá trị trong các trường hợp khác
7.2) Điều kiện sử dụng
Phương pháp đồng bộ bắt tay có thể được dùng mà không cần quan tâm đến tỉ lệ tần số hay độ rộng tín hiệu giữa miền truyền (tclk) và miền nhận (rclk) vì nó đảm bảo mỗi dữ liệu được truyền đi từ miền truyền sẽ chắc chắn được nhận bởi miền nhận.
7.3) Ưu điểm và chú ý
Ưu điểm:
  • Không cần quan tâm đến độ rộng tín hiệu khi truyền và nhận
  • Đảm bảo truyền và nhận đúng và đủ số lượng dữ liệu
  • Có thể truyền nhận các dữ liệu có giá trị ngẫu nhiên
  • Mạch logic đơn giản
Chú ý:
  • Nhược điểm của phương pháp này là tốc độ truyền nhận dữ liệu giữa hai miền thấp. Nếu dữ liệu hiện tại chưa hoàn thành thì dữ liệu mới không được phép truyền. Vì vậy, phương pháp này chỉ thích hợp cho các giao tiếp có số lượng dữ liệu truyền nhận ít, không cần xử lý nhanh hoặc dữ liệu truyền có khoảng thời gian giữa hai gói dài
8) Phương pháp bộ nhớ đệm
8.1) Mô tả nguyên lý
Phương pháp này sử dụng một bộ nhớ đệm nằm giữa hai miền truyền và nhận. Miền truyền sẽ ghi dữ liệu cần truyền vào bộ nhớ đệm này bằng clock của miền truyền, tclk. Miền nhận sẽ đọc dữ liệu từ bộ nhớ đệm này bằng clock của miền nhận, rclk.
Hình 16: Nguyên lý dùng bộ nhớ đệm bất đồng bộ
Một loại bộ nhớ đệm thường dùng trong thực tế là FIFO bất đồng bộ (asynchronous FIFO). Hiện có 2 cấu trúc FIFO bất đồng bộ được giới thiệu là:
  • Cấu trúc FIFO bất đồng bộ dùng bộ đếm ghi/đọc Gray.
  • Cấu trúc FIFO bất đồng bộ dùng bộ đếm ghi/đọc token ring.

Hình 17: Cấu trúc của FIFO bất đồng bộ dùng bộ đếm Gray (tài liệu tham khảo 1)
Trong hình minh họa trên, wclk là clock của miền truyền và rclk là clock của miền nhận.
Hình 18: Cấu trúc của FIFO bất đồng bộ dùng bộ đếm token ring (tài liệu tham khảo 2)
Trong hình minh họa trên, CLK_TX là clock miền truyền và CLK_RX là clock miền nhận.
Trong hai loại trên, FIFO bất đồng bộ dùng bộ đếm Gray đang được dùng phổ biến trong các thiết kế chip thực tế. Bài viết sẽ không trình bày chi tiết cấu trúc của hai loại FIFO này. Việc phân tích chi tiết và so sánh hai cấu trúc FIFO sẽ được thực hiện trong một bài viết khác.
8.2) Điều kiện sử dụng
Phương pháp đồng bộ này có thể được dùng mà không cần quan tâm đến tỉ lệ tần số hay độ rộng tín hiệu giữa miền truyền (tclk) và miền nhận (rclk) vì nó đảm bảo mỗi dữ liệu được truyền đi từ miền truyền sẽ chắc chắn được nhận bởi miền nhận.
8.3) Ưu điểm và chú ý
Ưu điểm:
  • Không cần quan tâm đến độ rộng tín hiệu khi truyền và nhận
  • Đảm bảo truyền và nhận đúng và đủ số lượng dữ liệu
  • Có thể truyền nhận các dữ liệu có giá trị ngẫu nhiên
  • Hỗ trợ các giao tiếp cần truyền nhận dữ liệu nhanh với số lượng lớn hoặc các giao tiếp yêu cầu truyền nhận dữ liệu liên tục
Chú ý:
  • Nhược điểm của phương pháp này là phức tạp hơn các phương pháp khác.
  • Tài nguyên và công suất tiêu thụ tăng đáng kể khi dung lượng bộ nhớ tăng
Lịch sử cập nhật:
1) 2020.02.02 - Tạo lần đầu

Tài liệu tham khảo:
1) Clifford E. Cummings, Sunburst Design, Inc; Simulation and Synthesis Techniques for Asynchronous FIFO Design; SNUG, San Jose, 2002
2) Clifford E. Cummings, Peter Alfke; Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons; SNUG, San Jose, 2002
3) Alessandro Stranoy, Daniele Ludovicix, Davide Bertozzi; A Library of Dual-Clock FIFOs for Cost-Effective and Flexible MPSoC Design; IEEE 2010

7 bình luận:

  1. Nhận xét này đã bị quản trị viên blog xóa.

    Trả lờiXóa
  2. Em chào anh, em có 1 câu hỏi, mong anh giải đáp ạ.

    Câu hỏi:
    Trong phương pháp chuyển đổi giá trị, điều kiện sử dụng là 2 tín hiệu liên tiếp nhau phải khác nhau chỉ 1 bit.
    Giả sử có trường hợp miền xung clock truyền có tốc độ gấp nhiều lần miền nhận, giá trị truyền đã thay đổi nhiều lần thì lúc đó miền nhận mới có cạnh lên/xuống của clock các FF mới bắt được giá trị. Như vậy thì 2 giá trị lúc này đã không còn thoả mãn điều kiện chỉ khác nhau 1 bit nữa rồi.

    Trả lờiXóa
    Trả lời
    1. Trong câu hỏi của bạn có 2 vấn đề cần làm rõ.
      1/ Nếu bạn mong muốn nhận đầy đủ các giá trị chuyển từ miền clock nhanh (clock truyền) ở miền nhận thì phải đảm bảo độ rộng tín hiệu truyền để miền nhận có thể bắt được hết
      2/ Nếu bạn đangchir quan tâm đến việc dùng mã gray khi thay đổi giá trị nhiều lần ở miền truyền thì miền nhận nhìn thấy nhiều bit thay đổi hay 1 bit thay đổi thì câu trả lời là "miền nhận vẫn chỉ nhìn thấy 1 bit thay đổi ở đầu vào".Dù miền truyền thay đổi bao nhiêu lần thì giá trị tại cạnh lên/xuống của clock nhận so với giá trị ngay trước đó vẫn chỉ đổi 1 bit.

      Xóa
    2. Với ý 2, bạn hãy vẽ waveform ra để thấy. Giả sử, miền truyền phát 00 - 01 - 11. Miền nhận bắt 11 tại cạnh lên thì đối với miền nhận bit 0 lúc này đã bằng 1 và ổn định trước, chỉ có bit 1 là thay đổi

      Xóa
  3. Bài viết rất hữu ích. Clock domain crossing luôn là vấn đề nhức nhối trong digital design. Anh chắc phải làm digital design lâu năm rồi ạ?

    Trả lờiXóa
    Trả lời
    1. Chào em, cũng gọi là có chút kinh nghiệm thôi chứ a vẫn học từng ngày

      Xóa