Mục lục:

Tổng hợp khối IP video Vivado HLS: 12 bước
Tổng hợp khối IP video Vivado HLS: 12 bước

Video: Tổng hợp khối IP video Vivado HLS: 12 bước

Video: Tổng hợp khối IP video Vivado HLS: 12 bước
Video: Thiết Kế hệ thống nhúng - Buổi 8 - Phần 1/2 2024, Tháng mười một
Anonim
Tổng hợp khối IP video Vivado HLS
Tổng hợp khối IP video Vivado HLS

Bạn đã bao giờ muốn xử lý thời gian thực trên video mà không cần thêm nhiều độ trễ hoặc trong một hệ thống nhúng? FPGA (Mảng cổng có thể lập trình trường) đôi khi được sử dụng để thực hiện việc này; tuy nhiên, việc viết các thuật toán xử lý video bằng các ngôn ngữ đặc tả phần cứng như VHDL hoặc Verilog là điều tốt nhất khiến bạn khó chịu. Nhập Vivado HLS, công cụ Xilinx cho phép bạn lập trình trong môi trường C ++ và tạo mã ngôn ngữ đặc tả phần cứng từ nó.

Phần mềm cần thiết:

  • Vivado HLS
  • Vivado
  • (Nếu bạn sử dụng đăng ký AXI) Vivado SDK

(Tùy chọn) Tải xuống các ví dụ được tạo bởi Xilinx tại đây:

Ví dụ về video Xilinx HLS

Bước 1: Vivado HLS là gì?

Vivado HLS là một công cụ được sử dụng để biến mã giống như c ++ thành cấu trúc phần cứng có thể được triển khai trên FPGA. Nó bao gồm một IDE để thực hiện việc phát triển này. để sử dụng với Vivado.

Tải xuống các tệp đính kèm và đặt chúng gần nơi bạn sẽ tạo dự án của mình. (đổi tên chúng trở lại "top.cpp" và "top.h" nếu chúng có tên ngẫu nhiên)

Bước 2: Thư viện video HLS

Thư viện video HLS
Thư viện video HLS
Thư viện video HLS
Thư viện video HLS

Thư viện Video của HLS có tài liệu với các thiết kế tham chiếu trong bài báo này: XAPP1167 Một tài nguyên hữu ích khác là trang Xilinx Wiki về nó.

Khởi động Vivado HLS.

Tạo một dự án mới.

Lấy các tệp bạn đã tải xuống ở bước trước và thêm chúng dưới dạng tệp nguồn. (Lưu ý: các tệp không được sao chép vào dự án, nhưng thay vào đó vẫn giữ nguyên vị trí của chúng)

Sau đó, sử dụng nút Browse để chọn chức năng hàng đầu.

Trên trang tiếp theo, chọn phần Xilinx bạn đang sử dụng.

Bước 3: Tổng hợp

Tổng hợp
Tổng hợp

Giải pháp => Chạy Tổng hợp C => Giải pháp hoạt động

Sau ~ 227,18 giây, nó sẽ được thực hiện. (Lưu ý: thời gian tổng hợp thực tế của bạn sẽ thay đổi tùy theo nhiều yếu tố)

Bước 4: Lập phiên bản và các thông tin khác để xuất

Phiên bản và Thông tin khác để xuất
Phiên bản và Thông tin khác để xuất

Số phiên bản tương tác với Vivado để khiến bạn có thể cập nhật IP trong một thiết kế. Nếu đó là một thay đổi phiên bản nhỏ, nó có thể được thực hiện tại chỗ trong khi các thay đổi phiên bản lớn yêu cầu bạn thêm thủ công vào khối mới và xóa khối cũ. được thực hiện hoàn toàn tự động bằng cách nhấn nút cập nhật IP. Bạn có thể chạy "report_ip_status" trong bảng điều khiển Vivado tcl để xem trạng thái IP của mình.

Đặt số phiên bản và thông tin khác trong Giải pháp => Cài đặt Giải pháp…

Ngoài ra, các cài đặt này có thể được đặt trong quá trình xuất.

Bước 5: Xuất sang Thư viện IP Vivado

Xuất sang Thư viện IP Vivado
Xuất sang Thư viện IP Vivado
Xuất sang Thư viện IP Vivado
Xuất sang Thư viện IP Vivado

Giải pháp => Xuất RTL

Nếu bạn không đặt chi tiết thư viện IP trong bước trước, bạn có thể thực hiện điều đó ngay bây giờ.

Bước 6: Tổng hợp và phân tích xuất

Phân tích tổng hợp và xuất khẩu
Phân tích tổng hợp và xuất khẩu
Phân tích tổng hợp và xuất khẩu
Phân tích tổng hợp và xuất khẩu
Phân tích tổng hợp và xuất khẩu
Phân tích tổng hợp và xuất khẩu

Trên màn hình này, chúng ta có thể thấy số liệu thống kê về mô-đun đã xuất của chúng tôi, cho thấy rằng nó đáp ứng khoảng thời gian đồng hồ của chúng tôi là 10ns (100MHz) và lượng tài nguyên mà nó sử dụng.

Với sự kết hợp của điều này, Báo cáo tổng hợp và phân tích Luồng dữ liệu của chúng tôi, chúng ta có thể thấy rằng phải mất 317338 chu kỳ đồng hồ * khoảng thời gian đồng hồ 10ns * 14 giai đoạn đường ống = 0,04442732 giây. Có nghĩa là tổng độ trễ được thêm vào bởi quá trình xử lý hình ảnh của chúng tôi nhỏ hơn một phần hai mươi giây (khi đạt tốc độ 100MHz được nhắm mục tiêu).

Bước 7: Thêm Thư viện IP trong Vivado

Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado
Thêm Thư viện IP trong Vivado

Để sử dụng khối IP tổng hợp của bạn, bạn cần phải thêm nó vào Vivado.

Trong Vivado, hãy thêm kho lưu trữ IP vào dự án của bạn bằng cách đi tới danh mục IP và nhấp chuột phải chọn "Thêm kho lưu trữ…"

Điều hướng đến thư mục dự án Vivado HLS của bạn và chọn thư mục giải pháp của bạn.

Nó sẽ báo cáo IP mà nó tìm thấy.

Bước 8: Thực hiện nâng cấp

Thực hiện nâng cấp
Thực hiện nâng cấp
Thực hiện nâng cấp
Thực hiện nâng cấp
Thực hiện nâng cấp
Thực hiện nâng cấp

Đôi khi bạn cần thực hiện các thay đổi đối với khối HLS của mình sau khi đưa nó vào thiết kế Vivado.

Để thực hiện việc này, bạn có thể thực hiện các thay đổi và tổng hợp lại và xuất IP với số phiên bản cao hơn (xem chi tiết trong bước trước về các thay đổi số phiên bản lớn / nhỏ).

Sau khi thay đổi xuất phiên bản mới, hãy làm mới kho IP của bạn trong Vivado. Điều này có thể được thực hiện khi Vivado nhận thấy IP đã thay đổi trong kho lưu trữ hoặc được kích hoạt theo cách thủ công. (Lưu ý, nếu bạn làm mới kho lưu trữ IP của mình sau khi bắt đầu, nhưng trước khi quá trình xuất hoàn tất trong HLS, IP sẽ tạm thời không ở đó, hãy đợi nó kết thúc và làm mới lại.)

Tại thời điểm này, một cửa sổ sẽ xuất hiện với thông tin rằng một IP đã được thay đổi trên đĩa và cung cấp cho bạn tùy chọn cập nhật nó bằng nút "Đã chọn nâng cấp". Nếu thay đổi là một thay đổi phiên bản nhỏ và không có giao diện nào thay đổi, sau đó nhấn nút đó sẽ tự động thay thế IP cũ bằng IP mới, nếu không có thể phải thực hiện thêm công việc.

Bước 9: Chi tiết và thông tin bổ sung

Các bước sau cung cấp thêm thông tin về cách hoạt động của tổng hợp HLS và bạn có thể làm gì với nó.

Để biết ví dụ về một dự án sử dụng khối IP tổng hợp HLS, hãy xem hướng dẫn này.

Bước 10: Đầu ra và đầu vào

Đầu ra và đầu vào
Đầu ra và đầu vào
Đầu ra và đầu vào
Đầu ra và đầu vào

Đầu ra và Đầu vào cho khối IP cuối cùng được xác định từ một phân tích mà bộ tổng hợp thực hiện về luồng dữ liệu vào và ra khỏi chức năng hàng đầu.

Tương tự như trong VHDL hoặc Verilog, HLS cho phép bạn chỉ định chi tiết về các kết nối giữa các IP. Những dòng này là ví dụ về điều này:

void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {

#pragma Cổng GIAO DIỆN HLS của trục = video_in bó = INPUT_STREAM #pragma Cổng trục GIAO DIỆN HLS = video_out bó = OUTPUT_STREAM #pragma GIAO DIỆN HLS s_axilite port = x Bundle = CONTROL_BUS offset = 0x14 # pragma HLS INTERFACE y_ pack = CONTROLx1

Bạn có thể thấy các cổng được hiển thị trên khối IP bị ảnh hưởng như thế nào bởi các chỉ thị này.

Bước 11: Đăng ký AXI Interfacing

Giao diện đăng ký AXI
Giao diện đăng ký AXI

Để có được đầu vào / đầu ra đến / từ khối IP của bạn đến PS, một cách tốt để thực hiện điều này là thông qua giao diện AXI.

Bạn có thể chỉ định điều này trong mã HLS của mình, bao gồm các hiệu số sẽ được sử dụng để truy cập giá trị sau này như sau:

void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {

#pragma GIAO DIỆN HLS cổng s_axilite = x bó = CONTROL_BUS offset = 0x14

#pragma GIAO DIỆN HLS s_axilite port = y Bundle = CONTROL_BUS offset = 0x1C #pragma HLS dataflow

x = 42;

y = 0xDEADBEEF; }

Sau khi được kết nối đúng cách trong Vivado, bạn có thể truy cập các giá trị bằng mã này trong Vivado SDK:

#include "thông số.h"

#define xregoff 0x14 #define yregoff 0x1c x = Xil_In32 (XPAR_IMAGE_FILTER_0_S_AXI_CONTROL_BUS_BASEADDR + xregoff); y = Xil_In32 (XPAR_IMAGE_FILTER_0_S_AXI_CONTROL_BUS_BASEADDR + yregoff);

Điều này sẽ khiến bạn kết thúc bằng 42 trong x và 0xdeadbeef trong y

Bước 12: Dataflow Pragma

Dataflow Pragma
Dataflow Pragma
Dataflow Pragma
Dataflow Pragma
Dataflow Pragma
Dataflow Pragma

Bên trong #pragma DATAFLOW cách mã được triển khai thay đổi so với C ++ bình thường. Mã được kết nối để tất cả các lệnh luôn chạy ở các phần khác nhau của dữ liệu (Hãy nghĩ về nó giống như một dây chuyền lắp ráp trong một nhà máy, mỗi trạm làm việc liên tục để thực hiện một chức năng và chuyển nó đến trạm tiếp theo)

từ hình ảnh, bạn có thể thấy rằng mỗi lệnh

Mặc dù có vẻ là các biến bình thường, các đối tượng img thực sự được thực hiện dưới dạng bộ đệm nhỏ giữa các lệnh. Việc sử dụng một hình ảnh làm đầu vào cho một hàm sẽ "tiêu thụ" nó và khiến nó không thể sử dụng được nữa. (Do đó cần có các lệnh trùng lặp)

Đề xuất: