Thiết kế số có hai loại mạch là mạch tổ hợp (combinational circuit) và mạch tuần tự (sequential circuit). Trong đó, mạch tuần tự sử dụng các phần tử có khả năng "lưu trữ" giá trị trước đó gọi là các phần tử tuần tự (sequential element). Flip-Flop và Latch là hai phần tử tuần tự phổ biến sử dụng trong thiết kế mạch số. Bài viết này trình bày về ưu và nhược điểm của việc sử dụng Latch trong thiết kế mạch tuần tự. Loại Latch được đề cập trong bài là D Latch.
1) Vai trò của Latch trong thiết kế vi mạch số
Trong khi FF hoạt động theo cạnh tích cực của xung clock thì Latch là phần tử tuần tự hoạt động theo mức logic của chân điều khiển G, gọi là chân enable hoặc chân clock của Latch. Chi tiết về cấu tạo và hoạt động của Latch các bạn có thể tham khảo bài "sự khác nhau trong kiểm tra timing cho FF và Latch".
Hình 1: Ký hiệu, bảng sự thật và sơ đồ mạch nguyên lý của Latch |
Trong thiết kế sử dụng FF, tần số hoạt động bị giới hạn bởi đường timing dài nhất (critical path) vì đường này có tốc độ đáp ứng chậm nhất và có độ trễ lớn nhất. Độ trễ trên đường timing chủ yếu sinh ra do mạch tổ hợp giữ hai FF, độ trễ này về cơ bản không được vượt quá một chu kỳ xung clock (tham khảo chi tiết). Vì vậy, để một thiết kế đáp ứng được tần số hoạt động tối đa mong muốn, các mạch tổ hợp giữa hai FF phải được thiết kế và ràng buộc timing chặt chẽ để không vượt quá giới hạn một chu kỳ xung clock trừ khi đường này được xem là đường timing ngoại lệ như false path hoặc multicycle path.
Thiết kế sử dụng Latch sẽ linh động hơn trong việc phân bố độ trễ của mạch tổ hợp giữa các đường timing liền kề nhau để đáp ứng tần số hoạt động cao. Latch sử dụng hiệu quả cho các thiết kế tốc độ cao có tần số hoạt động hàng Ghz. Khả năng này của Latch được gọi là "time borrowing".
2) Time borrowing
"Time borrowing" (mượn thời gian) là thuật ngữ chỉ một đặc tính đặc biệt của Latch. Thuộc tính này cho phép một đường timing có độ trễ lớn có thể sử dụng khoảng thời gian dư của đường timing có độ trễ nhỏ mà không cần phải thay đổi thiết kế của mạch tổ hợp trên các đường timing.
Các đường timing giữa hai FF sẽ không có hiện tượng "time borrowing" là do cấu tạo hoạt động theo cạnh clock của FF. Việc lấy mẫu giá trị ngõ vào trên chân dữ liệu D dựa trên cạnh tích cực của clock. Giá trị tại chân dữ liệu D của FF phải ổn định trước khi cạnh clock xuất hiện để FF có thể bắt được dữ liệu này và truyền đến ngõ ra Q. Xét ví dụ hình 2, độ trễ mạch tổ hợp giữa FF0 và FF1 là 10ns. Độ trễ mạch tổ hợp giữa FF1 và FF2 là 3ns. Giả sử độ trễ clock-to-Q, độ trễ đường dây và setup time bằng 0 thì tần số clk0 tối đa là:
Vấn đề vi phạm timing hình 2 có thể được giải quyết bằng cách thay FF1 bằng một FF1 khác hoạt động theo cạnh xuống xung clock như hình 3.
Việc sử dụng FF hoạt động cạnh xuống giúp kéo dài giới hạn timing của chu kỳ T0-T1 thêm một nửa chu kỳ xung clock, tức là 4ns. Tương ứng, chu kỳ T1-T2 bị rút ngắn giới hạn timing xuống còn 4ns. Ta nói, chu kỳ T0-T1 mượn 4ns của chu kỳ T1-T2. Nhờ điều này, FF2 có thể bắt được giá trị mới của FF1 tại T2. Nhược điểm của phương pháp này là kém linh động, chu kỳ T0-T1 chỉ thiếu 2ns nhưng lại lấy 4ns của chu kỳ T1-T2. Nếu độ trễ của chu kỳ T1-T2 tăng lên 5ns thì phương pháp này không thể áp dụng vì vi phạm timing tại FF2.
Hình 4 trình bày một ví dụ cho thấy nhược điểm của phương pháp sử dụng FF cạnh xuống tại FF1. Trong ví dụ này, độ trễ của đường dữ liệu từ FF1 đến FF2 là 5ns nhưng chu kỳ T0-T1 lấy mất 4ns nên FF2 không thể bắt được dữ liệu mới của FF1 tại T2. Vấn đề này có thể được giải quyết bằng cách sử dụng Latch hoạt động mức cao như hình 5.
Đối với Latch, do cấu tạo hoạt động theo mức của tín hiệu clock nên trong suốt thời gian mức tích cực của clock tồn tại, giá trị tại chân D có thể thay đổi và thay đổi này được truyền đến chân Q của Latch. Vì vậy, giá trị mới chỉ cần đến chân D của Latch trước cạnh close thì Latch sẽ cập nhật giá trị này đến chân Q. Trong ví dụ hình 3, Latch mở trong nửa chu kỳ, ứng với thời gian 4ns nhưng chu kỳ T0-T1 chỉ mượn 2ns của chu kỳ T1-T2. 2ns còn lại vẫn dành cho chu kỳ T1-T2 nên timing từ FF0 đến FF1 và từ FF1 đến FF2 được đảm bảo.
2) Time borrowing
"Time borrowing" (mượn thời gian) là thuật ngữ chỉ một đặc tính đặc biệt của Latch. Thuộc tính này cho phép một đường timing có độ trễ lớn có thể sử dụng khoảng thời gian dư của đường timing có độ trễ nhỏ mà không cần phải thay đổi thiết kế của mạch tổ hợp trên các đường timing.
Các đường timing giữa hai FF sẽ không có hiện tượng "time borrowing" là do cấu tạo hoạt động theo cạnh clock của FF. Việc lấy mẫu giá trị ngõ vào trên chân dữ liệu D dựa trên cạnh tích cực của clock. Giá trị tại chân dữ liệu D của FF phải ổn định trước khi cạnh clock xuất hiện để FF có thể bắt được dữ liệu này và truyền đến ngõ ra Q. Xét ví dụ hình 2, độ trễ mạch tổ hợp giữa FF0 và FF1 là 10ns. Độ trễ mạch tổ hợp giữa FF1 và FF2 là 3ns. Giả sử độ trễ clock-to-Q, độ trễ đường dây và setup time bằng 0 thì tần số clk0 tối đa là:
1/10 = 100 Mhz
Nếu mạch hoạt động với tần số 125Mhz, ứng với chu kỳ 8ns, thì đường timing từ FF0 đến FF1 sẽ bị vi phạm timing và FF1 không thể bắt được dữ liệu truyền từ FF0 trong một chu kỳ xung clock.Hình 2: Vi phạm timing xảy ra tại FF1 vì độ trễ của mạch tổ hợp lớn hơn chu kỳ xung clock |
Hình 3: Sử dụng FF hoạt động theo cạnh xuống để giải quyết vấn đề vi phạm timing |
Hình 4: Vi phạm timing xảy ra nếu độ trễ mạch tổ hợp giữa FF1 và FF2 tăng lên 5ns |
Hình 5: Time borrowing của Latch |
Tham khảo:
1) Ashish Goel & Ateet Mishra, Freescale Semiconductor; Latches & Timing; Aug.02.2011; www.eetimes.com2) Time Borrowing and Time Stealing; http://ohotspot.blogspot.com
Chào anh, anh cho em hỏi việc tạo latch là viết rtl để tạo hay sao ạ? Vì khi em viết rtl tạo latch thì em không thể control được những path nào cần dùng latch, những path nào không như ví dụ ở trên
Trả lờiXóaEm có thể viết RTL để tạo Latch trên bất cứ tín hiệu nào mà em muốn. Như vậy việc em cần tạo bao nhiêu Latch và trên tín hiệu nào, em có thể mô tả RTL. Ví dụ:
Xóaalways @ (*) begin
if (En)
out = in;
end
Dạ em cám ơn anh!
Trả lờiXóa