Thứ Bảy, 29 tháng 7, 2017

[Basic Knowledge] Phân loại thiết kế trong thiết kế vi mạch số

Bài này trình bày về sự khác nhau và cách hiểu giữa các cách (loại) thiết kế trong thiết kế vi mạch số như thiết kế đồng bộ, thiết kế nhiều miền xung clock bất đồng bộ, thiết kế bất đồng bộ.

1. Các dạng thiết kế

Thiết kế vi mạch số có nhiều cách thực hiện khác nhau. Nếu dựa trên cấu trúc cơ bản và hoạt động thực tế của một mạch số, một thiết kế có thể thuộc các nhóm sau đây:
  1. Thiết kế đồng bộ (synchronous design) là thiết kế sử dụng chỉ một nguồn xung clock hoặc nhiều xung clock đồng bộ.
  2. Thiết kế nhiều xung clock bất đồng bộ (multi-asynchronous clock design) là thiết kế sử dụng nhiều nguồn xung bất đồng bộ với nhau
  3. Thiết kế mạch bất đồng bộ (asynchronous circuit design) là thiết kế không sử dụng nguồn xung clock chung phân bố đến các thành phần trong thiết kế.
Thuật ngữ "thiết kế bất đồng bộ" trong cách nói thông thường sẽ tùy vào ngữ cảnh để hiểu là (2) hoặc (3). Ở đây, tôi xin chia rõ ràng thành các tên gọi như trên để tránh nhầm lẫn và giúp các bạn có thể phân biệt khi đọc các tài liệu khác.

2. Thiết kế đồng bộ

Khi được gọi là đồng bộ (synchronous) thì mọi hoạt động đều phải tuân theo 1 quy luật chung mà quy luật đó ở đây là chu kỳ xung clock. Trong thiết kế đồng bộ, tại mỗi chu kỳ xung clock, trạng thái của các thành phần trong thiết kế sẽ được cập nhật giá trị một lần tại điểm lấy mẫu. Sau điểm lấy mẫu, trạng thái sẽ nhanh chóng được xác lập đến giá trị ổn định và giữ ở trạng thái này cho đến điểm lấy mẫu tiếp theo. Mô hình thường dùng để minh họa cho cấu trúc cơ bản của một thiết kế đồng bộ là như hình 1 với thành phần gồm mạch tổ hợp (combinational logic), phần tử lưu trữ (digital storage) và nguồn clock (Clock).
Hình 1. Mô hình mạch số được đồng bộ bởi xung clock
Trong mô hình cơ bản trên ta thấy được xung clock là thành phần không thể thiếu trong loại thiết kế này.

Thiết kế đồng bộ đơn giản nhất là thiết kế có một xung clock và hoạt động theo một cạnh, cạnh lên hoặc cạnh xuống xung clock. Vị trí cạch clock được sử dụng để xác định điểm lấy mẫu gọi là cạch tích cực. Phần tử lưu trữ được sử dụng là Flip-Flop (FF).
Hình 2. Minh họa thiết kế đồng bộ một xung clock, một cạnh tích cực
Thiết kế đồng bộ phức tạp hơn là thiết kế sử dụng một xung clock và hoạt động theo cả 2 cạnh xung clock. Thiết kế kiểu này gây ra nhiều khó khăn như chèn các đường scan (scan-path) phục vụ việc kiểm tra các FF trong thiết kế hoặc xác định đường có độ trễ lớn nhất (critical path),...
Hình 3. Minh họa thiết kế đồng bộ một xung clock, 2 cạnh tích cực
Phức tạp hơn nữa, thiết kế đồng bộ sử dụng nhiều xung clock. Trường hợp này là khi thiết kế sử dụng các bộ chia đồng bộ, ví dụ như bộ đếm đồng bộ, để tạo ra các xung clock khác nhau sử dụng trong thiết kế. Tuy thiết kế dạng này sử dụng nhiều xung clock khác nhau những các clock được tạo ra có mối liên quan xác định được so với clock nguồn. ví dụ như bộ chia đôi clock sau đây.
Hình 4. Bộ chia đôi clock
Xem xét bộ chia 2 clock, xung clock q1 được tạo ra có sự lệch pha so với xung clock clock1. Sự lệch pha này là do độ trễ clock-to-q của FF. Đây là một thông số xác định được. Tuy vậy, nếu q1 tiếp tục được sử dụng để tạo ra tín hiệu clock khác, tín hiệu clock này lại tiếp tục được dùng để tạo clock tiếp theo và có thể nhiều hơn nữa thì độ trễ giữa tín hiệu clock được tạo ra trước sẽ được cộng dồn cho tín hiệu clock tiếp theo làm độ lệch pha giữa clock nguồn và các clock tầng sau càng lớn. Điều này không chỉ làm cho việc tổng hợp, phân tích và layout các đường clock khó khăn mà người thiết kế mức cao cũng phải quan tâm đến sự lệch pha này để thiết kế các mạch hoạt động đúng. Ví dụ như bộ Ripple counter sau đây.
Hình 5. Bộ Ripple counter
Người thiết kế mức cao (phân tích cấu trúc, viết RTL code) có thể cảm thấy dễ dàng khi mô tả một thiết kế đồng bộ sử dụng nhiều xung clock, sử dụng cả cạnh lên hoặc cạch xuống. Bằng chứng là bạn có thể mô tả tất cả các mạch trên đây bằng vài dòng code đơn giản. Tuy nhiên, điều này ảnh hưởng lớn đến mức độ phức tạp cho công việc thiết kế mức thấp (tổng hợp, phân tích timing, layout) và có thể gây ra những sai sót không mong muốn nên hãy cân nhắc khi lựa chọn giải pháp thiết kế.

3. Thiết kế nhiều xung clock bất đồng bộ

Thiết kế nhiều miền xung clock bất đồng bộ khác với thiết kế đồng bộ là trong thiết kế có thể sử dụng nhiều nguồn xung clock khác nhau mà không có mối quan hệ cố định nào hoặc không có mối liên hệ nào. Thiết kế cũng có thể chỉ sử dụng một nguồn xung clock nhưng lại có những giao tiếp bất đồng bộ. Một số trường hợp điển hình của thiết kế loại này như sau:
  1. Thiết kế giao tiếp lấy ngõ vào từ một miền bên ngoài không biết trước, ví dụ như như giao tiếp port trên chân chip. Rõ ràng, tín hiệu ngõ vào kiểu này có thể thay đổi bất cứ lúc nào mà không có mối quan hệ ràng buộc nào với xung clock bên trogn thiết kế.
  2. Thiết kế lấy ngõ vào từ một miền clock khác mà nguồn clock này độc lập với nguồn clock của thiết kế. 
  3. Clock ngõ vào và clock ngõ ra của PLL
Hình 6. Một số trường hợp của thiết kế nhiều xung clock bất đồng bộ
Do một tín hiệu thay đổi ngẫu nhiên nên vấn đề chính của thiết kế bất đồng bộ là làm thế nào để lấy đúng được dữ liệu mong muốn.

4. Thiết kế mạch bất đồng bộ

Trong hai kiểu thiết kế đã đề cập phía trên, vấn đề định thời của xung clock cực kỳ quan trọng nếu muốn mạch hoạt động chính xác. Cụ thể, cạch tích cực của xung clock đến các FF phải cùng lúc nhưng đó chỉ là lý tưởng vì đỗ trễ đường dây làm cho các cạch clock đến từng FF không thể đồng thời mà có độ sai lệch nhất định. Hiện tượng này gọi là "clock skew".
Hình 7. Hiện tượng clock skew
Mạch bất đồng bộ có thể loại bỏ vấn đề này bằng cách thay thế các nguồn clock dùng chung bằng các giao thức bắt tay. Xem bài "[Asynchronous Design][Thiết kế bất đồng bộ][Bài 1] Đồng bộ clock và giao thức bắt tay" để hiểu rõ hơn về điều này.

Có thể hình dung đơn giản như sau, thiết kế đồng bộ như một hàng dọc nhiều người trong đó người đứng đầu hàng (xung clock) là người ra hiệu lệnh điều khiển cả hàng. Mỗi lần người đầu hàng (clock) ra hiệu là cả hàng phải làm theo. Thiết kế bất đồng bộ thì khác, mỗi người trong hàng chỉ nghe lệnh từ người đứng trước rồi thực hiện và truyền lệnh đó cho người đứng sau. Như vậy, từng người trong hàng đều thực hiện mệnh lệnh của người đứng đầu nhưng không đồng thời. Đây chỉ là ví dụ để bạn đọc dễ hình dung, chi tiết hơn các bạn hãy tham khảo mục thiết kế bất đồng bộ "Async design" trong trang này.

Mong nhận được các góp ý và chia sẻ để các kiến thức ngày càng hoàn thiện hơn.

Lịch sử cập nhật:
1) 2019.11.20 - Sửa link hình vẽ

3 bình luận:

  1. Ảnh die hết rồi Admin ơi.

    Trả lờiXóa
  2. Admin có thể giải thích thêm về độ phức tạp của trường hợp sử dụng cùng 1 xung clock nhưng hoạt động theo cả 2 sườn của xung Clock được không ạ

    Trả lờiXóa