Multiplexing (hay còn gọi là time-division multiplexing) là một kỹ thuật mạnh mẽ để tiết kiệm tài nguyên bằng cách tái sử dụng một khối logic phần cứng cho nhiều tác vụ khác nhau theo thời gian. Đây là sự đánh đổi kinh điển giữa **tài nguyên (area)** và **tốc độ (speed)**.
Nguyên tắc:
Thay vì xây dựng N khối xử lý song song cho N kênh dữ liệu (tốn N lần tài nguyên), chúng ta chỉ xây dựng một khối xử lý duy nhất, cho nó chạy ở tần số cao hơn, và lần lượt xử lý dữ liệu cho từng kênh một.
Khi nào nên sử dụng Multiplexing?
- Khi **tài nguyên là yếu tố hạn chế hàng đầu**, và bạn không thể nhân bản logic thêm được nữa.
- Khi các khối logic cần tái sử dụng rất **lớn và đắt đỏ**, ví dụ như các thuật toán DSP phức tạp, các phép toán floating-point, các hàm chia hoặc căn bậc hai.
- Khi ứng dụng **không yêu cầu độ trễ thấp nhất có thể**. Multiplexing sẽ làm tăng độ trễ vì các kênh phải “xếp hàng” chờ đến lượt xử lý.
Cách triển khai Multiplexing trong LabVIEW FPGA
Một mẫu thiết kế phổ biến bao gồm:
- Tách luồng xử lý: Đặt khối logic cần tái sử dụng vào một SCTL riêng, chạy ở tần số cao (ví dụ, nhanh gấp N lần so với luồng dữ liệu đầu vào, với N là số kênh).
- Sử dụng FIFOs để đệm dữ liệu: Tạo ra N FIFO đầu vào để nhận dữ liệu từ N kênh và N FIFO đầu ra để trả kết quả.
- Xây dựng một State Machine: Bên trong SCTL tốc độ cao, sử dụng một state machine hoặc một bộ đếm để điều khiển việc đọc dữ liệu từ các FIFO đầu vào theo kiểu “round-robin” (vòng tròn). Ví dụ: chu kỳ 1 đọc từ FIFO_1, chu kỳ 2 đọc từ FIFO_2, …, chu kỳ N đọc từ FIFO_N, sau đó lặp lại.
- Xử lý và Gửi kết quả: Sau khi đọc dữ liệu từ một FIFO, đưa nó qua khối logic chung và ghi kết quả vào FIFO đầu ra tương ứng.
Mặc dù cần thêm logic cho state machine và FIFO, chi phí này thường nhỏ hơn rất nhiều so với việc nhân bản toàn bộ khối xử lý chính.