My first experience with the ZedBoard SoC board.

I recently registered my masters with the Central Peninsula University of Technology in Cape Town, and part of my research with include the use of a FPGA for real-time network communications between smart grids. So I am faced with 2 things – learning a new environment as well as a different field(Power Systems) coming from an Electronics and Computer engineering background.

I am the type of person that is always eager to learn new things, so being thrown into the deep end is nothing foreign to me, sounds like something I took from my resume.

After I registered for the MEng, I was given this board – and I needed to familiarise myself with it.

This blog will detail my experiences and hacks.

zedboard-2zedboard box

Getting started with the ZedBoard SoC

Firstly, we will need to download Xilinx Vivado suite, in order to do this we go to the Xilinx Downloads page to obtain the installer.
Select version 2017.2 or later on the left sidebar. I used the “Single File Download” option and chose “Vivado HLx 2017.2: All OS installer Single-File Download”. It is a tarball that is 22Gigs, yes there was no typo – 22Gigs large.
Note: You have to be a registered user to download it.

Once the download is completed, untar the tarball, cd into the extracted directory, and execute the GUI installer.

# Confirm the file is valid by checking the md5 hash
# MD5 SUM Value: 958f190a089ad3f39d327d972c7dcf35
$ md5sum Xilinx_Vivado_SDK_2017.2_0616_1.tar.gz
# Once that is confirmed untar and install
$ tar -zxvf Xilinx_Vivado_SDK_2017.2_0616_1.tar.gz
$ cd Xilinx_Vivado_SDK_2017.2_0616_1
$ sudo ./xsetup

Agree to the terms of use and select “Vivado HL WebPACK Edition”. Next, tick also Xilinx Software Development Kit (SDK) on the next page, since it’s free and very useful.

Note: by default, Vivado is installed into the /opt/Xilinx/Vivado/2017.2 directory.

At the end of the installation, the license manager will ask for a license. The “Obtain a license” button in the license manager if that does not work, just go to Xilinx Licensing site directly and get a WebPACK license and install it.

Once done with the installation, we need to install the JTAG cable drivers that are needed for many purposes e.g. programming the hardware.

cd
 /opt/Xilinx/Vivado/2017.2/data/xicom/cable_drivers/lin64/install_script/install_drivers
sudo ./install_drivers

Now, change the ownership of the ~/.Xilinx directory so that you may use Vivado without superuser privilege:
sudo chown -hR $USER:$USER $HOME/.Xilinx/

Every time you want to fire up Vivado, remember to source the “settings” scripts to have the right environment variables:

source /opt/Xilinx/Vivado/2017.2/settings64.sh
source /opt/Xilinx/SDK/2017.2/settings64.sh

Lazy people like myself prefer to uncomplicate the complicated, to avoid executing the above commands each and everytime one needs to start Vivado – do the following.

echo "source /opt/Xilinx/Vivado/2017.2/settings64.sh" >> ~/.bashrc
echo "source /opt/Xilinx/SDK/2017.2/settings64.sh" >> ~/.bashrc
source ~/.bashrc		

When done, start-up Vivado from the command line:
vivado
or SDK:
xsdk

Quoting Raymond Hettinger, While hitting the podium and “There must be a better way!”

Create a new file called vivado.desktop

sudo vim /usr/share/applications/vivado.desktop
# Copy the contents to the file

[Desktop Entry]
Type=Application
Version=1.0
GenericName=Vivado
Name=Vivado
Comment=Vivado
TryExec=/opt/Xilinx/Vivado/2017.2/bin/vivado
Exec=/opt/Xilinx/Vivado/2017.2/bin/vivado
Icon=
Terminal=false
Categories=Education;System
StartupNotify=false
X-GNOME-Autostart-Delay=5

When done, log out-in in order to refresh the systems settings.

Vivado should be available from start-menu and can be copied to the desktop for future executions.

Advertisements

Docker: Remove all images and containers

Problem:

You use Docker, but working with it created lots of images and containers. You want to remove all of them to save disk space.

Solution:

Warning: This will destroy all your images and containers. It will not be possible to restore them!

Run those commands in a shell:
# Delete all containers
sudo docker rm $(docker ps -a -q)
# Delete all images
sudo docker rmi $(docker images -q)

This solution has be proposed by GitHub user @crosbymichael in this issue

Create a global git commit hook

Recently found out about these git hooks and they work flawlessly but my only worry was that I had to copy all my hooks over every repo such that I could use them, which was a pain sometimes.

Then started reading about this so called global git hooks, and found a fix.

Usually the default template library is found at /usr/share/git-core/templates and we are going to use that directory for all our hooks.

1. Enable git templates:

git config --global init.templatedir '/usr/share/git-core/templates/'

This tells git to copy everything in /usr/share/git-core/templates/ to your per-project .git/ directory when you run git init

2. Write your hooks in /usr/share/git-core/templates/hooks.

For example, here’s an update hook (located in /usr/share/git-core/templates/hooks/update):

#!/bin/sh
# Prevent pushing changes to master branch
if [ $USER != "mmphego" ];
then
  if [ "$1" == refs/heads/master ];
  then
    echo "Manual pushing to this repo is restricted"
    exit 1
  fi
fi

4. Make sure the hook is executable.

chmod a+x /usr/share/git-core/templates/hooks/update

5. Re-initialize git in each existing repo you’d like to use this in:

git init

NOTE if you already have a hook defined in your local git repo, this will not overwrite it.

Why am I getting ‘Errno(105): No buffer space available’ when subscribing to multicast addresses?

I have been experiencing multicast subscription when subscribing to more that 20 IP’s via smcroute and python socket module. After vigorous googling I finally found a fix.

Screenshot_2017-06-28_11-59-55.png

Linux OS, limit the number of multicast group memberships that a machine can belong to simultaneously. (A “multicast group membership” indicates that a machine is listening to messages for a specific multicast IP address. In other words, there is a limit on how many multicast IP addresses you can listen to.)

On Linux, in particular, the default limit is relatively small (only 20 on many standard kernels). However, this limit can be configured dynamically.

If you try to subscribe to too many multicast addresses at once, you may run into the error message below:

daemon error: Warn: ADD MEMBERSHIP failed; Errno(105): No buffer space available
22
daemon error: Warn: ADD MEMBERSHIP failed; Errno(105): No buffer space available
23
daemon error: Warn: ADD MEMBERSHIP failed; Errno(105): No buffer space available

The “Errno 105” in this message indicates that the errno value returned by the Linux network stack is 105, or ENOBUFS. This return value while adding a multicast address indicates that your machine is trying to be a member of too many multicast groups at the same time.

Network Tuning

Solution is to tune your kernel, backup your current sysclt.conf and replace contents with the ones below.

sudo vim /etc/sysctl.conf

# Bigger buffers (to make 40Gb more practical). These are maximums, but
# the default is unaffected.
net.core.wmem_max=268435456
net.core.rmem_max=268435456
net.core.netdev_max_backlog=10000

# Avoids problems with multicast traffic arriving on non-default interfaces
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

# Force IGMP v2 (required by CBF switch)
net.ipv4.conf.all.force_igmp_version=2
net.ipv4.conf.default.force_igmp_version=2

# Increase the ARP cache table
net.ipv4.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh1 = 1024

# Increase number of multicast groups permitted
net.ipv4.igmp_max_memberships = 1024

You can reload the configuration file by executing, sudo sysctl -p or by rebooting your system.