Để tối ưu hóa, trước hết chúng ta cần biết mình đang tối ưu hóa cái gì. Một FPGA hiện đại được cấu thành từ nhiều loại tài nguyên chuyên dụng:
a. Tài nguyên Logic Cấu hình được (Configurable Logic Blocks – CLBs)
Đây là thành phần cơ bản và chiếm số lượng nhiều nhất, dùng để triển khai các logic tổ hợp và tuần tự. Mỗi CLB chứa:
- Bảng tra cứu (Look-Up Tables – LUTs): Là các khối nhớ nhỏ có thể được lập trình để thực hiện bất kỳ hàm logic nào (ví dụ: AND, OR, XOR, MUX). Đây là “viên gạch” cơ bản nhất để xây dựng logic.
- Flip-Flops (FFs) / Thanh ghi (Registers): Là các phần tử nhớ 1-bit, dùng để lưu trữ trạng thái. Chúng chính là thứ tạo ra các Feedback Node, thanh ghi dịch, và các bộ đếm trong thiết kế của bạn.
b. Khối Nhớ (Block RAMs – BRAMs)
Đây là các khối bộ nhớ RAM chuyên dụng, được phân bố rải rác trên chip. Chúng cung cấp một lượng lớn bộ nhớ (vài kilobits mỗi khối) với tốc độ truy cập cao. BRAMs rất hiệu quả để triển khai:
- Bộ đệm FIFO lớn.
- Bảng tra cứu lớn (ví dụ: waveform lookup tables).
- Bộ nhớ truy cập ngẫu nhiên (RAM) cho các thuật toán.
c. Lát cắt DSP (DSP Slices)
Đây là các khối xử lý tín hiệu số phần cứng chuyên dụng. Mỗi lát cắt DSP được tối ưu hóa để thực hiện các phép toán học hiệu suất cao, phổ biến nhất là phép nhân và cộng dồn (Multiply-Accumulate – MAC). Sử dụng DSP slice cho phép nhân sẽ nhanh và hiệu quả hơn nhiều so với việc xây dựng một bộ nhân từ các LUTs thông thường.