3d rendering of bga array

Xilinx FPGA Development – ISE 14.7

Table of Contents


This article goes into the Xilinx ISE development and build environment for Xilinx’s Spartan6 and Spartan3 line of chips. I write a bit about why one would use the older ISE toolset and cover how one can get access to the toolset from the Xilinx installation materials.

Note, you will need a license from Xilinx to use the tools in question. Xilinx offers free licenses for their legacy tools.

Why ISE and not a newer toolset?

Legacy chips and older chips. It’s all about the legacy and older chips.

Looking at the current status of chips at the time of the writing of this article:

Legacy & EOL’d

  • Spartan3 (EOL’d)
    • EOL’d, however, still a LARGE amount of the chips out in the market and in various installed devices…

Cost Optimized

  • Spartan6
    • Considered Legacy for many situations as the Spartan7’s platform takes over. Still, a good deal of supply and inventory out there.
  • Spartan7
    • Baseline core for the new generation of FPGA from Xilinx.
  • Artix-7
  • Zynq-7000 series

Series 7 Generation

  • Spartan 7
  • Artix(spartan7 based)
  • Virtex(spartan7 based)
  • Kintex(spartan7 based)


  • Virtex(spartan7 based)
  • Kintex(spartan7 based)
  • Artix(ultrascale)
  • Kintex(ultrascale)


  • Artix(ultrascale+)
  • Kintex(ultrascale+)
  • Virtex(ultrascale+)

The Development Tools

And as with the chips that Xilinx supports, so goes their development environments. Newer software solutions Xilinx offers will generally not support EOL’d or other older products.

Current Xilinx Development Environments

  • Vitas AI
  • Vitas Unified
  • Vivado
  • Vivado ML (machine learning geared Vivado)

Legacy Xilinx Development Environments

  • ISE

Which Tool For The Job?

Vivado and Vitis

From Xilinx’s Support Response: https://www.xilinx.com/support/answers/53109.html:

  • “The Vivado tool has been created for the 7 Series devices (Virtex-7, Kintex-7, Artix-7, and Zynq-7000).”
  • “To support the Spartan-6 devices (or any non 7 Series devices), you will need to use the latest ISE design tools, which work best regardless of the complexity of the design.”

So, for anything Series 7, like the Virtex, Kintex, Artix, and ZYNQ, Vivado is the way to go.

Vitis further requires that the chip in question be a SoC with an onboard ARM processor and not just an FPGA.

Xilinx ISE

To support hardware from the Spartan-6 family, you will need to use Xilinx ISE 14.7’s Feb 2020 release. This version runs under Windows 10, however, is actually a virtual machine running the Linux version of ISE 14.7 with an expanded set of Spartan-6 chip support.

There is another version of ISE 14.7, released Oct 2013, which supports Spartan3 devices, though does not support all sizes of Spartan6 devices.

You can install one version or both versions, if you have need to support Spartan3 and Spartan6 devices.

All Spartan6 Devices

  • ISE 14.7 Feb 2020 Release
  • https://www.xilinx.com/member/forms/download/xef.html?filename=Xilinx_ISE_14.7_Win10_14.7_VM_0213_1.zip
  • 16GB ZIP file with 16GB OVA(posix tar) file with embedded 16GB VMDK(vmware disk image). So you will need at least 36-40GB of working space at any given time to access the files of interest. If you are just going to run the virtual machine like that. If you intend to install on your own custom Linux installation(docker,etc), you will need to add an additional 64GB on top to factor in for the raw disk image. Having at least 128GB available to allow for conversion is definitely recommended.

All Spartan3 and some Spartan6 Devices

Accessing the ISE 14.7 Feb 2020 Release Installation Medium on Linux/MacOSX System

  • Download the zip file from Xilinx’s download page
  • unzip the Xilinx_ISE_14.7_Win10_14.7_VM_0213_1.zip file.
  • You will be presented with a bunch of Windows support/installation files. Ignore these as you are only interested in the file: ova/14.7_VM.ova file.
  • Linux portions of commands are run inside of a Docker instance running Ubuntu 20.10

Accessing The Xilinx ISE Files Using Virtual Machine

The zip file downloaded from Xilinx will yield an ova file when unzipped.

Just unzip the zip file and import the ova file and import. This ova file can be imported by VMware’s Fusion/Workstation/Player and Oracle’s VirtualBox.

When the virtual machine finishes booting up, you can access the Xilinx ISE installation from the /opt/Xilinx folder. The usual rsync works great for this. The footprint is around 20GB.

Accessing The Xilinx ISE Files Without Virtual Machine

But let’s say you want to fire up ISE in a Docker environment or you just want access without loading any virtualization software. To do this, you will need to unwrap the downloaded file like an onion.

Extract the VMDK file

The 14.7_VM-disk001.vmdk is a VMware virtual disk. However, you should be able to access the contents

root@13ba6f57133c:/opt/ova# tar -tvf 14.7_VM.ova 
-rw-r----- vboxovf10/vbox_v5.2.30r130521 11422 2019-10-16 20:37 14.7_VM.ovf
-rw-rw---- vboxovf10/vbox_v5.2.30r130521 16902340608 2019-10-16 20:37 14.7_VM-disk001.vmdk
root@13ba6f57133c:/opt/ova# tar xf 14.7_VM.ova 14.7_VM-disk001.vmdk

Convert VMDK File Into Raw Image File

In order to access the contents of the VMDK file without using a virtual machine, you will need a few tools:

  • Qemu (Mac OS X & Linux)
  • MacFuse (Mac OS X only)
  • Ext4Fuse (Mac OS X only)
qemu-img convert -f vmdk -O raw 14.7_VM-disk001.vmdk ise14.7-disk.raw

Linux View And Mount

On Linux, you can use the partx and/or fdisk tools to examine the raw image file. You will see that it contains two partitions. The 58GB partition is the root filesystem. The 6GB partition is the swap partition. You _CAN_ skip this step, however, it is always good to verify that nothing has changed.

# In a Linux Docker Container
root@3019cd146e04:/opt/ova# partx -s ise14.7-disk.raw 
 1      2048 121634815 121632768  58G      0001f057-01
 2 121634816 134217727  12582912   6G      0001f057-02
# In a Linux Docker Container
root@3019cd146e04:/opt/ova# fdisk /opt/ova/ise14.7-disk.raw                  

Welcome to fdisk (util-linux 2.36).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /opt/ova/ise14.7-disk.raw: 64 GiB, 68719476736 bytes, 134217728 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0001f057

Device                     Boot     Start       End   Sectors Size Id Type
/opt/ova/ise14.7-disk.raw1 *         2048 121634815 121632768  58G 83 Linux
/opt/ova/ise14.7-disk.raw2      121634816 134217727  12582912   6G 82 Linux swap / Solaris

Command (m for help): 

Mounting will be accomplished via loopback mounting:

  • Note that the first partition starts at block 2048. The block size is 512 bytes. So the offset in bytes for the first partition is 1048576. If the start block differs for you, re-calculate accordingly.
mkdir -p /mnt/ISE_MEDIA
mount -o loop,offset=1048576 /opt/ova/ise14.7-disk.raw /mnt/ISE_MEDIA

This should now give you access to the filesystem. Skip to the next section.

Mac OS X View and Mount

Unfortunately, Mac OS X cannot mount the raw file directly. You will need to install MacFUSE as well as EXT4FUSE:

brew install --cask macfuse
brew install ext4fuse

You will need to reboot after installing MacFUSE. When installing ext4fuse, you might get a “ext4fuse disabled because of closed source MacFUSE”, etc. There is a good description on how to work around this issue:


# ext4fuse.rb from the page above. Copying here in the event the original URL vanishes.

class MacFuseRequirement < Requirement
  fatal true

  satisfy(build_env: false) { self.class.binary_mac_fuse_installed? }

  def self.binary_mac_fuse_installed?
    File.exist?("/usr/local/include/fuse/fuse.h") &&

  env do
    ENV.append_path "PKG_CONFIG_PATH", HOMEBREW_LIBRARY/"Homebrew/os/mac/pkgconfig/fuse"

    unless HOMEBREW_PREFIX.to_s == "/usr/local"
      ENV.append_path "HOMEBREW_LIBRARY_PATHS", "/usr/local/lib"
      ENV.append_path "HOMEBREW_INCLUDE_PATHS", "/usr/local/include/fuse"

  def message
    "macFUSE is required. Please run `brew install --cask macfuse` first."

class Ext4fuse < Formula
  desc "Read-only implementation of ext4 for FUSE"
  homepage "https://github.com/gerard/ext4fuse"
  url "https://github.com/gerard/ext4fuse/archive/v0.1.3.tar.gz"
  sha256 "550f1e152c4de7d4ea517ee1c708f57bfebb0856281c508511419db45aa3ca9f"
  license "GPL-2.0"
  head "https://github.com/gerard/ext4fuse.git"

  bottle do
    sha256 cellar: :any, catalina:    "446dde5e84b058966ead0cde5e38e9411f465732527f6decfa1c0dcdbd4abbef"
    sha256 cellar: :any, mojave:      "88c4918bf5218f99295e539fe4499152edb3b60b6659e44ddd68b22359f512ae"
    sha256 cellar: :any, high_sierra: "fc69c8993afd0ffc16a73c9c036ca8f83c77ac2a19b3237f76f9ccee8b30bbc9"
    sha256 cellar: :any, sierra:      "fe8bbe7cd5362f00ff06ef750926bf349d60563c20b0ecf212778631c8912ba2"
    sha256 cellar: :any, el_capitan:  "291047c821b7b205d85be853fb005510c6ab01bd4c2a2193c192299b6f049d35"
    sha256 cellar: :any, yosemite:    "b11f564b7e7c08af0b0a3e9854973d39809bf2d8a56014f4882772b2f7307ac1"

  depends_on "pkg-config" => :build

  on_macos do
    depends_on MacFuseRequirement => :build

  on_linux do
    depends_on "libfuse"

  def install
    system "make"
    bin.install "ext4fuse"
# Create the ext4fuse.rb from the content at the page listed above.
brew install --formula --build-from-source ./ext4fuse.rb

Once you have rebooted and allowed the extension to load in Preferences, you will now be able to mount the raw file.

# From Mac OS X
sudo  hdiutil attach -imagekey diskimage-class=CRawDiskImage -nomount /Users/wingtangwong/DOCKER/xilinx/runtime/opt/ova/ise14.7-disk.raw
mkdir -p /Volumes/ISE_MEDIA
sudo ext4fuse /dev/disk2s1 /Volumes/ISE_MEDIA

You should now have access to the contents of the filesystem:

Wings-MacBook-Pro:Xilinx root# ls -al /Volumes/ISE_MEDIA/
total 272
dr-xr-xr-x@  26 root  wheel   4096 Oct 16  2019 .
drwxr-xr-x    4 root  wheel    128 Jul 25 14:36 ..
dr-x------    3 root  wheel   4096 Jul 22  2016 .dbus
dr-xr-xr-x    2 root  wheel   4096 Aug 24  2016 bin
dr-xr-xr-x    4 root  wheel   4096 Dec  6  2017 boot
dr-xr-xr-x   10 root  wheel   4096 Jul 22  2016 cgroup
dr-xr-xr-x    2 root  wheel   4096 Jul 22  2016 dev
dr-xr-xr-x  124 root  wheel  12288 Oct 16  2019 etc
dr-xr-xr-x    3 root  wheel   4096 Jul 22  2016 home
dr-xr-xr-x   13 root  wheel   4096 Nov  9  2016 lib
dr-xr-xr-x   10 root  wheel  12288 Aug 24  2016 lib64
dr-x------    2 root  wheel  16384 Jul 22  2016 lost+found
dr-xr-xr-x    2 root  wheel   4096 Dec  6  2017 media
dr-xr-xr-x    2 root  wheel   4096 Feb 24  2013 misc
dr-xr-xr-x    2 root  wheel   4096 Nov  1  2011 mnt
dr-xr-xr-x    2 root  wheel   4096 Feb 24  2013 net
dr-xr-xr-x    6 root  wheel   4096 Sep 24  2019 opt
dr-xr-xr-x    2 root  wheel   4096 Jul 22  2016 proc
dr-xr-x---   27 root  wheel   4096 Aug 27  2019 root
dr-xr-xr-x    2 root  wheel  12288 Dec  6  2017 sbin
dr-xr-xr-x    2 root  wheel   4096 Jul 22  2016 selinux
dr-xr-xr-x    2 root  wheel   4096 Nov  1  2011 srv
dr-xr-xr-x    2 root  wheel   4096 Jul 22  2016 sys
dr-xr-xr-t   26 root  wheel   4096 Oct 16  2019 tmp
dr-xr-xr-x   13 root  wheel   4096 Jul 22  2016 usr
dr-xr-xr-x   22 root  wheel   4096 Jul 22  2016 var
Wings-MacBook-Pro:opt root# cd Xilinx/
Wings-MacBook-Pro:Xilinx root# ls
Wings-MacBook-Pro:Xilinx root# cd 14.7/
Wings-MacBook-Pro:14.7 root# ls -al
total 24
dr-xr-xr-x  3 500  500  4096 Sep 24  2019 .
dr-xr-xr-x  3 500  500  4096 Sep 24  2019 ..
dr-xr-xr-x  8 500  500  4096 Sep 24  2019 ISE_DS
Wings-MacBook-Pro:14.7 root# pwd
Wings-MacBook-Pro:14.7 root# ls -al
total 24
dr-xr-xr-x  3 500  500  4096 Sep 24  2019 .
dr-xr-xr-x  3 500  500  4096 Sep 24  2019 ..
dr-xr-xr-x  8 500  500  4096 Sep 24  2019 ISE_DS
Wings-MacBook-Pro:14.7 root# ls -al ISE_DS/
total 96
dr-xr-xr-x    8 500  500  4096 Sep 24  2019 .
dr-xr-xr-x    3 500  500  4096 Sep 24  2019 ..
dr-xr-xr-x    6 500  500  4096 Sep 24  2019 .xinstall
dr-xr-xr-x   14 500  500  4096 Sep 24  2019 EDK
dr-xr-xr-x  109 500  500  4096 Sep 25  2019 ISE
dr-xr-xr-x   12 500  500  4096 Sep 24  2019 PlanAhead
dr-xr-xr-x    3 500  500  4096 Sep 24  2019 SysGen
dr-xr-xr-x    9 500  500  4096 Sep 25  2019 common
-r--r--r--    1 500  500  1401 Sep 24  2019 settings32.csh
-r--r--r--    1 500  500  1300 Sep 24  2019 settings32.sh
-r--r--r--    1 500  500  1401 Sep 24  2019 settings64.csh
-r--r--r--    1 500  500  1300 Sep 24  2019 settings64.sh

Wings-MacBook-Pro:14.7 root# du -sh .
 20G	.

Copying Data To Your Target System

Now that you have access to the filesystem, you can copy the Xilinx ISE to your folder/system of choice. I will be installing mine into my Docker environment. You might be copying into your Docker/VM/BareMetal/etc. I’m using rsync:

Wings-MacBook-Pro:opt root# rsync -arv ./Xilinx/ /Users/wingtangwong/DOCKER/xilinx/runtime/opt/Xilinx/

Note, since the ext4fuse mount was performed under sudo, only root will be able to see the filesystem. Depending on your setup, this copy will take a while. It’s 20GB of data.

Note, I am copying the /opt/Xilinx folder into my own /opt/Xilinx folder. There are symlinks in the Xilinx folders that expects Xilinx to be installed where it is. This is consistent between different versions of the ISE.

sent 21041015678 bytes  received 5274542 bytes  18325024.14 bytes/sec
total size is 21021935480  speedup is 1.00
Wings-MacBook-Pro:opt root# 

Note, because the Feb 2020 and Oct 2013 ISE are both version 14.7, if you want to have both versions installed in the same environment, you will need to rename the folders to something else.

# Example paths

# Or something like that...

Cleaning Up Mounted Filesystem

When you are done copying, you can unmount the mounted image:

# Linux
umount /mnt/ISE_MEDIA
# Mac OS X
umount /Volumes/ISE_MEDIA
# If disk2 is what hdiutil attach assigned you...
hdiutil detach /dev/disk2

Next Up

This article is the start of my documentation for getting Xilinx’s legacy ISE 14.7 environment setup for Spartan6 development. In the next article, I go over the Docker container configuration for Xilinx ISE 14.7

About Post Author

Author: Wing Wong
Husband, Father, and all around technology tinkerer. :)

1 thought on “Xilinx FPGA Development – ISE 14.7

Comments are closed.