• Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

Hiển thị các bài đăng có nhãn Multi-clock Design. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Multi-clock Design. Hiển thị tất cả bài đăng

Chủ Nhật, 2 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 và 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 và 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 tclk và rclk.
  • 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 ack. rec_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 và 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 và 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=1. rec_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

Thứ Sáu, 25 tháng 8, 2017

[Multi-clock Design] Bài 2 - Kỹ thuật đồng bộ tín hiệu điều khiển giữa các miền clock bất đồng bộ

Bài này mô tả các kỹ thuật được sử dụng để đồng bộ tại giao tiếp của các miền clock bất đồng bộ. Mỗi trường hợp cụ thể, kỹ thuật sử dụng để thiết kế mạch đồng bộ sẽ khác nhau nhưng đều nhằm hai mục đích chính là hạn chế sự lan truyền của trạng thái bất ổn định (metastability) và lấy mẫu đúng giá trị mong muốn ở ngõ vào bất đồng bộ.
Trước khi đọc bài này, các bạn hãy đọc kỹ bài viết sau vì nhiều khái niệm sử dụng sẽ không được nhắc lại.

http://nguyenquanicd.blogspot.com/2017/08/multi-clock-design-bai-1-ky-thuat-thiet.html

1. Kỹ thuật đảm bảo độ rộng tín hiệu bất đồng bộ

1.1 Đảm bảo độ rộng tín hiệu dựa trên tỷ lệ của tần số xung clock

Việc đồng bộ tín hiệu 1 bit sử dụng 2 hoặc nhiều Flip-Flop (FF) chỉ đảm bảo hạn chế trạng thái bất ổn định (metastability state) lan truyền trong thiết kế chứ không đảm bảo nhận (lấy mẫu) đúng dữ liệu ngõ vào mong muốn ở ngõ vào do 2 yếu tố:
  1. Cạnh tích cực (trong bài này minh họa theo cạnh lên xung clock) của xung clock nhận chưa chắc bắt đúng được vị trí có giá trị mong muốn của ngõ vào vì ngõ vào thay đổi bất cứ khi nào không phụ thuộc vào xung clock nhận.
  2. Cạnh tích cực của clock nhận có thể bắt được giá trị thay đổi của ngõ vào nhưng có thể vi phạm định thời (timing) và gây ra trạng thái bất ổn định làm cho giá trị ngõ ra có thể ổn định về một giá trị logic không xác định trước
Do đó, việc sử dụng mạch đồng bộ mắc nối tiếp dùng nhiều FF cần có những tín toán và ràng buộc thêm để đảm bảo lấy đúng được dữ liệu ngõ vào mong muốn. Hình sau sẽ được dùng để phân tích về vấn đề này.
Hình 1. Mạch đồng bộ tín hiệu 1 bit dùng 2 FF
Điểm chính của vấn đề là mối liên hệ giữa độ rộng tín hiệu d_outa và xung clock clk_b. d_outa là tín hiệu thay đổi giá trị theo xung clock clk_a và bất đồng bộ với xung clock clk_b.

Trường hợp xung clock clk_a có tần số thấp hơn tần số xung clock clk_b, độ rộng* tối thiểu của tín hiệu d_outa nhỏ hơn chu kỳ xung clock clk_b. Việc lấy mẫu đúng được dữ liệu d_outa gần như là bất khả thi.
Hình 2. Độ rộng tín hiệu ngõ vào nhỏ hơn chu kỳ xung clock nhận làm cho xung clock clk_b không thể lấy mẫu đầy đủ các giá trị ở ngõ vào d_outa
Trường hợp xung clock clk_a cùng tần số với xung clock clk_b, lúc này độ rộng tín hiệu d_outa bằng độ rộng xung clk_b nhưng vẫn không đảm bảo clk_b có thể lấy mẫu đúng d_outa vì độ lệch pha giữa clk_a và clk_b là không biết trước nên tín hiệu d_outa sinh ra hoàn toàn có thể vi phạm định thời clk_b.
Hình 3. Độ rộng tín hiệu ngõ vào d_outa bằng chu kỳ xung clock clk_b vẫn không đảm bảo lấy mẫu đúng dữ liệu
Tổng quát, nếu độ rộng tín hiệu d_outa, ký hiệu td_outa, nhỏ hơn hoặc bằng tổng chu kỳ clk_b (Tclk_b) cộng setup time (tsu) và hold time (th) của clk_b thì vấn đề xảy ra giống như trường hợp hình 3.

Xét trường hợp sau:
td_outa > Tclk_b + tsu + th

Hình 4 (A) minh họa độ rộng tối thiểu của ngõ vào bất đồng bộ d_outa lớn hơn Tclk_b + tsu + th.
Hình 4 (B) minh họa sự kiện chuyển trạng thái từ mức 0 lên mức 1 của d_outa bị vi phạm timing và làm cho d_outb đạt đến giá trị không mong muốn ở cạnh lên xung clock đầu tiên nhưng ở cạnh xung clock clk_b thứ 2, d_outb cập nhật đúng giá trị ngõ vào mong muốn. Đến cạnh xung clock thứ 3, ngõ ra mạch đồng bộ là d_outc sẽ thể hiện được giá trị mới của ngõ vào d_outa.
Hình (C) thể hiện việc 1 giá trị logic của ngõ vào d_outa có thể được thể hiện ở ngõ ra trong 2 chu kỳ dù giá trị ngõ vào không tồn tại trong khoảng thời gian 2 chu kỳ. Tuy nhiên, bất cứ thay đổi nào của ngõ vào d_outa đều được thể hiện ở ngõ ra d_outc của mạch đồng bộ:
  • d_outa chuyển từ mức 0 lên mức 1 thì chắc chắn d_outc cũng sẽ chuyển từ mức 0 lên mức 1
  • d_outa chuyển từ mức 1 xuống mức 0 thì chắc chắn là d_outc cũng sẽ chuyển từ mức 1 lên mức 0
Hình 4. Mạch đồng bộ bắt được tất cả các sự kiện đổi trạng thái ngõ vào khi độ rộng tín hiệu bất đồng bộ d_outa lớn hơn Tclk_b + tsu + th
Tóm lại, nếu độ rộng tín hiệu bất đồng bộ lớn hơn Tclk_b + tsu + th thì mạch đồng bộ luôn bắt được tất cả các sự kiện chuyển trạng thái, từ 0 lên 1 hoặc từ 1 xuống 0, của d_outa. Chú ý, mạch đồng bộ phát hiện và báo đúng các sự kiện chuyển trạng thái chứ không phải thể hiện đúng độ rộng của giá trị ngõ vào.

Ví dụ, nếu miền xung clock clk_a cần phát một tín hiệu điều khiển bật/tắt (ON/OFF) một chức năng nào đó sang miền xung clock clk_b với chu kỳ các xung clock biết trước thì nó có thể sử dụng cạnh lên để ON, cạnh xuống để OFF. Tín hiệu này cần duy trì với độ rộng như ràng buộc trên đây. Giả sử, tần số clk_a là 75 Mhz ứng với chu kỳ 13.333ns; tần số xung clock clk_b là 25 Mhz ứng với chu kỳ 40ns; setup time của D-FF trên clk_b là 1ns, hold time của D-FF trên clk_b là 2ns. Để miền clock clk_b có thể bắt được các sự kiện điều khiển từ clk_a thì d_outa có độ rộng như sau:

td_outa > 40 + 1 + 2 (ns)
td_outa > 43 (ns)

d_outa có thể được thiết kế bằng cách duy trì trong 4 xung clock clk_a ứng với độ rộng:
td_outa ≈ 4 x 13.333 ≈ 53.333

Do độ rộng của một giá trị logic ở ngõ ra mạch đồng bộ (d_outc) không cố định do ảnh hưởng của hiện tượng bất ổn định nên một mạch phát hiện cạnh được sử dụng để phát hiện sự kiện chuyển trạng thái và báo hiệu trong 1 chu kỳ xung clock.
Hình 5. Mạch phát hiện cạnh của tín hiệu ngõ ra mạch đồng bộ
Hình 6. Dạng sóng minh họa hoạt động của mạch hình 5
Quan sát dạng sóng ví dụ, khi xảy ra trạng thái bất ổn định trên d_outb, tùy vào giá trị ổn định sau đó của d_outb là "0" hoặc "1" mà ngõ ra mạch đồng bộ là d_outc sẽ khác nhau làm cho ví trí báo hiệu của xung falling_edge sẽ khác nhau.

Cách đảm bảo độ rộng tín hiệu trên đây yêu cầu cần biết trước tần số xung clock nhận để miền phát có thể tạo được độ rộng xung phù hợp. Nếu miền xung clock phát chỉ tạo một độ rộng xung cố định thì phải giới hạn tần số miền xung clock nhận cho phù hợp.

1.2 Đảm bảo độ rộng tín hiệu bất đồng bộ bằng phương pháp hồi tiếp

Phương pháp này sử dụng ngõ ra mạch đồng bộ của miền clock nhận để hồi tiếp lại miền xung clock phát. Miền clock phát sẽ nhận tín hiệu hồi tiếp, đồng bộ lại theo xung clock miền phát để điều khiển độ rộng tín hiệu gửi sang miền clock nhận.
Hình 7. Đảm bảo độ rộng xung bằng phương pháp hồi tiếp
Hình trên minh họa việc miền xung clock clk_a (miền phát) gửi tín hiệu req tích cực mức "1" sang miền xung clock clk_b (miền nhận). Tín hiệu req sau khi được đồng bộ ở miền xung clock clk_b để tạo ra tín hiệu sync_req thì sync_req sẽ được hồi tiếp lại miền xung clock clk_a. Tín hiệu hồi tiếp sẽ được đồng bộ lại theo xung clock clk_a trước khi đi qua khối tạo tín hiệu xóa req là REG_CLR. Như vậy, khi req tích cực nó sẽ duy trì mức tích cực đến khi khối REQ_CLR nhận được đúng giá trị req đã hồi tiếp về, nghĩa là đã đảm bảo miền xung clock clk_b nhận được req, thì mới thôi tích cực req.

Phương pháp hồi tiếp này không cần quan tâm đến mối liên hệ giữa tần số clk_a và clk_b vì độ rộng tín hiệu req ở miền xung clock clk_a được duy trì cho đến khi biết chắc chắn miền xung clock clk_b đã nhận req.

2. Đồng bộ nhiều tín hiệu điều khiển

Đồng bộ nhiều tín hiệu giữa hai miền clock bất đồng bộ có một số điểm cần phải lưu ý hơn so với việc đồng bộ một tín hiệu như đã trình bày trên đây. Việc đồng bộ nhiều tín hiệu không phải chỉ cần dùng 2 hay nhiều FF mắc nối tiếp là được. Một số ví dụ sau đây sẽ giải thích tại sao việc chỉ dùng 2 hay nhiều FF mắc nối tiếp là không đảm bảo.

2.1 Đồng bộ hai tín hiệu hoạt động song song

Ví dụ, một giao tiếp cần truyền hai tín hiệu điều khiển từ miền xung clock clk_a sang miền xung clock clk_b như sau:

  • sel là tín hiệu lựa chọn tích cực mức 1 khi miền clock clk_a cần truyền dữ liệu cho miền clock clk_b
  • enable là tín hiệu tích cực mức 1 khi có dữ liệu hợp lệ
  • data_in là bus dữ liệu 
Hình 8. Một mạch đồng bộ các tín hiệu điều khiển không đúng
Trong hình trên, hai tín hiệu điều khiển sel và enable được đồng bộ thông qua mạch sử dụng 2 FF. Tại vị trí sel và enable cùng tích cực mức 1, tương ứng với việc sync_sel và sync_en cùng tích cực mức 1 thì dữ liệu sẽ data_in[7:0] sẽ được ghi vào thanh ghi data_reg[7:0]. Đấy là mong muốn của người thiết kế khi thực hiện mạch trên. Tuy nhiên việc đồng bộ như vậy là không đủ để mạch hoạt động chính xác cho dù độ rộng các tín hiệu sel, enable và data đã được đảm bảo như đã trình bày ở mục 1. Ví dụ như trong hình minh họa sau đây, do độ trễ giữa các tín hiệu  khác nhau nên sel vi phạm định thời trước, enable vi phạm định thời sau. Sau trạng thái bất ổn định, giá trị logic ở pre_sel và pre_en có thể đều về "0" làm cho sync_sel và sync_en không cùng một thời điểm như mong muốn và tín hiệu load không được tích cực.
Hình 9. Do độ trễ giữa các tín hiệu khác nhau nên dữ liệu không được nhận ở miền clk_b
Nếu vẫn muốn sử dụng cách đồng bộ này, giải pháp là phải lái hai tín hiệu điều khiển theo một giao thức ràng buộc về mặt định thời sao cho bất cứ vi phạm timing nào xảy ra thì miền xung clock nhận vẫn lấy được dữ liệu đúng. Ví dụ, tín hiệu enable không cùng chuyển trạng thái logic với tín hiệu sel như hình sau đây.
Hình 10. Tạo một giao thức ràng buộc giữa tín hiệu sel và enable
Một giải pháp khác là biến đổi hai hoặc nhiều tín hiệu điều khiển về một tín hiệu nếu có thể trước khi đồng bộ. Ví dụ như hình sau, sel và enable được xử lý AND ở miền xung clock clk_a trước thành tín hiệu load trước khi được đồng bộ qua miền xung clock clk_b. Dù xảy ra vi phạm thì miền clk_b vẫn nhận đúng dữ liệu khi data_in[7:0] được duy trì độ rộng phù hợp. Độ rộng của data_in[7:0] là:

Tdata > 3*Tclk_b + tsu + th
Hình 11. Biến đổi về đồng bộ 1 tín hiệu
2.2 Đồng bộ hai tín hiệu hoạt động tuần tự

Hai tín hiệu điều khiển được tích cực tuần tự trước sau. Tín hiệu load chỉ tích cực khi tín hiệu en1 tích cực trước và ngay sau đó, en2 tích cực. Tuy nhiên, việc sử dụng mạch đồng bộ 2 FF cho từng tín hiệu en1 và en2 cho kết quả không mong muốn khi trạng thái bất ổn định xảy ra như hình sau. Trường hợp này giả sử các tín hiệu ổn định về "0" sau trạng thái bất ổn định.
Hình 12. Hai tín hiệu tuần tự được đồng bộ không đúng
Giải pháp đầu tiên là chuyển về 1 tín hiệu, xử lý tổ hợp tín hiệu ở miền xung clock clk_a trước khi đưa qua miền clk_b như hình sau.
Hình 13. Xử lý 2 tín hiệu hoạt động tuần tự trước khi đồng bộ
Nếu không thể tổ hợp được hai tín hiệu en1 và en2 thành một tín hiệu nhưng en1 và en2 luôn hoạt động tuần tự trước sau như đã mô tả thì chỉ cần đồng bộ một tín hiệu en1 và dịch tín hiệu sau đồng bộ thêm 1 xung clock ở miền clk_b để tạo ra tín hiệu sync_en2 như minh họa dưới đây.
Hình 14. Tạo tín hiệu phù hợp sử dụng phương pháp dịch

2.3 Đồng bộ các tín hiệu được sử dụng cho encoder, MUX hoặc DEMUX

Giả sử một bộ MUX ở miền clock clk_b sử dụng 2 hoặc nhiều tín hiệu điều khiển từ miền clock clk_a. Nếu chỉ đồng bộ tất cả các tín hiệu bằng FF thì encoder không đảm bảo được hoạt động chính xác vì các tín hiệu điều khiển có thể xuất hiện các tổ hợp giá trị không mong muốn. Nguyên nhân là do độ trễ khác nhau trên các tín hiệu hoặc sự xuất hiện của trạng thái bất ổn định.
Hình 15. Ngõ ra bộ MUX xuất hiện giá trị sai khi đồng bộ song song 2 tín hiệu điều khiển
Một giải pháp cho vấn đề này là tạo thêm một tín hiệu cho phép. Tín hiệu này tích cực sau một chu kỳ xung clock clk_b khi sel1 và sel2 chuyển sang giá trị mới và thôi tích cực trước 1 chu kỳ khi sel1 và sel2 chuyển sang giá trị tiếp theo.

Hình 16. Sử dụng tín hiệu cho phép để lấy được giá trị điều khiển chính xác từ sel1 và sel2
Trên đây là một số trường hợp đồng bộ tín hiệu điều khiển giữa hai miền clock bất đồng bộ.

** Nếu có ý kiến cần trao đổi, bạn có thể comment dưới bài viết để cùng nhau hoàn thiện thêm kiến thức.

Lịch sử cập nhật:
2020.01.07 - Sửa link hình ảnh

Thứ Bảy, 19 tháng 8, 2017

[Multi-clock Design] Bài 1 - Đồng bộ tín hiệu bất đồng bộ

Bài viết này giới thiệu những vấn đề và các kỹ thuật được áp dụng trong thiết kế sử dụng nhiều nguồn clock bất đồng bộ. Một thiết kế an toàn và đơn giản nhất là thiết kế sử dụng một nguồn clock. Tuy nhiên, nhiều vi mạch ngày nay sử dụng rất nhiều nguồn clock khác nhau trong cùng một thiết kế nhằm đạt hiệu quả xử lý cao nhất nhưng vần đảm bảo tiết kiệm năng lượng.

Về các loại thiết kế trong vi mạch số các bạn có thể tham khảo ở bài viết [Basic Knowledge] Phân loại thiết kế trong thiết kế vi mạch số.

1. Trạng thái bất ổn định (Metastability)

Trạng thái bất ổn định chính là vấn đề chính được sinh ra tại các giao tiếp bất đồng bộ. Các kỹ thuật thiết kế đa miền clock bất đồng bộ đều nhằm mục đích tránh, hạn chế trạng thái này hoặc tìm cách "sống chung" với trạng thái này.

Trạng thái bất ổn định sinh ra khi xuất hiện sự vi phạm định thời (timing) giữa các tín hiệu đến và tín hiệu xung clock. Tín hiệu đến ở đây có thể là tín hiệu dữ liệu hoặc tín hiệu set/reset. Vi phạm định thời sẽ làm ngõ ra của Flip-Flop (FF) rơi vào trạng thái bất ổn định và xả ra hiện tượng dao động.
Hình 1. Trạng thái bất ổn định xảy ra trên giao tiếp giữa 2 miền clock bất đồng bộ

Hình 1 minh họa việc trạng thái bất ổn định xảy ra như thế nào. clk_a và clk_b là 2 xung clock bất đông bộ, nghĩa là 2 nguồn xung clock độc lập với nhau. d_outa thay đổi theo cạnh lên xung clock clk_a và vi phạm định thời, vi phạm setup time hoặc hold time, của miền xung clock clk_b. Lúc này, ngõ ra DFFB là d_outb rơi vào trạng thái bất ổn định và bắt đầu dao động. Trong trạng thái dao động, mức logic của d_outb là không xác định. Sau một thời gian khoảng thời gian không xác định, d_outb sẽ trở về trạng thái ổn định là mức "0" hoặc mức "1". Việc d_outb ổn định về trạng thái nào là ngẫu nhiên và không biết trước được.
Trạng thái bất ổn định thường được minh họa như việc thả một quả cầu lên một đỉnh một quả đồi. Nó luôn có xu hướng lăn xuống một trong hai bên sườn đồi và nằm cố định khi xuống đến chân đồi.
Hình 2. Minh họa trạng thái bất ổn định như việc thả một quả bóng trên đỉnh đồi
2. Những nguy hiểm sinh ra do trạng thái bất ổn định

Truyền sai giá trị: đây là nguy hiểm có thể thấy rõ. Xét đoạn thời gian ngõ ra d_outb dao động, đây là đoạn thời gian giá trị d_outb không xác định nếu d_outb tiếp tục được lan truyền trong các mạch tiếp theo thì giá trị logic ở các mạch tiếp theo cũng không chính xác. Thêm nữa, cho dù sau đó d_outb sẽ ổn định nhưng giá trị d_outb chưa chắc là đúng vì giá trị ổn định là "0" hay "1" là ngẫu nhiên. Tất nhiên, việc sai giá trị logic sẽ dẫn đến việc hoạt động sai không kiểm soát được khi lan truyền trong mạch.
Hình 3. Trạng thái bất ổn định sẽ lan truyền các giá trị logic sai trong mạch
Tiêu hao năng lượng lớn: Việc tiêu hao năng lượng lớn trên các cổng logic sinh ra do chuyển mạch (chuyển mức logic). Xét một ví dụ đơn giản về cổng đảo (inverter), khi chuyển mạch, điện áp ngõ vào IN thay đổi, tại thời điểm Vi không xác định rõ mức logic "0" hay "1" dòng điện sẽ tăng đột biến vì hiện tượng ngắn mạch tức thời Vdd-Vss khi cả PMOS và NMOS đều dẫn. Ở hiện tượng bất ổn định, tín hiệu dao động và không xác định rõ mức logic được suy trì trong một khoảng thời gian sẽ làm cho quá trình "ngắn mạch" này kéo dài hơn bình thường. Nếu tín hiệu bất ổn định nối đến càng nhiều các cổng logic (mạch tổ hợp) sẽ làm tiêu hao năng lượng lớn khi nhiều cổng bị "ngắn mạch" cùng lúc.

Hình 4. Mô hình cổng đảo mức CMOS (trái) và mối quan hệ dòng-áp khi chuyển mạch (phải). Ở đây, dòng ID tăng đạt mức cực đại tại điện áp trung gian VM khi hiện tượng "ngắn mạch" xảy ra do cả PMOS và NMOS cùng dẫn
Chính vì những nguy hiểm mà trạng thái bất ổn định mang lại mà khi thiết kế đa miền clock bất đồng bộ, nhiệm vụ chính và quan trọng hàng đầu là:
  1. Hạn chế hiện tượng này lan truyền trong mạch
  2. Dù hiện tượng này có xảy ra thì chức năng mạch vẫn phải đảm bảo hoạt động đúng.
3. Mạch đồng bộ
Mạch đồng bộ là mạch được sử dụng để đồng bộ các tín hiệu bất đồng bộ. Tín hiệu bất đồng bộ có thể chuyển trạng thái bất cứ lúc nào và không tuân theo định thời của miền clock nhận nó. Tín hiệu bất đồng bộ có nhiều dạng như:
  1. Tín hiệu input từ ngoài chip
  2. Tín hiệu đến từ một miền clock độc lập với miền clock nhận
  3. Tín hiệu giữa các miền clock sử dụng các clock sinh ra từ PLL
  4. ....
Hình 5. Minh họa một số trường hợp của tín hiệu bất đồng bộ
Để sử dụng một tín hiệu bất đồng bộ thì trong thiết kế phải có mạch đồng bộ. Mạch đồng bộ có nhiệm vụ lấy mẫu tín hiệu ngõ vào bất đồng bộ và cung cấp một ngõ ra đồng bộ theo xung clock được sử dụng bên trong thiết kế.
Mạch đồng bộ "huyền thoại" là mạch đồng bộ sử dụng 2 FF. Câu hỏi là tại sao lại sử dụng 2 FF?
Hình 6. Mạch đồng bộ tín hiệu 1 bit dùng 2 FF

Mạch đồng bộ dùng 2 FF được sử dụng với mong muốn giải quyết 2 vấn đề sau đây:
  1. Ngăn chặn việc truyền trạng thái bất ổn định đến các mạch phía sau
  2. Lấy mẫu đúng giá trị logic mong muốn
Hình 7. Sơ đồ dạng sóng mong muốn khi sử dụng mạch đồng bộ 2 FF
Tuy nhiên, vì d_outa có thể vi phạm timing của clk_b bất cứ lúc nào nên d_outb có thể dao động bất cứ lúc nào. Để trạng thái bất ổn định không lan truyền tiếp đến các mạch phía sau thì dao động của d_outb phải xong trước khi vi phạm timing của clk_b, nghĩa là phải ổn định trước thời gian setup của clk_b. Để ngõ ra d_outc mang giá trị chính xác như ngõ vào d_outa thì sau khoảng thời gian dao động, d_outb phải ổn định về logic 1. Theo những gì đã trình bày về trạng thái bất ổn định trên đây thì mạch dùng 2 FF không có đảm bảo được cả 2 mong muốn đã đề ra vì:
  1. Trạng thái bất ổn định có thể kéo dài hơn 1 chu kỳ xung clock clk_b nên trạng thái bất ổn định có thể lan truyền tiếp đến FF thứ 2 ở ngõ ra d_outc
  2. d_outb có thể ổn định về "0" hoặc "1" chứ không luôn là "1" nên ngõ ra d_outc chưa chắc có được giá trị logic mong muốn
4. Thời gian trung bình giữa các lỗi MTBF

Lý thuyết về thời gian trung bình giữa các lỗi MTBF (Mean Time Between Failures) sẽ giải thích vì sao 2 FF có thể hạn chế được trạng thái bất ổn định lan truyền trong thiết kế.
MTBF cung cấp cách ước lượng khoảng thời gian giữa các lần xảy ra trạng thái bất ổn định làm cho thiết kế bị lỗi. Lỗi này gọi là lỗi đồng bộ (synchronous failure).
Như đã trình bày ở trên, thời gian để thoát khởi trạng thái bất ổn định là không xác định. Gọi thời gian mong muốn để thoát khỏi trạng thái bất ổn định là tMET thì xác xuất để trạng thái bất ổn định không thể kết thúc trong khoảng thời gian này là:

Trong đó:
  • tMET (resolution time) là thời gian yêu cầu để tín hiệu đạt trạng thái ổn định sau khi rơi vào trạng trạng thái bất ổn định.
  • C2 (decay time constant) là hằng số thời gian suy hao được xác định bởi các thông số điện của FF. 
Hình 8. Minh họa về thời gian tMET
Bên cạnh đó, tốc độ trung bình (average rate) để FF rơi vào trạng thái bất ổn định được tính như sau:
Trong đó:
  • C1 (susceptible time window) là hằng số thời gian phụ thuộc vào thông số điện của FF. Đây là khoảng thời gian mà nếu có sự thay đổi của ngõ vào thì ngõ ra FF sẽ rơi vào trạng thái bất ổn định.
  • fCLK là tần số clock miền nhận tín hiệu bất đồng bộ. Như minh họa hình 6, fclk là tần số của clk_b
  • fDATA là tần số thay đổi mức logic của tín hiệu ngõ vào hay số lần tín hiệu ngõ vào thay đổi giá trị trong 1 giây. Ví dụ, theo hình 6, tín hiệu dữ liệu d_outa thay đổi theo xung clock clk_a nên fDATA = fclk_a.
Rmeta biểu thị số lần FF có thể sẽ rơi vào trạng thái bất ổn định trong 1 giây. Như vậy, số lỗi đồng bộ trung bình trong 1 giây là:

Thời gian trung bình giữa các lỗi MTBF ứng với một một giá trị tMET mong muốn là:

MTBF sẽ được dùng để đáng giá một mạch đồng bộ trong thiết kế có đáp ứng được yêu cầu hay không. Ví dụ, một FF có thông số C1 là 0,1 ns, thông số C2 là 0,5 ns, tần số clock hệ thống là fCLK = 50 Mhz và tốc độ dữ liệu là fDATA = 10 Mhz. Ở đây, tần số clock hệ thống là 50 Mhz, tương ứng chu kỳ là 20 ns. Chúng ta kỳ vọng tMET < (tCLK - setup time), tức là tín hiệu được mong muốn sẽ ổn định trước thời gian setup của xung clock fCLK nếu xảy ra trạng thái bất ổn định. Hình sau là bảng tính MTBF ứng với từng trường hợp kỳ vọng tMET từ 0ns đến 19ns.
Hình 9. Tính toán giá trị MTBF
Qua ví dụ trên, chúng ta có thể thấy thời gian dự trữ dành cho trạng thái bất ổn định càng lớn, tức tMET càng lớn, thì thời gian giữa 2 lần xuất hiện lỗi đồng bộ càng dài, tức MTBF càng lớn. Đồng nghĩa với việc xác suất xuất hiện lỗi đồng bộ càng thấp. Ví dụ, nếu kỳ vọng lỗi đồng bộ ngay lập tức có thể ổn định (tMET = 0), nghĩ là không có khoảng thời gian dự trữ cho trạng thái bất ổn định, thì cứ mỗi 0.02ms là có thể xuất hiện một lỗi đồng bộ. Nếu tMET tăng lên 19ns thì khoảng cách trung bình giữa 2 lỗi đồng bộ là khoảng 20202 năm. Tuy nhiên, MTBF là thời gian "trung bình" nên trên thực tế, không phải cứ sau 20202 năm mới xuất hiện một lỗi đồng bộ mà khoảng cách giữa 2 lần xuất hiện lỗi đồng bộ có thể ngắn hoặc dài hơn 20202 năm nhưng trong suốt quá trình hoạt động của thiết kế, khoảng cách trung bình là 20202 năm.

Như vậy để hạn chế lỗi đồng bộ thì MTBF phải đủ lớn để đáp ứng nhu cầu của ứng dụng thực tế và mạch đồng bộ là mạch có vai trò làm tăng MTBF để hạn chế tối đa sự xuất hiện lỗi đồng bộ.

Bên cạnh đó, MTBF rất nhạy với sự thay đổi của tMET vì phụ thuộc vào tMET theo hàm mũ, vì vậy chỉ cần sự thay đổi nhỏ của tMET cũng làm cho giá trị MTBF biến đổi lớn.

5. Tính toán MTBF cho mạch đồng bộ sử dụng chuỗi FF mắc nối tiếp

5.1 Trường hợp không sử dụng mạch đồng bộ

Trong hình minh họa sau không sử dụng mạch đồng bộ giữa hai miền clock bất đồng bộ. Gọi:
  • Tclk_b là chu kỳ clock clk_b
  • Tsu là thời gian setup (setup time) của FF miền clk_b
  • Tcom là thời gian trễ trên mạch tổ hợp ngõ vào
Hình 10. Giao tiếp giữa 2 miền clock không sử dụng mạch đồng bộ
Nếu tín hiệu bất đồng bộ được sử dụng trực tiếp thì không có thời gian dự trữ nào để để tín hiệu ổn định trước khi được sử dụng, tức là tMET=0. Theo bảng tính của ví dụ hình 9, khả năng xuất hiện lỗi đồng bộ là sau mỗi 0,02ms. Sau mỗi 0,02ms, một lỗi đồng bộ xuất hiện là không thể chấp nhận được đối với bất kỳ thiết kế nào.

5.1 Trường hợp sử dụng 1 FF để làm mạch đồng bộ

Nếu sử dụng một FF để đồng bộ tín hiệu thì khoảng thời gian dự trữ (khoảng thời gian mong muốn) để trạng thái bất ổn định trở về trạng thái ổn định nếu xảy ra vi phạm timing là:
tMET = Tclk_b - (Tcom + Tsu)

Trong đó Tsu là thông số của FF nên tMET phụ thuộc vào Tcom. Tcom càng lớn thì tMET càng nhỏ và MTBF càng nhỏ. Xét lại bảng tính hình 9, giả sử Tsu=1ns, nếu:
  1. Mạch tổ hợp đơn giản có độ trễ nhỏ, ví dụ Tcom=2ns thì tMET=20-3=17ns sẽ ứng với MTBF là 370 năm
  2. Mạch tổ hợp phức tạp có độ trễ lớn, ví dụ Tcom=13ns thì tMET=20-14=6ns sẽ ứng với MTBF là 3,255s
Hình 11. Sử dụng 1 FF để làm mạch đồng bộ
Việc sử dụng 1 FF làm cho Tcom ảnh hưởng trực tiếp đến tMET. Như đã trình bày trước đó, MTBF rất nhạy với sự thay đổi của tMET nên việc chỉ sử dụng một FF để đồng bộ là vô cùng rủi ro và phụ thuộc quá nhiều vào việc thiết kế phía sau mạch đồng bộ.

5.2 Trường hợp sử dụng 2 FF để làm mạch đồng bộ

Để thời gian dữ trữ cho việc giải phóng khỏi trạng thái bất ổn định tMET được lớn nhất thì Tcom phải nhỏ nhất. Chèn thêm 1 FF là cách đơn giản và không làm thay đổi mạch chức năng phía sau. Khi 2 FF được sử dụng, giữa 2 FF chỉ là dây dẫn và không có mạch tổ hợp nào. Để độ trễ dây dẫn là không đáng kể thì khi layout mạch 2 FF của mạch đồng bộ phải đặt gần nhau, Tcom xem như bằng 0.

tMET = Tclk_b - Tsu

Theo ví dụ trên nếu Tsu = 1ns thì tMET = 19ns và MTBF là 20202 năm.
Hình 12. Sử dụng 2 FF để làm mạch đồng bộ
Đến đây, chúng ta cần lưu ý hai điểm khi sử dụng chuỗi FF để đồng bộ:
  1. Mạch đồng bộ phải dùng ít nhất là 2 FF
  2. Giữa hai FF của mạch đồng bộ không được phép chèn thêm bất cứ logic mạch tổ hợp nào.
Tiếp theo nếu tăng tần số xung clock clk_b lên, chu kỳ Tclk_b sẽ giảm và thời gian tMET cũng sẽ giảm theo. Ví dụ, tăng tần số clk_b lên 100Mhz, chu kỳ là 10ns, tMET sẽ là:
tMET = Tclk_b - Tsu = 10 - 1 = 9ns

Tính lại MTBF, ta sẽ có:
MTBF ≈ 10,94 phút
Để giải quyết vấn đề này, nhiều thư viện công nghệ (thư viện để tổng hợp và chế tạo vi mạch) hỗ trợ loại D-FF đặc biệt gọi là metastablility-hardened D-FF, tạm dịch là "D-FF kháng bất ổn định", dùng riêng cho mạch đồng bộ. Loại FF này có các hệ số C1, C2 và Tsu nhỏ hơn các FF thông thường nên MTBF sẽ tăng đáng kể.

5.3 Sử dụng nhiều hơn 2 FF để thực hiện mạch đồng bộ

Nếu thư viện công nghệ không có FF đáp ứng được thông số MTBF cần thiết thì sao? Chúng ta có thể tăng MTBF bằng cách mắc nối tiếp nhiều hơn 2 FF. Xét ví dụ, mạch đồng bộ dùng 3 FF để xem tại sao mắc thêm nhiều FF hơn thì có thể đạt MTBF mong muốn.
Hình 13. Mạch đồng bộ sử dụng 3 FF
Tốc độ trung bình để FF đầu tiên rơi vào trạng thái bất ổn định:
Khi FF đầu tiên rơi vào trạng thái bất ổn định thì xác suất để điều kiện bất ổn định tồn tại vượt qua chu kỳ clock hiện tại là:

Nếu trạng thái bất ổn định của FF đầu tiên duy trì quá một chu kỳ xung clk_b thì FF thứ 2 sẽ rơi vào trạng thái bất ổn định và xác suất để điều kiện bất ổn định tồn tại vượt qua 1 chu kỳ clock là:


MTBF của mạch đồng bộ 3 FF sẽ là:

Nếu so với mạch đồng bộ dùng 2 FF, số mũ của tử số MTBF ở mạch dùng 3 FF lớn gấp 2 lần số mũ của tử số ở mạch dùng 2 FF. Sô mũ của tử số mạch dùng 3 FF:


Xét lại ví dụ trước, giá trị MTBF ứng với fclk_b = 100Mhz, fDATA = 10Mhz, C1 = 0,1ns, C2 = 0,5ns, Tsu = 1ns là 1367 năm. Như vậy, chỉ cần mắc thêm 1 FF mà MTBF tăng từ 10,94 phút ở mạch dùng 2 FF lên 1367 năm ở mạch dùng 3 FF.

6. Tóm tắt

Bài này giải thích rõ về:
  1. Trạng thái bất ổn định và những nguy hiểm của trạng thái này
  2. Tại sao mạch mắc nhiều FF nối tiếp lại hạn chế được trạng thái bất ổn định lan truyền trong thiết kế
Vấn đề kế tiếp đối với việc thiết kế mạch đồng bộ các tín hiệu bất đồng bộ là:
  1. Trường hợp nào sử dụng mạch đồng bộ mắc nối tiếp nhiều FF
  2. Làm sao để lấy mẫu đúng được dữ liệu mong muốn. Bạn đọc có thể quan sát lại hình 7, trong hình này, việc sử dụng 2 FF chỉ có thể hạn chế được sự lan truyền của trạng thái bất ổn định chứ không đảm bảo lấy được giá trị mong muốn ở ngõ vào.
Các vấn đề trên sẽ được trình bày trong những bài tiếp theo.

Lịch sử cập nhật:
2020.01.07 - Sửa link hình minh họa