
Build the block diagram by adding key IP cores: Zynq processor, processor system reset, AXI direct memory access, AXI4-Stream subset converter, XADC, AXI interconnects, AXI GPIO.
Implement two high-level gpio configuration functions for single or dual channel gpio, initialize with XGpio_Initialize() with the correct parameters, check status, run XGpio_SelfTest(), and set data direction.
Experiment with prepped color combinations to reveal vibrant, dynamic RGB LEDs while running the project, and explore your own color variations for further possibilities.
Observe the header file for definitions and functions and the MLX90393 C file for implementations, with gpio_i2c_int guiding the super loop and interrupt service, watching magnet axes change.
Master baremetal programming for the AMD Zynq-7000 SoC using the standalone driver set with no prior knowledge. Learn essential concepts, practical examples, and the architecture for baremetal and Linux programming.
Discover how AMD's Vivado and Vitis HLS streamline FPGA development with high-level synthesis and IP-based design, enabling timing closure, IP reuse, and block design across 7-series, Ultrascale+, and Versal devices.
Explore a layered bare-metal and Linux programming architecture for the Zynq-7000 SoC, using a portable, OS-neutral driver model across RTOS adapters, including FSBL, clocks, DDR, and secure-boot options.
Explore the Arty Z7 GPIO theory, including 3.3V signal handling, button and dip-switch inputs, tri-color LED control with PWM and 50% duty cycles, and AXI GPIO configuration in Vivado.
Build a GPIO hardware platform for the Zynq-7000 by creating a block design in Vivado, configuring the Zynq processing system and interconnect, and exporting a bitstream for Vitis.
Move from vivado to vitis for bare-metal gpio on the zynq, build a hello world, and implement gpio with the axi gpio standalone library. Validate with serial and a self-test.
Toggle four LEDs on the AMD Zynq-7000 using low-level gpio functions by writing to XGPIO_TRI_OFFSET and XGPIO_DATA_OFFSET, with 1-second delays and 100 ms speed options, ensuring JTAG mode before running.
Define custom delay functions and integrate xiltimer to access the global timer for precise delays, then measure and profile function times using inline assembly no-ops and PMU or AXI monitoring.
Explore high-level AXI GPIO functions to read buttons and switches on the Zynq-7000, organizing code into header, c, and main files, with initialization, data direction, and 10 ms polling.
Learn to configure and use the outer header GPIO2 in baremetal programming with Vivado and Vitis, then toggle an LED for five cycles to verify operation.
Demonstrates a basic rgb led control function with pwm, duty cycle validation (0–50%), and 0–500 microseconds timing, mapping red, green, and blue channels to gpio bits in a vivado project.
Explore the zynq-7000 xadc peripheral, featuring 12-bit resolution at 1 msps and 2 lsb integral non-linearity, with 1 mv accuracy and 17 analog input channels, via ps and axi interconnect.
Builds a Vivado hardware platform for a Zynq-7000 with an XADC instance, selects the single-channel mode and calibration, then exports hardware to Vitis for a bare-metal XADC application.
Initialize the XADC peripheral on the AMD Zynq-7000 by generating the XSA, configuring with XAdcPs_LookupConfig and XAdcPs_CfgInitialize, running a self-test, and confirming the PS base address 0xF8007100.
Set up the workspace, hardware platform, and Vitis project; enable safe mode and continuous sequencer mode for six-channel XADC sampling, then read and convert data, and monitor LM35 temperature.
Isolate your analog voltage divider from the xadc input with a unity-gain buffer to prevent loading by the antialiasing filter, restoring accurate readings around 1.6 V.
Build a Vivado hardware platform for simple temperature control by reading the on-chip temperature via XADC and driving a cooling fan through AXI GPIO on the Arty Z7 board.
Implement an on-off temperature control loop in a Vitis project, reading XADC temperatures, comparing to a user-defined limit, and driving a fan via GPIO with a timer and PWM.
Learn to build a Vivado hardware platform using XADC in sequencer mode, AXI DMA in S2MM, and AXI GPIO, with proper interconnects and a TLAST-enabled AXI4-Stream pathway.
Initialize the AXI DMA in Vitis by configuring the device ID, memory base, and burst size, while setting up ping-pong buffers to overlap DMA transfers with processing.
Demonstrates capturing a capacitor discharge waveform with AXI DMA, showing FPGA-based, fast, precise data acquisition, UART logging, and visualization in Excel and Python after 120 bursts.
Explore making I2C work in FPGAs using AXI IIC, focusing on clock stretching, open-drain requirements, and tri-state control for the Zynq-7000 SoC.
If this video clarified why I2C can be deceptively hard (especially in programmable logic) the next natural step is to strengthen your intuition of how the protocol really behaves on the wire. A Basic Guide to I2C is an excellent follow-up read. For junior engineers, it builds a clean mental model of SDA/SCL behavior, ACK/NACK phases, pull-ups, rise times, and clock stretching. For mid and senior engineers, it’s a surprisingly effective refresher: many of the “gotchas” that break real designs are explained clearly, with waveforms and electrical context that directly relate to the issues discussed in this video.
Once you’re comfortable with the concepts, there is no substitute for going to the source. The Philips I2C Bus Specification, now maintained by NXP Semiconductors, is not just a formal document: it’s institutional knowledge. This is where details like clock stretching rules, arbitration, timing constraints, and electrical limits are defined precisely. Many real-world bugs only make sense once you’ve seen how the protocol is supposed to behave according to the spec. Treat this document not as optional reading, but as a long-term reference you’ll come back to whenever an I2C bus behaves “mysteriously.”
Learn to run a minimal I2C scanner on the AMD Zynq-7000 SoC to verify wiring, pull-ups, and driver setup before working with devices like ADS1115 and MAX30102.
Compare axi iic and iicps and learn safe i2c transaction patterns, including repeated start, stop, and timeouts, plus memory address mapping and hardware-to-software handoff in vivado and vitis.
Explore configuring and using the mlx90393 magnetometer in burst mode over i2c, including repeated starts and interrupt signaling data, and interpreting 3-axis magnetic field signatures for orientation and position detection.
Practice baremetal programming for the Zynq-7000 SoC on dummy projects to master it. Dive back into videos, experiment creatively, and leverage this on-demand course to refine your skills.
Baremetal applications run without an OS, i.e. a scheduler or virtual memory, so your code’s behavior is fully determined by what you write. This makes them ideal when “missing a time deadline” is unacceptable.
Learning baremetal programming on the Zynq-7000 SoC is the foundation for deterministic, high-performance, and deeply understood AMD embedded systems that use the PS-PL platforms.
Learning to program at the standalone (baremetal) level on the PS helps you understand the PS–PL interconnect, AXI protocols, and driver design before layering on an OS.
In addition, the resulting codes between C and C++, as well as standalone and Linux builds, are similar between them.
Other reasons for taking this course:
In this course, you’ll get verified, clearly explained, and accurate code that works for this SoC.
Tired of unanswered forum questions? I’ve gathered some of the most common pitfalls and answered them here.
Every project done on this course is broken down step-by-step, guided by both the official documentation and my real-world experience.
It’s the very hands-on, practical course I wish I had seen around when I first got my Arty Z7 board.
Join me on this baremetal journey with the AMD Zynq-7000 SoC. Enroll now and build something amazing!
Important note (Aug 2026): This course is designed exactly for the Digilent Arty Z7 board. If you have another board like Digilent Zybo, Zedboard, Eclypse; Avnet Microzed and AMD ZC702; I cannot guarantee that the exact examples and practices will synthesize, implement, build and run correctly, since hardware-to-software handoffs may vary. Even so, you're welcome to take the course. You can DM me and ask questions in each lesson about how to make them work perfectly on your board.