LED blinker

Introduction

For my experiments with the Red Pitaya, I’d like to have the following development environment:

Here is how I set it all up.

Pre-requirements

My development machine has the following installed:

Here are the commands to install all the other required packages:

apt-get update

apt-get --no-install-recommends install \
  bc binfmt-support bison build-essential ca-certificates curl \
  debootstrap device-tree-compiler dosfstools flex fontconfig git \
  libgtk-3-0 libncurses-dev libssl-dev libtinfo5 parted qemu-user-static \
  squashfs-tools sudo u-boot-tools x11-utils xvfb zerofree zip

Source code

The source code is available at

https://github.com/pavel-demin/red-pitaya-notes

This repository contains the following components:

All steps of the development chain and the corresponding scripts are shown in the following diagram:

Scripts

Syntactic sugar for IP cores

The projects/led_blinker directory contains one Tcl file block_design.tcl that instantiates, configures and interconnects all the needed IP cores.

By default, the IP core instantiation and configuration commands are quite verbose:

create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 ps_0

set_property CONFIG.PCW_IMPORT_BOARD_PRESET cfg/red_pitaya.xml [get_bd_cells ps_0]

connect_bd_net [get_bd_pins ps_0/FCLK_CLK0] [get_bd_pins ps_0/M_AXI_GP0_ACLK]

With the Tcl’s flexibility, it’s easy to define a less verbose command that looks similar to the module instantiation in Verilog:

cell xilinx.com:ip:processing_system7:5.5 ps_0 {
  PCW_IMPORT_BOARD_PRESET cfg/red_pitaya.xml
} {
  M_AXI_GP0_ACLK ps_0/FCLK_CLK0
}

The cell command and other helper commands are defined in the scripts/project.tcl script.

Getting started

Setting up the Vitis and Vivado environment:

source /opt/Xilinx/Vitis/2023.1/settings64.sh

Cloning the source code repository:

git clone https://github.com/pavel-demin/red-pitaya-notes
cd red-pitaya-notes

Building Vivado project:

make NAME=led_blinker xpr

Opening Vivado project:

vivado tmp/led_blinker.xpr

Building bitstream file:

make NAME=led_blinker bit

SD card image

Building boot.bin:

make NAME=led_blinker all

Building a bootable SD card image:

sudo sh scripts/image.sh scripts/debian.sh red-pitaya-debian-12-armhf.img 1024

The SD card image size is 1 GB, so it should fit on any SD card starting from 2 GB.

To write the image to a SD card, the dd command-line utility can be used on GNU/Linux and Mac OS X or Win32 Disk Imager can be used on MS Windows.

The default password for the root account is changeme.

A pre-built SD card image can be downloaded from this link.

Resizing SD card partitions on running Red Pitaya:

# delete second partition
echo -e "d\n2\nw" | fdisk /dev/mmcblk0
# recreate partition
parted -s /dev/mmcblk0 mkpart primary ext4 16MiB 100%
# resize partition
resize2fs /dev/mmcblk0p2

Reprogramming FPGA

It’s possible to reprogram the FPGA by loading the bitstream file into /dev/xdevcfg:

cat led_blinker.bit > /dev/xdevcfg