• 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

    Vi mạch và Ứng dụng

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

    Vi mạch và Ứng dụng

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

[Low Power] Các kỹ thuật thiết kế giúp giảm công suất tiêu thụ

Bài viết này trình bày khái niệm cơ bản về công suất thấp và các kỹ thuật giúp giảm công suất tiêu thụ trong thiết kế số. Trong đó, nội dung tập trung vào các kỹ thuật ở mức front-end, thiết kế kiến trúc và thiết kế RTL, có thể áp dụng được. Các kỹ thuật được ở mức back-end chỉ được mô tả cơ bản.

1) Tổng quan về khái niệm công suất thấp (low power)
Trên thị trường hiện nay, hiệu suất cao (high performance) và công suất thấp (low power) là hai yếu tố góp phần lớn vào khả năng thương mại của một vi mạch. Tùy ứng dụng cụ thể, việc tối ưu công suất tiêu thụ được hỗ trợ ở các mức độ khác nhau. Ví dụ:
  • Vi mạch dùng trong điện thoại yêu cầu mức tiêu thụ công suất ít hơn vi mạch dùng trong laptop. Bạn chắc chắn không muốn dùng một chiếc điện thoại mà phải đeo thêm một bình ắc quy để cấp nguồn cho nó.
  • Vi mạch dùng trong laptop yêu cầu mức tiêu thụ công suất ít hơn vi mạch dùng trong máy tính để bàn (desktop).
  • Vi mạch dùng trong máy tính để bàn yêu cầu mức tiêu thụ công suất ít hơn vi mạch dùng trong máy chủ (server).

Hình 1: Minh họa công suất tiêu thụ tăng dần từ trái qua phải tùy vào ứng dụng
Tiêu chí công suất thấp đã trở thành yếu tố ngày càng quan trọng và được dùng để so sánh giữa các chip cùng phân khúc thị trường. Đặc biệt, đối với các ứng dụng dùng Pin, thiết bị di động (smart watch, smart phone, laptop, …), thiết bị dùng nguồn năng lượng từ tín hiệu không dây (contactless card, RFID card,…), … thì việc tiêu thụ công suất thấp đến cực thấp (ultra-low power) hay siêu thấp (extreme-low power) là trở thành yêu cầu tối quan trọng.
Nếu hai dòng chip tương đương nhau về chức năng và hiệu suất thì chip nào tiêu thụ công suất ít hơn thì chip đó có hiệu quả sử dụng năng lượng (power efficient) tốt hơn.
Chú ý rằng, đối với một chip, “công suất thấp” phải đi đôi với “hiệu quả sử dụng năng lượng”. Một chip rơi vào một trong hai trường hợp sau đây đều bị đánh giá là có hiệu quả sử dụng năng lượng thấp :
  • Một chip tiêu thụ công suất rất thấp nhưng xử lý chậm chạp, hiệu năng kém hoặc không đủ đáp ứng nhu cầu ứng dụng.
  • Một chip xử lý cực nhanh, thời gian xử lý trung bình đáp ứng gần như 100% các yêu cầu của ứng dụng nhưng tiêu thụ công suất gấp nhiều lần các chip khác cùng loại.
Như vậy, việc thiết kế công suất thấp cần được cân bằng với hiệu quả xử lý. Điều này dẫn đến phạm vi ứng dụng các kỹ thuật công suất thấp trong chip sẽ khác nhau.
2) Công suất tiêu thụ của logic bên trong chip
Trước khi tìm hiểu các kỹ thuật tối ưu công suất, chúng ta cần biết mạch logic bên trong chip (cổng logic, Flip-Flop, Latch, …) sẽ tiêu thụ công suất như thế nào? và điều gì ảnh hưởng đến công suất tiêu thụ của các logic này? Hiểu được nguồn gốc của việc tiêu thụ công suất trong mạch logic giúp chúng ta giải thích được nguyên lý và ảnh hưởng của các kỹ thuật thiết kế công suất thấp.
Hình 2: Cấu tạo bên trong một chip (IC)
Chúng ta nhìn sâu vào bên trong một chip. Công suất tiêu thụ của một chip chủ yếu liên quan đến hoạt động của các CMOS. Về cơ bản, tổng công suất tiêu thụ (Ptotal) gồm:
Ptotal = Pactive + Pleakege = Pdynamic + Psc + Pleakage
Công suất tiêu thụ trong mạch logic chia làm hai loại:
  • Công suất tích cực (active power, Pactive) là năng lượng tiêu tiêu thụ khi mạch logic (cổng logic) chuyển mạch (switching).
    • Công suất động (dynamic power, Pdynamic), còn gọi là công suất chuyển mạch (switching power), là năng lượng cần có cho việc nạp hoặc xả trên tụ điện ở tải ngõ ra (load capacitance)
    • Công suất ngắn mạch (short circuit power, Psc) là năng lượng tiêu hao do dòng ngắn mạch từ nguồn (source) đến đất (ground) xuất hiện trong khi các CMOS chuyển trạng thái.
Hình 3: Cấu trúc CMOS của cổng đảo (inverter, NOT)
Hình 4: Minh họa các dòng sinh ra công suất tích cực khi xảy ra chuyển mạch trên một cổng đảo (a) Dòng nạp khi ngõ vào In chuyển mức logic từ 1 sang 0 (b) Dòng xả khi ngõ vào In chuyển mức logic từ 0 sang 1 (c) Dòng ngắn mạch trong khi chuyển mạch
  • Công suất tĩnh (static power), còn gọi là công suất rò (leakage power, Pleakage) là năng lượng hao tổn do dòng rò, sinh ra khi logic trong trạng thái ổn định (steady-state), không có sự chuyển mạch. Các nguồn dòng rò gồm:
    • I1: Dòng rõ dưới ngưỡng (Subthreshold leakage, ISUB), ký hiệu là Isub, là dòng từ cực D đến cực S. Dòng rò này sinh ra do phân cực yếu, dưới mức ngưỡng.
    • I2: (Drain-Induced Barrier Lowering – DIBL)
    • I2’: Dòng puchthrough (Channel punchthrough current)
    • I3: Dòng rò đường ống trực tiếp từ cực G (Gate direct-tunneling leakage current) sinh ra do độ dày lớp “gate oxide” mỏng nên có các điện tử di chuyển qua lại giữa cực G và chất nền.
    • I4: Dòng rò cực D do cảm ứng cực G (Gate-induced drain leakage current, GIDL).
    • I5: Dòng rò ngược trên lớp tiếp giáp p-n (reverse-biased junction leakage current), còn gọi là dòng rò diode. Dòng này chảy từ cực S hoặc D đến chất nền (substrate).
    • I6: Dòng cực cổng G do tiêm chất mang nóng (Gate current due to hot-carrier injection)
Hình 5: Các loại dòng rò trên CMOS
Các kỹ thuật giúp giảm công suất tiêu thụ của một vi mạch được gọi chung là “kỹ thuật thiết kế công suất thấp” (low power design technique hoặc low power technique). 
Mỗi kỹ thuật thiết kế công suất thấp có mức ảnh hưởng khác nhau, có kỹ thuật giúp giảm công suất tiêu thụ đáng kể, có kỹ thuật chỉ giúp giảm ít. Mỗi kỹ thuật cũng có mục tiêu giảm công suất khác nhau, có kỹ thuật giúp giảm công suất tích cực, có kỹ thuật giúp giảm công suất sinh ra do dòng rò. 
3) Khả năng giảm công suất tiêu thụ 
3.1) Tổng quan 
Căn cứ trên các loại công suất tiêu thụ đã trình bày, việc giảm công suất tiêu thụ dựa trên: 
  • Giảm công suất tích cực (Pactive) 
  • Giảm công suất dò dòng rò (Pleakage) Công nghệ có kích thước lớn, công suất dòng rò chỉ chiếm một tỷ lệ rất nhỏ so với công suất tích cực. Công nghệ có kích thước càng thấp công suất dòng rò chiếm tỷ lệ đáng kể.
Hình 6: Tỷ lệ tiêu thụ năng lượng giữa công suất động và công suất dòng rò theo công nghệ
3.2) Khả năng giảm công suất tích cực 
3.2.1) Giảm công suất động (Pdynamic)
Việc tiêu thụ công suất động trên một mạch logic (một cổng, một nhóm mạch logic hoặc một chip) là tổng của công suất tiêu thụ nhất thời (Transient Power Consumtion, PT) và công suất tiêu thụ trên tải điện dung (Capacitive-Load Power Consumption, PL).
Công suất tiêu thụ nhất thời được tính theo công thức sau:
Trong đó: 
  • Nsw là số bit chuyển mạch. Nếu chỉ có một bit chuyển mạch thì Nsw=1
  • Cpd là điện dung của việc tiêu tán năng lượng động. Nó là điện dung nội được tính khi không tải và ngõ ra không chuyển mạch. 
  • Vdd là điện áp nguồn 
  • fi là tần số tín hiệu ngõ vào
Công suất tiêu thụ trên tải điện dung được tính theo công thức sau:
Trong đó: 
  • Nsw là số ngõ ra chuyển mạch. Nếu chỉ có một bit chuyển mạch thì Nsw=1
  • CL là điện dung tải ở ngõ ra. Đây là điện dung ngoài 
  • Vdd là điện áp nguồn 
  • fo là tần số tín hiệu ngõ ra 
Các công thức trên cho thấy rằng việc tiêu thụ công suất có thể được giảm bằng cách: 
  • Giảm Nsw bằng cách giảm số bit trên các tín hiệu. 
  • Giảm CL bằng cách giảm số lượng fanout, số lượng kết nối từ ngõ ra của một cổng logic đến ngõ vào của các cổng logic khác. 
  • Giảm Cpd là phần điện dung ký sinh trong linh kiện CMOS nên phụ thuộc công nghệ nên không giảm được Cpd trên mỗi linh kiện CMOS mà chỉ có thể giảm được tổng điện dung kí sinh bằng cách tối ưu tài nguyên thiết kế. 
  • Giảm Vdd bằng cách giảm điện áp sử dụng. Giảm fi fo bằng cách giảm số lượng chuyển đổi mức logic, chuyền từ 0 sang 1 hoặc từ 1 xuống 0, trên các tín hiệu, bao gồm cả tín hiệu clock và các tín hiệu khác.
3.2.2) Giảm công suất ngắn mạch (Psc)
Mạch CMOS bao gồm một phần nối lên nguồn Vdd (pull-up), một phần nối đất (pull-down). Khi chuyển mạch, trong một khoảng thời gian rất ngắn, cả hai phần cùng dẫn làm cho hiện tượng ngắn mạch sẽ xảy ra. Dòng Isc sinh ra chảy từ nguồn xuống đất gọi là dòng ngắn mạch gây tiêu hao năng lượng.
Hình 7: Cấu trúc mạng CMOS của một cổng NAND
Công suất ngắn mạch được tính như sau:
Trong đó: 
  • Nsw là số lượng cổng chuyển mạch. Nếu chỉ có một cổng thì Nsw=1
  • β (beta) là độ lợi của CMOS 
  • Vdd là điện áp nguồn 
  • Vt là điện áp ngưỡng 
  • f là tần số chuyển mạch, số lượng chuyển mạch trong 1 giây.
  • τ (tô) là gian chuyển cạnh lên/xuống của ngõ vào.
Hình 8: Thời gian xuất hiện hiện tượng ngắn mạch trên cổng đảo
Việc giảm công suất ngắn mạch dựa trên các thông số sau:
  • Giảm Nsw bằng cách tối ưu tài nguyên giảm số lượng cổng.
  • Giảm f bằng cách giảm số lần chuyển trạng thái ở các ngõ vào.
  • Giảm beta, phụ thuộc vào công nghệ.
  • Giảm Vdd và tăng Vt phụ thuộc vào công nghệ và khâu thiết kế vật lý.
  • Giảm τ (tô), phụ thuộc vào công nghệ.
Trong các yếu tố trên, khâu thiết kế front-end chỉ có thể tác động đáng kể vào 2 yếu tố là Giảm Nsw và giảm f.

3.3) Khả năng giảm công suất dòng rò

Dòng rò luôn tồn tại khi mạch logic được cấp nguồn. Nó là nguyên nhân tiêu tốn năng lượng đáng kể khi mạch logic không tích cực. Hai thông số ảnh hưởng lớn đến dòng rò là:
  • Điện áp nguồn Vdd
  • Điện áp ngưỡng Vt
Ở đây, tác giả không xét đến yếu tố công nghệ hay cấu trúc CMOS mà chỉ xét đến những yếu tố mà người thiết kế có thể tác động được khi sử dụng một thư viện công nghệ cố định.
4) Kỹ thuật thiết kế công suất thấp được áp dụng ở khâu nào?
Để giảm công suất trong một vi mạch, các kỹ thuật tối ưu công xuất cần được áp dụng đồng bộ từ khâu front-end, đến khâu back-end và công nghệ sử dụng. Ở đây, tác giả phân các mức thiết kế như sau:
  • Thiết kế kiến trúc hệ thống: thiết kế cấu trúc tổng quan, phân tích hệ thống, phương pháp và cơ chế giúp giảm công suất toàn chip và từng miền trong chip.
  • Thiết kế RTL: Phân tích các phương pháp giúp giảm công suất trong một thành phần, một khối hoặc một IP cụ thể
  • Thiết kế vật lý: Các kỹ thuật liên quan đến tổng hợp và layout
  • Công nghệ: Các kỹ thuật liên quan đến việc chỉnh sửa và tối ưu cell và CMOS của thư viện công nghệ (thư viện dùng để chế tạo và sản xuất chip)
Hình 9: Các mức thiết kế
Một số kỹ thuật thiết kế công suất thấp cần có sự phối hợp thực hiện ở nhiều mức thiết kế nhưng một số kỹ thuật chỉ áp dụng ở một mức thiết kế nào đó. Bài viết này tập trung vào các kỹ thuật có thể áp dụng trong thiết kế kiến trúc hệ thống và thiết kế RTL thuộc khâu front-end.
Thiết kế kiến trúc hệ thống quyết định đến công suất tiêu thụ toàn chip. Công suất tiêu thụ có thể giảm tối đa bao nhiêu là tùy thuộc vào bước này. Nó sẽ ảnh hưởng đến khả năng áp dụng các kỹ thuật giảm công suất ở các mức thiết kế khác. Ví dụ, ở mức thiết kế kiến trúc, một miền nào đó được quyết định “phải luôn được cấp clock” trong suốt quá trình hoạt động thì kỹ thuật “clock gating” không được dùng để on/off clock cho toàn miền để giảm công suất tích cực.
Thiết kế RTL là thiết kế chi tiết các thành phần logic, lõi IP trong một chip. Dựa trên yêu cầu chung của thiết kế kiến trúc, bước này áp dụng các kỹ thuật phù hợp để giảm công suất ở phạm vi cục bộ ở từng thành phần logic. Ví dụ, lõi IP A thuộc miền luôn được cấp clock tuy nhiên các block trong lõi IP có thể được áp dụng kỹ thuật clock gating để on/off clock cho từng thành phần dựa trên yêu cầu hoạt động cụ thể. Bên cạnh đó, RTL code của các logic bên trong từng block sẽ được mô tả theo hướng cho phép bước “thiết kế vật lý” có thể chèn các cell clock gating để on/off clock.
Thiết kết vật lý được hiểu là các bước từ tổng hợp (synthesis) xuống đến layout. Cũng căn cứ trên yêu cầu chung của thiết kế kiến trúc và chức năng cụ thể của thiết kế RTL, bước này áp dụng các kỹ thuật phù hợp đế tối ưu công suất tiêu thụ. Ví dụ, bước synthesis sẽ quyết định việc chèn hay không chèn các cell clock-gating.
Hình 10: Minh họa sự ảnh hưởng của các mức thiết kế đến kỹ thuật clock gating
Trong hình minh họa trên, kỹ thuật clock gating không được dùng để tắt clock của miền C vì miền này yêu cầu luôn cấp clock trong suốt quá trình hoạt động. Tuy nhiên ở mức thiết kế RTL, các thành phần logic trong miền C có thể được áp dụng kỹ thuật clock gating để tắt clock các FF khi không cần cập nhật giá trị mới.
5) Một số phương pháp giảm công suất tiêu thụ
5.1) Phân chia miền clock (Multi clock domain)
5.1.1) Mô tả kỹ thuật
Phân chia miền clock là kỹ thuật sử dụng nhiều nguồn clock, có thể đồng bộ hoặc bất đồng bộ, có tần số khác nhau trong một vi mạch. Khi áp dụng kỹ thuật này, giao tiếp giữa các miền clock cần có cơ chế bắt tay hoặc đồng bộ. Các kỹ thuật đồng bộ giữa các miền clock bất đồng bộ có thể được tham khảo ở đây.
Hình 11: Kỹ thuật phân chia miền clock (multi clock domain)
Trong một vi mạch, không phải tất cả các thành phần đều cần hoạt động với tần số cao nhất. Mỗi thành phần phải được xem xét trên hoạt động tổng thể và ứng dụng để quyết định tần số hoạt động thực tế. Tần số của clock chỉ cần được cấp đủ để một thành phần chức năng đảm bảo tốc độ xử lý với các ứng dụng yêu cầu.
Bên cạnh đó, trong một thành phần chức năng (một lõi IP, một khối), tất cả các giao tiếp và logic không cần phải hoạt động cùng một tần số. Tùy vào thực tế ứng dụng, mỗi phần logic cũng có thể được cấp một tần số khác nhau.
Ví dụ, một lõi IP truy xuất bộ nhớ SRAM có hai đường giao tiếp, một giao tiếp AXI dùng để truy xuất bộ nhớ và một giao tiếp APB dùng để cấu hình hoạt động, kiểm tra trạng thái. Việc truy xuất bộ nhớ là một hoạt động thường xuyên và cần tốc độ nhanh nên cần tần số cao. Việc cấu hình hoạt động và kiểm tra trạng thái thường chỉ thực hiện vài lần, trước khi hoạt động hoặc trong các trường hợp đặc biệt chứ không thường xuyên nên không cần tần số cao.
Hình 12: Phân chia miền clock trong một lõi IP
5.1.2) Khả năng giảm công suất
Kỹ thuật này giúp giảm số lần chuyển mạch bằng cách sử dụng các clock chậm cho thành phần không yêu cầu tốc độ xử lý cao. Việc sử dụng clock chậm hơn giúp:
  • Giảm chuyển mạch trên các FF/Latch do thay đổi mức logic của xung clock hoặc thay đổi mức logic trên các ngõ vào của FF.
  • Giảm chuyển mạch trên các mạch tổ hợp sử dụng ngõ ra của các FF/Latch.
Khi tín hiệu clock chuyển mức logic, các logic của FF sẽ bị chuyển mạch làm tiêu hao năng lượng. Sử dụng clock có tần số càng cao thì hoạt động chyển mạch càng xảy ra nhiều và FF tiêu thụ năng lượng càng lớn. Vì vậy, việc giảm tần số giảm công suất tiêu thụ trên các FF.
Hình 13: Cấu trúc của một Flip-Flop (FF)
Hình trên là mạch nguyên lý và hoạt động của một FF khi clock CK ở mức logic 0 và mức logic 1. Việc chuyển mức logic của clock CK sẽ gây chuyển mạch liên tục trên các cổng truyền T1, T2, T3 và T4. Hoạt động của FF và Latch được giải thích chi tiết ở bài viết này.
Hình 14: Ảnh hưởng của tần số xung clock đến khả năng giảm công suất
Đối với các mạch tổ hợp sử dụng ngõ ra của các FF/Latch thì tốc độ chuyển mạch tối đa bằng tần số xung clock. Giả sử ngõ ra của các FF luôn thay đổi mức logic theo cạnh lên xung clock thì mạch tổ hợp sử dụng các ngõ ra này cũng thay đổi tối đa theo các cạnh lên xung clock. Như vậy, việc giảm tần số xung clock giúp giảm tốc độ chuyển mạch trên các mạch tổ hợp (ví trí 2 trong hình minh họa 14).
Bên cạnh đó, ngõ ra của các FF (ví trí 3 trong hình minh họa 14) và mạch tổ hợp sẽ tiếp tục được nối đến ngõ vào của các FF khác. Vì vậy, giảm tần số hoạt động sẽ góp phần giảm chuyển mức logic trên các ngõ vào FF (chân D và chân reset), từ đó, giúp giảm chuyển mạch trên FF.
5.1.3) Công việc ở các mức thiết kế
Mức kiến trúc hệ thống:
  • Phân tích và phân chia các miền clock
  • Phân tích cấu trúc cây clock trong hệ thống
Mức thiết kế RTL:
  • Thiết kế các bộ điều khiển clock, bộ chia clock
  • Kết nối đúng nguồn clock đến từng thành phần
  • Áp dụng các kỹ thuật đồng bộ trên các kết nối giữa các miền clock bất đồng bộ
Mức thiết kế vật lý:
  • Thực hiện tổng hợp và layout tối ưu theo từng miền clock
  • Đảm bảo không có vi phạm timing trong từng miền clock
5.2) Hiệu chỉnh tần số clock (clock frequency scaling)
Hiệu chỉnh tần số là kỹ thuật thay đổi tần số clock cấp cho các thành phần logic để phù hợp với chế độ và điều kiện hoạt động của chip. Việc thay đổi tần số có thể thực hiện thông qua các thông số cấu hình cố định (static) hoặc tự động trong quá trình hoạt động (dynamic).
Hiệu chỉnh tần số tĩnh (static frequency scaling): Tần số clock cấp cho một thành phần logic có thể được cấu hình tùy thuộc vào chế độ hoạt động. Một tần số cố định sẽ được cấp cho thành phần logic sau khi việc cấu hình hoàn tất.
Hiệu chỉnh tần số động (dynamic frequency scaling): Tần số clock cấp cho một thành phần logic có thể tự động điều chỉnh dựa trên điều kiện hoạt động thực tế như nhiệt độ, điện áp, … Ví dụ, để tránh quá nhiệt, một chip sẽ được tích hợp cảm biến nhiệt độ bên trong. Khi nhiệt độ quá ngưỡng cho phép, tần số clock của một vài thành phần như CPU sẽ bị giảm. Lúc này, hiệu năng xử lý chung của chip sẽ bị giảm nhưng vẫn đảm hoạt động đúng chức năng.
Tham khảo công nghệ SpeedStep của Intel, đây là công nghệ cho phép quản lý năng lượng CPU hiệu quả thông qua việc hỗ trợ nhiều mức tần số và điện áp hoạt động khác nhau.
Hình 15: Bảng liên hệ giữa tần số hoạt động tối đa và điện áp sử dụng trên CPU Pentium M của Intel

5.3) Tối ưu tài nguyên (resource) 
5.3.1) Mô tả kỹ thuật 

Tối ưu tài nguyên là kỹ thuật cần được xem xét hàng đầu trong tất cả các kỹ thuật giảm công suất tiêu thụ. Tối ưu tài nguyên nghĩa là loại bỏ hoặc giảm bớt các khối chức năng và cổng logic nhưng vẫn đảm bảo yêu cầu kỹ thuật chung của chip. 
Tài nguyên ở đây có thể được quy về đơn vị cổng (gate) để định lượng. Một đơn vị cổng là một cổng NAND 2 ngõ vào, 1 ngõ ra. Ví dụ, một chip có tổng tài nguyên là 1 triệu cổng không có nghĩa là chip được cấu tạo từ 1 triệu cổng NAND mà nó được cấu tạo bằng nhiều loại cổng logic khác nhau nhưng được quy tương đương với 1 triệu cổng NAND. 
Tùy vào tình huống cụ thể, một số phương pháp sau đây có thể được áp dụng: 
  • Tối ưu cấu trúc và thuật toán: Một chức năng có thể được thực hiện bằng nhiều cách khác nhau. Mỗi cách thực hiện sẽ có số lượng tài nguyên sử dụng tối thiểu khác nhau. Việc lựa chọn cấu trúc và thuật toán quyết định lớn đến khả năng tối ưu tài nguyên. 
  • Chia sẻ tài nguyên: nhiều chức năng dùng chung một khối chức năng, mạch tổ hợp hay mạch tuần tự trong một thiết kế. 
  • Loại bỏ logic không sử dụng: xóa bỏ phần logic không sử dụng trong các thiết kế ở mức RTL code hoặc gate netlist. 
Về việc tối ưu cấu trúc, các bạn có thể tham khảo bài viết về lõi IP mã hóa AES-128 để thấy được sự ảnh hưởng trong việc lựa chọn cấu trúc và thuật toán. Trong bài viết này, tài nguyên mạch tổ hợp có thể giám đến 50% khi thuật toán tính S-BOX được thực hiện theo phương pháp biến đổi toán học thay vì dùng MUX. 
Một số trường hợp phổ biến khác được sử dụng thường xuyên đó là: 
  • Sử dụng số bit mã hóa tối thiểu. Ví dụ, một máy trạng thái (FSM) có 6 trạng thái thì dùng 3 bit để mã hóa.
  • Dùng phương pháp dịch để thực hiện các phép nhân với 2^n. Ví dụ, việc nhân một số được biểu diễn bằng 4 bit với 4 tương đương với việc dịch trái 2 bit.
Hình 16: Dùng dịch trái thay cho bộ nhân trong các phép nhân với 2^n
Hình trên cho thấy việc thực hiện phép nhân một số 4 bit với giá trị 4 (2^2) bằng phương pháp dịch trái sẽ không cần dùng bất cứ logic nào. 
Một ví dụ khác, một khối chức năng nhận nối tiếp từng gói 8 bit nhị phân rồi chuyển đổi từng gói 8 bit thành mã Gray trước khi ghép lại thành một gói 512 bit gửi đến khối khác. Khối này có thể được thiết kế như sau: 
  • Sử dụng 64 bộ chuyển đổi mã Gray để biến đổi cùng lúc 512 bit.
  • Sử dụng 1 bộ chuyển đổi mã Gray để biến đối nối tiếp từng nhóm 8 bit. Cách này tiết kiệm tài nguyên và nhiều ưu điểm hơn cách đầu.
Hình 17: Một ví dụ về việc thay đổi cấu trúc để tối ưu tài nguyên
Về kỹ thuật chia sẻ tài nguyên, kỹ thuật này thường áp dụng trong trường hợp: 
  • Nhiều chức năng sử dụng các thành phần logic tương tự nhau nhưng các thành phần này không hoạt động cùng một thời điểm. 
  • Ưu tiên chia sẻ phần logic có tài nguyên lớn hơn. Trong một thiết kế, có thành phần dùng nhiều cổng logic, có thành phần dùng ít cổng logic hơn. Nếu không thể thực hiện phương pháp chia sẻ tài nguyên cho các thành phần này cùng lúc thì ưu tiên áp dụng cho phần tốn nhiều logic.
Ví dụ, một khối chức năng thực hiện nhân và cộng các giá trị 8 bit từ nhiều nguồn ngõ vào và chỉ đưa ra một kết quả tại một thời điểm. Khối này có thể được thiết kế dùng “2 bộ nhân, 2 bộ cộng và 1 MUX” hoặc “1 bộ nhân, 1 bộ cộng và 3 MUX”. Vì bộ nhân và bộ cộng 8 bit có tài nguyên lớn hơn MUX, nên cách “1 bộ nhân, 1 bộ cộng và 3 MUX” được lựa chọn để tối ưu tài nguyên hiệu quả.
Hình 18: Chia sẻ tài nguyên mạch logic bộ nhân và cộng
RTL code của cấu trúc dùng 2 bộ nhân và 2 bộ cộng:
always_comb begin
  if (Sel)
    MulOut = MulInA * MulInB + AddIn1;
  else
    MulOut = MulInC * MulInD + AddIn2;
end
RTL code của cấu trúc dùng 1 bộ nhân và 1 bộ cộng:
always_comb begin
  MulIn1 = Sel? MulInA: MulInC;
  MulIn2 = Sel? MulInB: MulInD;
  AddIn = Sel? AddIn1: AddIn2;
  MulOut = MulIn1 * MulIn2 + AddIn;
end
Kết quả tổng hợp trên cùng một linh kiện FPGA với Quartus II, số lượng phần tử logic khi dùng 1 bộ MUX là 257 trong khi dùng 3 bộ MUX là 142.
(a) Kết quả tổng hợp cho cấu trúc dùng 2 bộ nhân và 2 bộ cộng
(b) Kết quả tổng hợp cho cấu trúc dùng 1 bộ nhân và 1 bộ cộng
Hình 19: Kết quả tổng hợp ví dụ hình 18 trên FPGA
Một ví dụ khác, một FSM có 2 trạng thái:
  • PRE_DELAY: giữ trong 89 chu kỳ xung clock trước khi chuyển sang POST_DELAY
  • POST_DELAY: giữ trong 120 chu kỳ xung clock trước khi chuyển sang PRE_DELAY.
Trường hợp này, một bộ đếm 7 bit được dùng để đếm số chu kỳ ở mỗi trạng thái thay vì dùng hai bộ đếm, 1 bộ đếm 6 bit dùng cho PRE_DELAY và một bộ đếm 6 bit dùng cho POST_DELAY.
Hình 20: Chia sẻ tài nguyên bộ cộng
Về việc loại bỏ logic không sử dụng, trong một số trường hợp, nhiều logic được gán giá trị ngõ vào cố định nên ngõ ra không bao giờ thay đổi trạng thái trong suốt quá trình hoạt động. Phần logic này có thể được tối ưu bằng một trong hai cách: 
  • Xóa bỏ phần code không dùng trong các file RTL code
  • Giữ nguyên RTL code nhưng cho phép trình tổng hợp (compiler) tối ưu và xóa bỏ các logic không sử dụng 
Trên thực tế, việc xóa bỏ một phần code đôi khi không khả thi, đặc biệt là đối với các phần code phức tạp hoặc code được tái sử dụng từ dự án trước hoặc code được phát triển bởi bên thứ 3 (người khác, công ty khác), vì nó gây rủi ro về việc sinh ra bug và tốn thời gian để kiểm tra lại thiết kế. 
Việc cho phép trình tổng hợp xóa bỏ các logic không sử dụng hoàn toàn phụ thuộc vào chiến lược tối ưu và yêu cầu (rule) chung của khâu back-end. Nếu không có sự thảo luận giữa người thiết kế và người làm back-end, người thiết kế sẽ không biết chắc phần logic không sử dụng có được xóa bỏ hay không. 
5.3.2) Khả năng giảm công suất 
Việc tối ưu tài nguyên giúp loại bỏ và giảm bớt các phần tử tiêu thụ điện không cần thiết nên đương nhiên giúp giảm cả công suất tích cực và công suất do dòng rò. 
5.3.3) Mức thiết kế 
Mức thiết kế kiến trúc: 
  • Phân tích và lựa chọn cấu trúc, thuật toán 
  • Phân chia khối chức năng 
Mức thiết kế RTL:
  • Phân tích và tối ưu mạch logic 
Mức thiết kế vật lý: Cho phép tối ưu và xóa bỏ các thành phần logic không sử dụng, ví dụ như thành phần không bao giờ thay đổi giá trị, các thành phần logic cùng chức năng, …
Đối với kỹ thuật tối ưu tài nguyên thiết kế, một điểm quan trọng cần nắm rõ là trình tổng hợp chỉ có khả năng tối ưu trên cấu trúc logic được người thiết kế mô tả bằng RTL code chứ không có khả năng thay đổi cấu trúc hoặc chức năng logic hiện có thành cấu trúc hoàn toàn khác nhưng có thể thực hiện cùng chức năng. Bài viết về lõi IP AES-128 là một ví dụ, nếu bạn thiết kế S-BOX theo cách dùng MUX thì trình tổng hợp chỉ tối ưu mạch MUX nhưng bản chất vẫn là MUX chứ không thể chuyển tối ưu thành một phương pháp khác như cách biến đổi số học. Như vậy, khả năng tối ưu của một thiết kế phụ thuộc lớn vào thiết kế mức kiến trúc và RTL.
Hình 21: Quá trình tổng hợp RTL code thành gate netlist
Trong hình minh họa trên, việc tối ưu (optimization) của trình tổng hợp là dựa trên cấu trúc có sẵn mô tả bởi RTL chứ không phải thay đổi cấu trúc của mạch logic.
5.4) Clock gating 
5.4.1) Mô tả kỹ thuật 
Đây là một kỹ thuật phổ biến giúp giảm công suất động. Nguyên lý của kỹ thuật này là tắt nguồn clock trên các FF khi chúng không hoạt động hoặc không cần cập nhật giá trị mới. 
Trong thiết kế thông thường, một số lượng lớn các FF thường chỉ cập nhật giá trị mới trong một điều kiện nhất định. Vì vậy, khi FF không cập nhật giá trị mới, clock trên FF có thể được tắt. Lúc này, FF vẫn được cấp nguồn và giữ nguyên giá trị hiện tại. Kỹ thuật này thường được mô tả bằng mô hình thay thế đơn giản như hình minh họa sau đây.
Hình 22: Phương pháp clock gating
Tuy nhiên, hình trên chỉ mang ý nghĩa minh họa chứ không ứng dụng trong thực tế. Giả sử, en là tín hiệu đồng bộ theo cạnh lên clock clk và chỉ tích cực một chu kỳ, waveform của tín hiệu gated_clk có thể như sau.
Hình 23: Glitch có thể sinh ra trên ngõ ra của clock gating cell khi chỉ dùng một cổng AND đơn thuần
Trong waveform trên, khi enclk được AND với nhau đơn thuần, ngõ ra cổng AND là gated_clk có thể xuất hiện cạnh lên không mong muốn làm ngõ ra Q cập nhật một giá trị không mong muốn. Bên cạnh đó, cạnh lên mong muốn chỉ là một glitch. Trên thực tế, cấu trúc của mạch logic tắt clock dùng thêm một Latch tích cực theo mức logic thấp của clock. Mạch nguyên lý này sẽ được đóng gói thành một cell chuẩn trong thư viện công nghệ gọi là ICGC (Integrated Clock Gating Cell). Cell này sẽ được chèn vào netlist trong quá trình tổng hợp.
Hình 24: Mô hình một ICGC dùng Latch và AND
Theo hình minh họa trên đây, Latch nhạy theo mức, tích cực theo mức thấp clk. Khi clk mức thấp, Latch sẽ bắt giá trị của tín hiệu en và tạo ra tín hiệu latched_en tích cực theo cạnh xuống clk. Tín hiệu này khi AND với clock sẽ tạo ra được gated_clk có cạnh lên và độ rộng xung như mong muốn. 
5.4.2) Khả năng giảm công suất 
Clock gating giúp giảm công suất động vì nó ngăn việc chuyển mức logic của clock tác động đến FF. 
5.4.3) Mức thiết kế 
Thiết kế cấu trúc: Quyết định cơ chế và phương pháp áp dụng clock gating mức khối. Một cách tổng quan, mức thiết kế này quyết định khi nào một khối được cấp clock. Điều này có thể được thực hiện bằng nhiều cách: 
  • Dùng một khối độc lập để quản lý các nguồn clock 
  • Tích hợp phần logic quản lý nguồn clock vào chung với khối tạo clock của chip 
Mỗi khối chức năng có chứa phần logic quản lý nguồn clock riêng Chức năng chung của phần logic quản lý nguồn clock là tạo ra tín hiệu cho phép (enable). Tín hiệu này chỉ tích cực để cho phép cấp clock đến một khối trong những điều kiện hoạt động nhất định.
Hình 25: Quản lý tắt/mở clock cho từng khối chức năng
Trong hình minh họa trên đây, khối clock management tạo ra các tín hiệu cho phép clk_enA/B/C để quyết định khi nào cho phép clock clk được cấp cho khối A/B/C
Thiết kế RTL: Thiết các phần logic quản lý nguồn clock và thực hiện việc chèn các clock gating cell (ICGC) ở những vị trí đã được chỉ định từ mức thiết kế kiến trúc. Việc chèn ICGC chỉ đơn giản là chọn ICGC phù hợp từ thư viện công nghệ và kết nối chúng trong RTL code. Ví dụ, ICGC sau đây được chọn để sử dụng.
Hình 26: Một ICGC cell từ thư viện công nghệ
ICGC này có hai tín hiệu cho phép là TE và E. TE là Test Enable, đây là chân cho phép clock dùng trong chế độ test (chế độ DFT). E là Enable, đây là chân cho phép clock trong chế độ hoạt động thông thường. Một trong hai tín hiệu này bằng 1 thì Q sẽ được nối đến CK. Giả sử, thiết kế không dùng chế độ test. Các ICGC trong hình 25 được thực hiện trong RTL code như sau: 
GCKES ICGCA (.TE(1’b1), .E(clk_enA), .CK(clk), .Q(gated_clkA));
GCKES ICGCB (.TE(1’b1), .E(clk_enB), .CK(clk), .Q(gated_clkB));
GCKES ICGCC (.TE(1’b1), .E(clk_enC), .CK(clk), .Q(gated_clkC));
GCKES ICGCD (.TE(1’b1), .E(clk_enD), .CK(clk), .Q(gated_clkD)); 
Nó đơn giản chỉ là cách instance một module. 
Vấn đề của cách làm này là khi mô phỏng mức RTL code, trình mô phỏng không hiểu các thành phần của thư viện tổng hợp nên các cell này sẽ dùng một mô hình tương đương mức RTL như sau: 
module GCKES (
  input logic TE,
  input logic E,
  input logic CK,
  output logic Q
  );
logic qLatch;
always_latch begin
  if (~CK)
    qLatch <= TE | E;
end
assign Q = qLatch & CK;
endmodule
Đối với từng mạch tuần tự dùng FF bên trong các khối, chúng cần được thiết kế và viết RTL code theo mô hình “có thể chèn clock gating cell” chứ không trực tiếp chèn các clock gating cell.
Hình 27: Mô tả RTL code theo dạng có thể chèn được clock gating cell
Thiết kế vật lý: Thực hiện chèn clock gating cell tại những mạch tuần tự “có thể chèn clock gating cell” đã mô tả trong RTL code.
5.5) Power gating
5.5.1) Mô tả kỹ thuật

Power gating là kỹ thuật tắt nguồn các phần tử logic không sử dụng trong một vi mạch. Kỹ thuật này giúp giảm công suất tiêu thụ trên các mạch logic một cách triệt để nhất nhưng việc thực hiện nhiều phức tạp hơn các kỹ thuật khác.
Để ngắt nguồn một thành phần logic, các PMOS có điện áp ngưỡng cao được mắc giữa nguồn Vdd và thành phần logic, NMOS có điện áp ngưỡng cao được mắc giữa đất Vss và thành phần logic. Điều khiển tắt/mở các CMOS này sẽ giúp tắt/mở nguồn thành phần logic. Trong thực tế, việc ngắt nguồn có thể chỉ cần dùng PMOS mắc giữa nguồn Vdd và thành phần logic hoặc chỉ dùng NMOS hoặc dùng cả hai.
Hình 28: Kỹ thuật power gating
Hai vấn đề quan trọng cần phải giải quyết khi áp dụng kỹ thuật này là: 
  • Phần được ngắt nguồn không ảnh hưởng đến hoạt động của các khối khác 
  • Trong một số trường hợp, hệ thống phải hoạt động trở lại ở trạng thái mong muốn sau khi cấp nguồn lại cho các phần tử bị ngắt mà không phải khởi tạo lại toàn bộ hệ thống. 
Trong một chip, các thành phần logic có kết nối với nhau qua các input và output. Việc ngắt nguồn một thành phần nào đó làm cho các tín hiệu output của nó không được lái một mức logic xác định. Điều này làm hoạt động của các khối khác bị sai hoặc không thể hoạt động. Vì vậy, cần phải có một thành phần duy trì mức logic xác định, 0 hoặc 1, trên ngõ ra của các phần tử bị ngắt nguồn. Thành phần này gọi là các khối cách ly (isolation block, isolation cell). Isolation cell có thể là một trong các loại sau: 
  • Loại clamp 1: giữ ngõ ra của cell mức 1 
  • Loại clamp 0: giữ ngõ ra của cell mức 0
  • Loại Latch: giữ lại mức logic trước khi ngắt nguồn để lái đến ngõ ra của cell
Hình 29: Chèn isolation cell trên các tín hiệu ngõ ra của khối được ngắt nguồn
Một cấu trúc loại Latch của isolation cell của AMCC được thể hiện dưới đây.
HÌnh 30: Một cấu trúc isolation cell loại Latch (đây là đăng ký sáng chế của AMCC, xem thêm ở phần tài liệu tham khảo)
Trong một số chế độ tiết kiệm năng lượng, thành phần được ngắt nguồn phải khôi phục lại trạng thái hoạt động tối thiểu sau khi được cấp nguồn trở lại mà không phải khởi tạo lại toàn bộ hệ thống. Muốn thực hiện được điều này, trước khi ngắt nguồn, các trạng thái hoạt động tối thiểu phải được lưu lại trong một thành phần nào đó. Tất nhiên, thành phần này luôn được cấp nguồn.
Hình 31: Trình tự hoạt động của quá trình ngắt và cấp nguồn lại một khối chức năng khi cần khôi phục lại trạng thái ban đầu
5.5.2) Khả năng giảm công suất 
Power gating là kỹ thuật không chỉ giúp loại bỏ công suất động mà còn giảm công suất dòng rò hiệu quả vì các phần tử tiêu thụ điện không được cấp nguồn. 
5.5.3) Mức thiết kế 
Mức thiết kế kiến trúc: 
  • Xây dựng các chế độ tiết kiệm năng lượng tiêu thụ, ví dụ như chế độ standby, chế độ sleep, chế độ deep sleep, … 
  • Quyết định khối logic nào được ngắt nguồn trong từng chế độ tiết kiệm năng lượng 
  • Xây dựng cơ chế và trình tự ngắn nguồn các khối. 
Mức thiết kế RTL: Thiết kế mạch logic chi tiết điều khiển quá trình ngắt nguồn và cấp nguồn cho từng khối logic 
Mức thiết kế vật lý: Thực hiện chèn các isolation cell giữa miền có thể bị ngắt nguồn và các miền khác. 
5.6) Một số kỹ thuật khác 
Các kỹ thuật này được thực hiện chủ yếu ở mức thiết kế vật lý và mức công nghệ chế tạo nên chỉ được nêu ngắn gọn với mục đích tham khảo 
5.6.1) Phân chia miền điện áp (multi voltage hoặc multi power domain) 
Kỹ thuật này thực hiện cung cấp điện áp khác nhau cho các thành phần logic. Điện áp cao chỉ cấp cho các miền cần tấn số xử lý cao. Các miền sử dụng tần số thấp hơn có thể được cấp điện áp thấp hơn sẽ giúp giảm đáng kể công tích cực. Lưu ý, việc giảm điện áp sẽ làm tăng độ trễ lan truyền (propagation delay) trên các cell. Nghĩa là tần số xử lý sẽ bị giảm. Điều này thể hiện qua công thức tính độ trễ làn truyền trên một cell như sau:
Trong đó:
  • Vdd là điện áp nguồn
  • Vt là điện áp ngưỡng
Bên cạnh đó, khi một chip có nhiều miền điện áp khác nhau, các tín hiệu kết nối giữa các miền cần phải chèn thêm một thành phần giúp chúng hiểu đúng mức logic của nhau. Thành phần này gọi là bộ dịch mức (level shifter, logic-level shifter hoặc voltage level translations).
Hình 32: Kỹ thuật phân chia đa miền điện áp
5.6.2) Sử dụng nhiều mức điện áp ngưỡng (Multi threshold)
Kỹ thuật sử dụng các cell có mức điện áp ngưỡng khác nhau để giảm công suất dòng rò sub-threshold. Có hai cách thực hiện: 
  • Sử dụng các cell có mức điện áp ngưỡng khác nhau nhưng điện áp ngưỡng cấp cho các cell là cố định. 
  • Sử dụng các cell điều chỉnh được mức điện áp ngưỡng.
Tùy vào chế độ hoạt động, điện áp ngưỡng trên các cell này sẽ được điều chỉnh phù hợp. Cell có điện áp ngưỡng thấp sẽ có độ trễ thấp nhưng dòng rò lớn. Cell có điện áp ngưỡng cao sẽ có độ trễ cao nhưng dòng rò thấp. Việc kết hợp các loại cell có mức điện áp ngưỡng khác nhau (có thể lựa chọn khi tổng hợp, sẽ giúp cân bằng giữa công suất tiêu tiêu thụ và tốc độ xử lý của mạch logic. Ví dụ, các LVT cell (Low Vt) sẽ được dùng trên các đường yêu cầu nghiêm ngặt về timing (timing critical path), đòi hỏi độ trễ thấp.
Hình 33: Sử dụng các cell có điện áp ngưỡng khác nhau (từ tài liệu tham khảo)
Để thực hiện được kỹ thuật điều chỉnh điện áp ngưỡng, thư viện công nghệ phải hỗ trợ các cell cho phép điều khiển điện áp phân cực trên cực nền (substrate). Các cell này được cấu tạo từ các CMOS có điện áp ngưỡng biến thiên (VTCMOS – Variable Threshold CMOS).
Hình 34: (a) CMOS thông thường (b) VTCMOS (c) Sử dụng VTCMOS
Trên đây là một số kỹ thuật giúp giảm công suất tiêu thụ trong một vi mạch. Nội dung trình bày hướng đến việc giải thích các khái niệm cơ bản giúp bạn đọc hiểu kỹ thuật đó là gì? thực hiện như thế nào? và vì sao nó có thể giúp giảm công suất tiêu thụ? Nếu có nội dung chưa rõ hoặc chưa chính xác, mong bạn đọc góp ý dưới bài viết để tác giả chỉnh sửa.

Tài liệu tham khảo:
1) Texas Instruments; CMOS Power Consumption and Cpd Calculation; June 1997;
2) R. Saleh ; Leakage and Low-Power Design; Dept. of ECE, University of British Columbia
3) Mahdi Shabany; ASIC/FPGA Chip Design, Verilog for Synthesis; Department of Electrical Engineering, Sharif University of technology
4) EDN; Low power design techniques; July 24 2012
5) TrueChip; Low Power Design Techniques - Basics Concepts In Chip Design
6) EDN; Reducing IC power consumption: Low-power design techniques; September 24 2015
7) Anjan Rudra; MULTISTAGE LATCH-BASED ISOLATION CELL; US 8,575,984 B1, United States Patent; Nov. 5, 2013
8) Intel; Enhanced Intel® SpeedStep® Technology for the Intel® Pentium® M Processor; March 2004
9) Semiconductor Engineering; Multi-Vt

Lịch sử cập nhật:
1) 2020.03.01 - Tạo lần đầu

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