CỘNG ĐỒNG VI MẠCH BÁN DẪN VIỆT NAM – CÔNG TY VSRD

DIENTU.VN & DIENTUVIETNAM.VN Tập trung nghiên cứu và phát triển Semiconductor, từ thiết kế vi mạch đến ứng dụng thực tế.

Chuyên sâu Lập trình FPGA, triển khai thuật toán phần cứng tốc độ cao cho hệ thống nhúng và AI.

Giải pháp Camera tích hợp FPGA

Giải pháp camera tích hợp FPGA cho phép xử lý hình ảnh trực tiếp ở mức phần cứng, đáp ứng yêu cầu độ trễ thấp, tốc độ cao và độ ổn định cao so với xử lý bằng CPU/GPU truyền thống.

Hệ thống phù hợp cho các ứng dụng AI Vision, giám sát thông minh, công nghiệp, giao thông, với khả năng tùy biến pipeline xử lý ảnh, nén video và tăng tốc thuật toán theo yêu cầu thực tế.

Làm sao để tối ưu h...
 
Chia sẻ:
Notifications
Clear all

Làm sao để tối ưu hóa tài nguyên khi thiết kế fpga bằng HDL

1 Bài viết
1 Thành viên
0 Reactions
84 Lượt xem
(@admin)
Bài viết: 178
Thành Viên Admin
Topic starter
 

Khi thiết kế trên FPGA (như PYNQ-Z2 / Zynq-7000), việc tối ưu LUT, Flip-Flop, BRAM và DSP là kỹ năng rất quan trọng, giúp:

  • Thiết kế fit chip

  • Tăng tốc độ (Fmax)

  • Giảm công suất

  • Dễ mở rộng về sau

Bài viết này tổng hợp nguyên tắc + mẹo thực tế đã được dùng nhiều trong dự án FPGA.


1. Hiểu rõ tài nguyên FPGA gồm những gì?

https://www.researchgate.net/publication/346766789/figure/fig1/AS%3A966673418960900%401607484311619/Resource-ratio-of-different-FPGA-devices-For-each-device-LUT-FF-and-BRAM-numbers-are.png
https://www.mouser.com/images/marketingid/2019/microsites/0/Zynq-7000%20SoCArchitectural%20Overview.png

Các tài nguyên chính

  • LUT (Look-Up Table): logic tổ hợp

  • Flip-Flop (FF): lưu trạng thái

  • BRAM: bộ nhớ trong chip

  • DSP slice: nhân, MAC tốc độ cao

  • Routing: kết nối (ảnh hưởng timing)

👉 Tối ưu FPGA = dùng đúng loại tài nguyên cho đúng việc.


2. Nguyên tắc vàng #1: Giảm LUT bằng cách dùng FF và BRAM đúng chỗ

❌ Sai lầm phổ biến

  • Dùng mảng reg [7:0] mem [0:1023] cho bộ nhớ lớn → ăn LUT

  • Dùng logic để cộng/nhân số lớn → tốn LUT

✅ Cách đúng

  • Dùng BRAM cho bộ nhớ

  • Dùng DSP cho nhân/cộng lớn

Ví dụ (suy ra BRAM):

 
reg [7:0] mem [0:1023];
always @(posedge clk)
  mem[addr] <= din;

👉 Thêm attribute:

 
(* ram_style = "block" *) reg [7:0] mem [0:1023];

3. Nguyên tắc #2: FSM gọn – giảm số trạng thái

FSM là “kẻ ngốn tài nguyên thầm lặng” nếu viết không gọn.

Mẹo tối ưu FSM

  • Tránh FSM quá chi tiết không cần thiết

  • Gộp trạng thái có hành vi giống nhau

  • Dùng Moore FSM khi không cần phản hồi tức thì

  • Mã hóa trạng thái hợp lý

Ví dụ:

 
typedef enum logic [1:0] {
  IDLE,
  RUN,
  DONE
} state_t;

👉 FSM ít trạng thái → ít FF + LUT hơn.


4. Nguyên tắc #3: Dùng clock enable thay vì tạo clock mới

https://anysilicon.com/wp-content/uploads/2021/02/Clock-gating-with-global-enable-signal.png
https://www.embedded.com/wp-content/uploads/sites/2/media-1075105-0303feat2fig1.gif

❌ Không nên

 
always @(posedge clk_div) begin
  ...
end

✅ Nên

 
always @(posedge clk) begin
  if (ce) begin
    ...
  end
end

Lợi ích:

  • Giảm routing clock

  • Dễ timing closure

  • Ít tài nguyên clock buffer


5. Nguyên tắc #4: Chọn độ rộng bit (bit-width) vừa đủ

❌ Lãng phí

 
reg [31:0] counter; // chỉ đếm tới 100

✅ Tối ưu

 
reg [6:0] counter; // đủ đếm tới 127

👉 Mỗi bit dư = thêm FF + LUT.


6. Nguyên tắc #5: Tận dụng DSP slice cho phép nhân/cộng

https://www.researchgate.net/publication/360188046/figure/fig4/AS%3A1149023289393205%401650959908705/Schematic-of-the-DSP-SLICE-available-in-the-Xilinx-7-series-FPGAs-Xil18a.png
https://la.mathworks.com/help/examples/hdlcoder/win64/xxxilinx_fpga_dsp_arch_guideline.png

Ví dụ

 
assign y = a * b;
  • Nếu bit-width phù hợp → tool tự suy ra DSP

  • Nếu không → nhân bằng LUT (rất tốn)

👉 Kiểm tra Synthesis Report → DSP usage.


7. Nguyên tắc #6: Pipeline để tăng Fmax (và đôi khi giảm LUT)

Pipeline giúp:

  • Giảm logic mỗi chu kỳ

  • Dễ đạt timing

  • Có thể giảm LUT do tool tối ưu tốt hơn

Ví dụ:

 
always @(posedge clk) begin
  stage1 <= a + b;
  stage2 <= stage1 * c;
end

8. Nguyên tắc #7: Tránh logic “không dùng nhưng vẫn tồn tại”

  • Tín hiệu không dùng → vẫn có thể tốn LUT

  • Debug signal quên xóa

👉 Dùng:

  • (* keep = "false" *)

  • Kiểm tra Unused logic trong report


9. Quy trình tối ưu thực tế (rất quan trọng)

  1. Viết code rõ ràng, đúng chức năng

  2. Run Synthesis

  3. Xem:

    • LUT / FF / BRAM / DSP

    • Critical path

  4. Tối ưu chỗ ăn tài nguyên nhất

  5. Lặp lại

❗ Đừng tối ưu “mù” trước khi xem report.


Chiến Thần IV Tạp Dịch

 
Đã đăng : 24/12/2025 16:27