4. Truyền Dữ Liệu An Toàn: Hàng Đợi (FIFOs)
FIFO (First-In, First-Out) là một cấu trúc dữ liệu hoạt động giống như một đường ống hoặc một hàng người xếp hàng: phần tử nào vào trước sẽ ra trước. Trong FPGA, FIFO là cơ chế quan trọng nhất và an toàn nhất để truyền một luồng dữ liệu từ một tiến trình này sang một tiến trình song song khác mà không làm mất mát dữ liệu.
Tại sao FIFO là Bắt buộc cho các Tác vụ Song song?
Hãy tưởng tượng một vòng lặp “Sản xuất” (Producer) đang lấy mẫu tín hiệu từ ADC ở 80 MHz, liên tục tạo ra dữ liệu. Một vòng lặp “Tiêu thụ” (Consumer) khác thực hiện một thuật toán xử lý phức tạp, chỉ có thể chạy ở 40 MHz. Nếu bạn dùng một register hoặc biến để truyền dữ liệu, Consumer sẽ chỉ đọc được một nửa số mẫu, phần còn lại sẽ bị ghi đè và mất vĩnh viễn.
FIFO giải quyết vấn đề này bằng cách hoạt động như một bộ đệm (buffer) có cơ chế kiểm soát luồng (flow control) tích hợp. Producer có thể liên tục ghi dữ liệu vào FIFO. Consumer sẽ đọc dữ liệu ra từ FIFO với tốc độ của riêng nó. Miễn là FIFO đủ lớn, sẽ không có mẩu dữ liệu nào bị thất lạc. FIFO có các cờ báo hiệu Full
và Empty
để tự động ngăn việc ghi khi đầy và đọc khi rỗng.
Các Tình Huống Sử Dụng Điển Hình
- Vượt Miền Đồng Hồ (Clock Domain Crossing – CDC): Đây là ứng dụng quan trọng nhất của FIFO. Việc truyền dữ liệu trực tiếp giữa hai vòng lặp chạy ở hai tần số clock khác nhau bằng register hoặc dây dẫn đơn giản sẽ gây ra lỗi timing nghiêm trọng (metastability). FIFO được thiết kế với các mạch đồng bộ hóa bên trong để giải quyết triệt để vấn đề này. Luôn luôn sử dụng FIFO khi truyền dữ liệu giữa các miền clock khác nhau.
- Đồng bộ hóa dữ liệu giữa các vòng lặp song song: Ngay cả khi các vòng lặp chạy cùng một tần số clock, chúng có thể không được thực thi cùng một lúc do các logic khác nhau. FIFO đảm bảo dữ liệu được truyền đi một cách có trật tự và không bị xung đột.
- Truyền dữ liệu ra Host (DMA FIFO): Một loại FIFO đặc biệt được hỗ trợ bởi phần cứng, cho phép truyền một lượng lớn dữ liệu từ bộ nhớ BRAM của FPGA trực tiếp đến bộ nhớ RAM của máy tính mà không cần sự can thiệp của CPU, mang lại thông lượng rất cao.