สารบัญ:

Vivado HLS Video IP Block Synthesis: 12 ขั้นตอน
Vivado HLS Video IP Block Synthesis: 12 ขั้นตอน

วีดีโอ: Vivado HLS Video IP Block Synthesis: 12 ขั้นตอน

วีดีโอ: Vivado HLS Video IP Block Synthesis: 12 ขั้นตอน
วีดีโอ: Creating a custom AXI-Streaming IP in Vivado 2024, พฤศจิกายน
Anonim
Vivado HLS Video IP Block Synthesis
Vivado HLS Video IP Block Synthesis

คุณเคยต้องการที่จะประมวลผลวิดีโอตามเวลาจริงโดยไม่ต้องเพิ่มเวลาแฝงหรือในระบบฝังตัวหรือไม่? บางครั้งใช้ FPGA (Field Programmable Gate Arrays) อย่างไรก็ตาม การเขียนอัลกอริธึมการประมวลผลวิดีโอในภาษาข้อกำหนดฮาร์ดแวร์ เช่น VHDL หรือ Verilog นั้นน่าหงุดหงิดที่สุด ป้อน Vivado HLS ซึ่งเป็นเครื่องมือ Xilinx ที่ให้คุณเขียนโปรแกรมในสภาพแวดล้อม C++ และสร้างรหัสภาษาข้อกำหนดฮาร์ดแวร์จากมัน

ซอฟต์แวร์ที่จำเป็น:

  • Vivado HLS
  • วิวาโด
  • (หากคุณใช้การลงทะเบียน AXI) Vivado SDK

(ไม่บังคับ) ดาวน์โหลดตัวอย่าง Xilinx ที่สร้างไว้ที่นี่:

ตัวอย่างวิดีโอ Xilinx HLS

ขั้นตอนที่ 1: Vivado HLS คืออะไร?

Vivado HLS เป็นเครื่องมือที่ใช้ในการเปลี่ยนโค้ด c++ ให้เป็นโครงสร้างฮาร์ดแวร์ที่สามารถนำไปใช้กับ FPGA ได้ ซึ่งมี IDE สำหรับการพัฒนานี้ เมื่อคุณพัฒนาโค้ดสำหรับ HLS เสร็จเรียบร้อยแล้ว คุณสามารถส่งออก IP ที่สร้างขึ้นในรูปแบบ สำหรับใช้กับ Vivado

ดาวน์โหลดไฟล์แนบและวางไว้ใกล้ตำแหน่งที่คุณจะสร้างโครงการของคุณ (เปลี่ยนชื่อกลับเป็น "top.cpp" และ "top.h" หากมีชื่อแบบสุ่ม)

ขั้นตอนที่ 2: ไลบรารีวิดีโอ HLS

ไลบรารีวิดีโอ HLS
ไลบรารีวิดีโอ HLS
ไลบรารีวิดีโอ HLS
ไลบรารีวิดีโอ HLS

ไลบรารีวิดีโอ HLS มีเอกสารประกอบพร้อมการออกแบบอ้างอิงในเอกสารนี้:XAPP1167แหล่งข้อมูลที่ดีอีกประการหนึ่งคือหน้า Xilinx Wiki เกี่ยวกับเรื่องนี้

เริ่มใช้งาน Vivado HLS

สร้างโครงการใหม่

นำไฟล์ที่คุณดาวน์โหลดมาในขั้นตอนก่อนหน้าและเพิ่มเป็นไฟล์ต้นฉบับ (หมายเหตุ: ไฟล์จะไม่ถูกคัดลอกลงในโปรเจ็กต์ แต่จะยังคงอยู่ที่เดิม)

จากนั้นใช้ปุ่มเรียกดูเพื่อเลือกฟังก์ชั่นด้านบน

ในหน้าถัดไป เลือกส่วน Xilinx ที่คุณกำลังใช้

ขั้นตอนที่ 3: การสังเคราะห์

การสังเคราะห์
การสังเคราะห์

Solution => Run C Synthesis => Active Solution

หลังจาก ~ 227.218 วินาที ก็ควรจะเสร็จสิ้น (หมายเหตุ: เวลาสังเคราะห์จริงของคุณจะแตกต่างกันไปตามปัจจัยหลายประการ)

ขั้นตอนที่ 4: การกำหนดเวอร์ชันและข้อมูลอื่นๆ สำหรับการส่งออก

การกำหนดเวอร์ชันและข้อมูลอื่นๆ สำหรับการส่งออก
การกำหนดเวอร์ชันและข้อมูลอื่นๆ สำหรับการส่งออก

หมายเลขเวอร์ชันโต้ตอบกับ Vivado เพื่อให้คุณสามารถอัปเดต IP ในการออกแบบได้ หากเป็นเวอร์ชันรอง การเปลี่ยนแปลงสามารถทำได้ในขณะที่การเปลี่ยนแปลงเวอร์ชันหลักจำเป็นต้องเพิ่มบล็อกใหม่และลบบล็อกเก่าด้วยตนเอง หากอินเทอร์เฟซของคุณไม่เปลี่ยนแปลงและการอัปเดตเวอร์ชันเป็นเวอร์ชันรอง การอัปเดตอาจเป็นได้ ทำโดยอัตโนมัติอย่างสมบูรณ์โดยกดปุ่มอัปเดต IP คุณสามารถเรียกใช้ "report_ip_status" ในคอนโซล Vivado tcl เพื่อดูสถานะของ IP ของคุณ

ตั้งค่าหมายเลขเวอร์ชันและข้อมูลอื่นๆ ใน Solution => Solution Settings…

หรือสามารถตั้งค่าเหล่านี้ได้ในระหว่างการส่งออก

ขั้นตอนที่ 5: การส่งออกไปยัง Vivado IP Library

การส่งออกไปยัง Vivado IP Library
การส่งออกไปยัง Vivado IP Library
การส่งออกไปยัง Vivado IP Library
การส่งออกไปยัง Vivado IP Library

โซลูชัน => ส่งออก RTL

หากคุณไม่ได้ตั้งค่ารายละเอียดไลบรารี IP ในขั้นตอนก่อนหน้า คุณสามารถทำได้ในตอนนี้

ขั้นตอนที่ 6: การวิเคราะห์การสังเคราะห์และการส่งออก

การวิเคราะห์การสังเคราะห์และการส่งออก
การวิเคราะห์การสังเคราะห์และการส่งออก
การวิเคราะห์การสังเคราะห์และการส่งออก
การวิเคราะห์การสังเคราะห์และการส่งออก
การวิเคราะห์การสังเคราะห์และการส่งออก
การวิเคราะห์การสังเคราะห์และการส่งออก

ในหน้าจอนี้ เราจะเห็นสถิติเกี่ยวกับโมดูลที่ส่งออกของเรา ซึ่งแสดงให้เห็นว่าโมดูลนั้นตรงตามช่วงเวลานาฬิกาของเราที่ 10ns (100MHz) และใช้ทรัพยากรแต่ละรายการมากน้อยเพียงใด

ด้วยการรวมกันของสิ่งนี้ รายงานการสังเคราะห์ และการวิเคราะห์กระแสข้อมูลของเรา เราจะเห็นว่าใช้เวลา 317338 รอบนาฬิกา * ระยะเวลานาฬิกา 10ns * 14 ขั้นตอนไปป์ไลน์ = 0.04442732 วินาที หมายความว่าเวลาแฝงทั้งหมดที่เพิ่มโดยการประมวลผลภาพของเรานั้นน้อยกว่าหนึ่งในยี่สิบวินาที (เมื่อโอเวอร์คล็อกที่ 100MHz เป้าหมาย)

ขั้นตอนที่ 7: การเพิ่ม IP Library ใน Vivado

การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado
การเพิ่ม IP Library ใน Vivado

หากต้องการใช้บล็อก IP ที่สังเคราะห์ คุณจะต้องเพิ่มลงใน Vivado

ใน Vivado ให้เพิ่มที่เก็บ IP ให้กับโปรเจ็กต์ของคุณโดยไปที่แค็ตตาล็อก IP แล้วคลิกขวาเลือก "Add Repository…"

ไปที่ไดเร็กทอรีโครงการ Vivado HLS และเลือกไดเร็กทอรีโซลูชันของคุณ

ควรรายงาน IP ที่พบ

ขั้นตอนที่ 8: ทำการอัปเกรด

ทำการอัปเกรด
ทำการอัปเกรด
ทำการอัปเกรด
ทำการอัปเกรด
ทำการอัปเกรด
ทำการอัปเกรด

บางครั้งคุณจำเป็นต้องทำการเปลี่ยนแปลงบล็อก HLS หลังจากรวมไว้ในการออกแบบ Vivado

ในการดำเนินการนี้ คุณสามารถทำการเปลี่ยนแปลงและสังเคราะห์อีกครั้ง และส่งออก IP ด้วยหมายเลขเวอร์ชันที่สูงกว่า (ดูรายละเอียดในขั้นตอนก่อนหน้าเกี่ยวกับการเปลี่ยนแปลงหมายเลขเวอร์ชันหลัก/รอง)

หลังจากเปลี่ยนการส่งออกเวอร์ชันใหม่แล้ว ให้รีเฟรชที่เก็บ IP ของคุณใน Vivado สิ่งนี้สามารถทำได้เมื่อ Vivado สังเกตเห็นว่า IP มีการเปลี่ยนแปลงในที่เก็บ หรือเปิดใช้งานด้วยตนเอง (โปรดทราบว่า หากคุณรีเฟรชที่เก็บ IP ของคุณหลังจากเริ่มต้น แต่ก่อนที่การส่งออกจะเสร็จสิ้นใน HLS IP จะไม่อยู่ที่นั่นชั่วคราว รอให้เสร็จสิ้นและรีเฟรชอีกครั้ง)

ณ จุดนี้ หน้าต่างควรปรากฏขึ้นพร้อมข้อมูลที่มีการเปลี่ยนแปลง IP บนดิสก์ และให้ตัวเลือกแก่คุณในการอัปเดตด้วยปุ่ม "อัปเกรดที่เลือก" หากการเปลี่ยนแปลงเป็นการเปลี่ยนแปลงเวอร์ชันเล็กน้อยและไม่มีอินเทอร์เฟซใดเปลี่ยนแปลง จากนั้นการกดปุ่มนั้นจะแทนที่ IP เก่าด้วย IP ใหม่โดยอัตโนมัติ มิฉะนั้นอาจต้องทำงานมากกว่านี้

ขั้นตอนที่ 9: รายละเอียดและข้อมูลเพิ่มเติม

ขั้นตอนต่อไปนี้ให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของการสังเคราะห์ HLS และสิ่งที่คุณทำได้

สำหรับตัวอย่างของโครงการที่ใช้บล็อก IP สังเคราะห์ HLS ดูคำแนะนำนี้

ขั้นตอนที่ 10: เอาต์พุตและอินพุต

เอาต์พุตและอินพุต
เอาต์พุตและอินพุต
เอาต์พุตและอินพุต
เอาต์พุตและอินพุต

เอาต์พุตและอินพุตไปยังบล็อก IP สุดท้ายถูกกำหนดจากการวิเคราะห์ที่ซินธิไซเซอร์ทำการไหลของข้อมูลเข้าและออกจากฟังก์ชันด้านบน

คล้ายกับใน VHDL หรือ verilog HLS ช่วยให้คุณระบุรายละเอียดเกี่ยวกับการเชื่อมต่อระหว่าง IP บรรทัดเหล่านี้เป็นตัวอย่างของสิ่งนี้:

โมฆะ image_filter (AXI_STREAM& video_in, AXI_STREAM& video_out, int& x, int& y) {

#pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM #pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port=x bundle=CONTROL_BUS offset=0x14#pragma HLS INTERFACE sy_= xilite พอร์ต

คุณสามารถดูว่าพอร์ตที่แสดงบนบล็อก IP ได้รับอิทธิพลจากคำสั่งเหล่านี้อย่างไร

ขั้นตอนที่ 11: AXI ลงทะเบียนการเชื่อมต่อ

การเชื่อมต่อการลงทะเบียน AXI
การเชื่อมต่อการลงทะเบียน AXI

ในการรับอินพุต/เอาต์พุตไปยัง/จากบล็อก IP ของคุณไปยัง PS วิธีที่ดีในการทำเช่นนี้คือผ่านอินเทอร์เฟซ AXI

คุณสามารถระบุสิ่งนี้ในรหัส HLS ของคุณ รวมถึงออฟเซ็ตที่จะใช้ในการเข้าถึงค่าในภายหลังดังนี้:

โมฆะ image_filter (AXI_STREAM& video_in, AXI_STREAM& video_out, int& x, int& y) {

#pragma HLS INTERFACE s_axilite พอร์ต=x มัด=CONTROL_BUS ออฟเซ็ต=0x14

#pragma HLS INTERFACE s_axilite port=y bundle=CONTROL_BUS offset=0x1C #pragma HLS dataflow

x = 42;

y = 0xDEADBEEF; }

เมื่อเชื่อมต่ออย่างถูกต้องใน Vivado คุณจะสามารถเข้าถึงค่าต่างๆ ได้โดยใช้รหัสนี้ใน Vivado SDK:

#include "parameters.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);

นี้จะทำให้คุณลงเอยด้วย 42 ใน x และ 0xdeadbeef ใน y

ขั้นตอนที่ 12: Dataflow Pragma

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

ภายใน #pragma DATAFLOW วิธีการใช้งานโค้ดเปลี่ยนแปลงจาก C ++ ปกติ โค้ดจะถูกส่งต่อเพื่อให้คำสั่งทั้งหมดทำงานตลอดเวลาในส่วนต่างๆ ของข้อมูล (ให้คิดว่าเป็นสายการประกอบในโรงงาน แต่ละสถานีทำงานอย่างต่อเนื่องโดยทำหน้าที่เดียวและส่งไปยังสถานีถัดไป)

จากภาพจะเห็นได้ว่าแต่ละคำสั่ง

แม้จะดูเหมือนเป็นตัวแปรปกติ แต่วัตถุ img นั้นถูกนำไปใช้จริงเป็นบัฟเฟอร์ขนาดเล็กระหว่างคำสั่งต่างๆ การใช้รูปภาพเป็นอินพุตของฟังก์ชัน "สิ้นเปลือง" และทำให้ใช้งานไม่ได้อีกต่อไป (จึงมีความจำเป็นสำหรับคำสั่งที่ซ้ำกัน)

แนะนำ: