
Explore function acceleration on FPGA using high level synthesis with C/C++. Learn how the Xilinx Vitis platform maps algorithms to zinc based embedded systems, including OpenCL emulation options.
Learn the fundamentals of accelerating compute-intensive tasks on FPGA-based embedded systems with the Vitus design flow. This course offers a practical, high-level introduction built around four parts and C/C++ prerequisites.
Explore how embedded systems evolve from on-premises computing to cloud and edge architectures, describing endpoints, edge devices, and IoT, and highlighting FPGA-based accelerators for edge applications.
Investigate the role of high level synthesis in end devices, edge platforms, and cloud computing, and how HLS enables pipelines and interfaces on FPGA based embedded systems.
1- Assume a design that uses HP0 and HP1 in a Zynq UltraScale MPSoC to read data arrays simultaneously at the frequency of 200MHz. What would be the maximum memory bandwidth utilisation?
2- What is the upper bound of the memory utilisation for reading data from a DDR memory in Zynq 7000 at the frequency of 150MHz?
Identify the hardware and software components, including the host computer and FPGA boards, and the design flow to create an accelerator with Xilinx tools and a final binary.
Set up a Linux workstation with Xilinx Vitus unified software platform, learn about software and hardware emulation, and generate FPGA bitstreams to test on zinc based FPGA boards or emulation.
Obtain and configure the Zcu 102 Vitis platform, build a hardware‑software platform, and prepare an SD card to boot the Zynq MP Linux system and run a Linux emulator.
Explain the structure of a Vitis project with three sub projects—kernel code, linking hardware modules, and host code—generating the bitstream and the ARM executable to boot a target Linux system.
Learn to write a host program for a hardware accelerator running on zinc, control a kernel, and explore the host-kernel relationship, OpenCL APIs, and Vitis concepts.
Write a host program in C++ for an OpenCL 1.2 FPGA accelerator, covering environment setup, device discovery, context creation, kernel argument configuration, and memory buffer management.
Explain burst data transfer between an FPGA kernel and memory, showing how contiguous data blocks are read and written with minimal latency and streaming throughput.
Define the host code for the scaling kernel, set buffers and arguments, and prepare input data. Migrate buffers, run the kernel, synchronize, and validate results against the golden model.
Create a vitus scaling project, implement kernel and host code, and run it through software emulation, hardware emulation, and hardware with sd card boot.
Develop an efficient image thresholding example using Vitis, optimizing kernel computation and data transactions, analyzing burst data protocols, and integrating an external software library with data files.
Explore binary thresholding as a simple image segmentation method, converting grayscale to binary with a 128 threshold on an fpga using Vitis.
Explain host code for an FPGA thresholding workflow using OpenCL and OpenCV, covering image read, grayscale conversion, buffer setup, kernel launch, and comparison with the golden model.
Demonstrates running an image thresholding example on the FPGA using Vitus, OpenCV, and hardware builds; transfer SD card files, connect via network, and debug with Vitus ID.
Develop and debug a linear relationship kernel for fpga acceleration by writing kernel and host code, compiling, and running in the software emulator.
Assign two memory ports to the kernel using pragmas to read A and B from DDR memory with separate bundles, boosting performance from 117.74 ms to 10.687 ms on hardware.
Discover how HLS optimizes loops to speed up kernels on FPGAs, using unrolling, pipelining, flattening, and merging, with memory considerations for on-chip and off-chip RAM.
This lecture defines iteration latency and loop latency, explains how loop trip count and latency directives influence performance, and shows how max or min latency constraints affect synthesis results.
Explore loop unrolling in HLS to accelerate FPGAs: compare rolled, partially unrolled, and fully unrolled loops, and learn how unroll directives affect multipliers, memory ports, and parallel data access.
Explore the array partitioning optimization, boosting throughput by splitting block RAM into multiple arrays using the partition directive (name, dimension, factor, type: block, cyclic, complete).
Merge consecutive loops into a single loop to reduce latency and improve logic optimization. Use the loop_underscore_merge pragma to guide merging within a scope, bound by side effects restrictions.
Explore data dependencies in pipelined loops, including loop carried dependencies that raise the initiation interval, and how dependencies inside and between iterations affect performance in FPGA acceleration with Vitis.
Explore memory dependencies in FPGA design with Vitis, showing how Eprom with two access ports can constrain parallel reads and how memory partitioning increases ports to reduce the initiation interval.
This course is an introduction to function acceleration in high-level synthesis (HLS). The goals of the course are describing, debugging and implementing compute-intensive algorithms on FPGA-based embedded systems using C/C++ language without any help from HDLs (e.g., VHDL or Verilog).
The course introduces the Xilinx Zynq embedded systems and then explains how to use Xilinx toolsets to map applications on them.
It uses the Xilinx Vitis unified software platform to describe real examples and applications for embedded systems. The course follows the software and hardware emulation schemes as well as running the applications on the actual FPGAs.
Each section of the course uses several examples, quizzes and exercises to explain complex designing concepts easily and smoothly.
Along the course, you will work with several examples describing the HLS concepts and techniques. The course contains numerous quizzes and exercises for you to practice and master the proposed methods and approaches. In addition, the course utilises two exciting projects to put all the explained concepts together to design real circuits and hardware controllers.
This course is the first of a series of courses on function acceleration on Zynq-based embedded systems. Whereas this course focuses on fundamental concepts, the other courses will explain different optimisation techniques in Vitis.