1. Lý thuyết chỉ thị
Trong mạch đồng bộ, vai trò của xung clock là xác định các điểm trong từng khoảng thời gian mà tại đó các tín hiệu ổn định và hợp lệ để có thể lấy giá trị và sử dụng. Điểm này là tại cạnh tích cực của xung clock (cạnh lên hoặc cạnh xuống. Trước và sau cạnh tích cực này các tín hiệu buộc phải ổn định. Thời gian ổn định trước cạnh tích cực là setup time. Thời gian sau cạnh tích cực là hold time. Hai khoảng thời gian này tạo nên một cửa sổ định thời (timing window). Ngoài cửa sổ định thời tín hiệu có thể thay đổi giá trị nhiều lần hoặc không ổn định.
Hình 1. Timing trong mạch đồng bộ |
Trong mạch bất đồng bộ, việc không sử dụng xung clock làm cho các tín hiệu có thể phải giữ ổn định (stable) trong toàn bộ thời gian. Mỗi lần tín hiệu thay đổi đều phải có ý nghĩa. Tức là giá trị tín hiệu trước và sau khi thay đổi đều là những giá trị hợp lệ. Vì vậy, các nguy hiểm (hazard) và chạy đua (race) cần phải tránh. Nguy hiểm ở đây có thể là xung nháy (glitch). Glitch là trạng thái tín hiệu không mong muốn và thường thể hiện dưới dạng 1 xung có độ rộng rất nhỏ trên tín hiệu. Chạy đua có thể sinh ra các trạng thái không mong muốn của tín hiệu khi độ trễ trên các tín hiệu không giống nhau.
Các mạch bất đồng bộ là tổ hợp của các cổng logic thường có một hoặc nhiều đường hồi tiếp (feedback loop). Khi ngõ ra một cổng thay đổi nó có thể làm ngõ ra các cổng khác thay đổi theo đến một giá tị phù hợp. Hình 2 là một ví dụ về mạch nguyên lý cho khối CTL trong mô hình mạch bất đồng bộ từng trình bày ở bài 1 - đồng bộ theo xung clock và giao thức bắt tay. Hoạt động của mạch hình 2 như sau:
- Khởi động các tín hiệu đều bằng 0 và ck = 0
- Khi req_i = 1, ngõ ra cổng AND 1 bằng 1:
- req_o = 1 để yêu cầu tầng tiếp theo
- ack_o = 1 để xác nhận với tầng đã phát req_i
- ck = 1 để yêu cầu thanh ghi chốt dữ liệu từ tầng trước
- Khi ack_i = 1, ngõ ra cổng AND 1 bằng 0, ngõ ra ck = req_o = ack_o chỉ bằng 0 khi req_i đã kéo xuống 1.
Nhưng ở đây, việc giải thích chức năng của mạch (b) không phải là mục đích chính mà chỉ nhằm minh họa một cách trực quan về những nguy hiểm có thể xảy ra trên các ngõ ra req_o, ack_o và ck khi áp dụng vào mô hình pipeline (a).
Hình 2. Một sơ độ nguyên lý (b) của mạch điều khiển bất đồng bộ CTL cho mô hình pipeline (a) |
Xem xét một cổng OR đơn thuần sử dụng trong mạch hình 2, nếu ngõ ra y chuyển trạng thái từ 1 sang 0 thì chắc chắn cả 2 ngõ vào đều bằng 0, nếu ngõ ra y chuyển trạng thái từ 0 sang 1 thì không thể kết luận giá trị của 2 ngõ vào là bao nhiêu. Chúng ta nói rằng cổng OR chỉ thị (indicate) hoặc xác nhận (acknowledge) khi cả hai ngõ vào bằng 0. Tương tự, cổng AND chỉ thị khi cả hai ngõ vào bằng 1.
Hình 3. Cổng OR chỉ thị hoặc xác nhận khi 2 ngõ vào bằng 0 |
Khi các tín hiệu ngõ vào thay đổi trạng thái mà không được chỉ thị hoặc xác nhận bởi sự chuyển đổi ở ngõ ra thì đó là nguồn hazard cần phải tránh. Mạch càng phức tạp thì việc kiểm soát các nguy hiểm và chạy đua càng khó. Vì vậy, cần có những lý thuyết và phương pháp để kiểm soát các thiết kế như trên một cách hiệu quả.
Khái niệm chỉ thị (indication) hoặc xác nhận (acknowledgement) có vai trò quan trọng trong thiết kế các mạch bất đồng bộ.
Một mạch tốt hơn dùng cho việc chỉ thị này là phần tử C muller.
2. Phần tử C Muller
Phần tử C Muller (Muller C-element) còn được gọi bằng nhiều tên khác như cổng C (C gate), Flip-flop trễ (Hysteresis Flip-flop), hoặc Flip-flop trùng nhau (coincident Flip-flop), mạch an toàn 2 tay (two-hand safety circuit) là một phần tử số được sử dụng rộng rãi trong thiết kế mạch bất đồng bộ. Phần tử này được mô tả bởi nhà toán học và khoa học máy tính người Mỹ David E. Muller.
Hình 3. Ký hiệu, mạch mức MOS và các cách biểu diễn phần tử C |
Phần tử C là một thành phần giữ trạng thái có:
- Ngõ ra bằng 0 khi cả hai ngõ vào là 0
- Ngõ ra bằng 1 khi cả hai ngõ vào là 1
- Ngõ ra không thay đổi giá trị khi ngõ vào là 01 hoặc 10
Như vậy, phần tử C chỉ thị khi cả 2 ngõ vào bằng 1 hoặc cả 2 ngõ vào bằng 0.
3. Đường ống Muller (Muller Pipeline)
Hình 4 là một mạch được xây dựng bằng phần tử C và cổng đảo thay thế cho mạch nguyên lý hình 2.
Hình 4. Mạch CTL sử dụng phần tử C và cổng đảo |
Hình 5 là mạch pipeline của CTL sử dụng mạch hình 4. Mô hình này là Muller pipeline hoặc phân bố Muller (Muller distributor). Sự mở rộng hoặc biến đổi mạch này được sử dụng trong phần lớn các mạch đồng bộ khác. Hoạt động của pipeline này như sau:
- Sau khi tất cả các phần tử C được khởi động về 0 thì quá trình bắt tay req/ack bắt đầu từ phía ngoài cùng bên trái (Left).
- Xét phần tử C thứ i, nó chỉ lấy giá trị 1 từ Req = C[i-1] của tầng trước nó khi Ack = C[i+1] tầng sau nó là 0. Tương tự, nó chỉ lấy giá trị 0 từ Req (đồng thời là C[i-1]) của tầng trước nó khi Ack (đồng thời là C[i+1]) tầng sau nó là 1. Điều này có được là nhờ thuộc tính chỉ thị khi cả 2 ngõ vào cùng bằng 1 hoặc cùng bằng 0 của phần tử C.
Hình 4. Muller Pipeline hoặc Muller Distributor |
Xem dạng sóng bên dưới hình 4, các bắt tay trên mỗi giao tiếp Req/Ack sẽ lan truyền trong đường ống Muller từ bên trái (Left) qua bên phải (Right). Định thời tại mỗi giao tiếp bắt tay có thể khác nhau nhưng phần tử C đảm bảo việc chỉ thị khi C[i] chuyển trạng thái từ 1 qua 0 hoặc từ 0 qua 1. Điều này đảm bảo tính toàn vẹn của các hoạt động bắt tay được lan truyền. Nếu Req được phát từ bên trái đã lan truyền đến cuối pipeline, tức bên phải, mà không nhận được đáp ứng Ack từ bên phải thì pipeline lúc này sẽ bị đầy. Hành vi này giống như hoạt động của một FIFO.
Tốc độ lan truyền trong đường ống Muller phụ thuộc vào đỗ trễ thực tế của mạch.
Một số điểm đáng chú ý của mạch này như sau:
- Đơn giản và có thể ứng dụng được cho cả giao thức bắt tay 2 pha hoặc 4 pha tùy vào việc biến đổi các tín hiệu giao tiếp cho phù hợp
- Có thể đảo định nghĩa cực của các tín hiệu, thay vì sử dụng tích cực mức cao (logic 1) thì có thể sử dụng tích cực mức thấp (logic 0) như hình 5
- Mạch hoạt động chính mà không phụ thuộc vào độ trễ các cổng và dây dẫn. Đường ống Muller được được nói là "không nhạy trễ" (delay-insensitive)
Hình 5. Có thể đảo cực tín hiệu ở mạch Muller pipeline |
Note: Tôi dịch chủ yếu từ tài liệu "Asynchronous Circuit Design A Tutorial" của tác giả Jens Sparsø nhưng có thể thêm các nhận xét hoặc minh họa theo cách hiểu của riêng mình. Mong các bạn chia sẻ và góp ý và thảo luận dưới bài viết.
0 bình luận:
Đăng nhận xét