USB104 A7: Artix-7 FPGA Development Board - Review

Table of contents

RoadTest: USB104 A7: Artix-7 FPGA Development Board

Author: dimiterk

Creation date:

Evaluation Type: Development Boards & Tools

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: USB104A7 has the same FPGA as ARTY A7-100T also from Digilent but with less pins and no Ethernet.

What were the biggest problems encountered?: Lack of ZMOD selection means you have to design your own at the moment. Increased complexity due to requirements of ZMOD MCU.

Detailed Review:

This roadtest will take a look at the USB104-A7 Artix 7 FPGA board from Digilent. Many thanks to Element 14 (Randall Scasny and Digilent for providing the hardware for this review.

1. Quick introduction


The USB104 A7 comes with an Artix 7 series FPGA from Xilinx.  As one can deduce from the naming, this board comes in a PC/104 form factor.

However instead of the venerable 40 pin 0.1 inch connector , the stack-ability is offloaded to a ZMOD connector placed right at the center of the board

USB104A7 comes with 3 PMODS , a USB connection and emebdded JTAG functionality.


Digilent has done a good job providing descriptions for each of the hardware blocks as seen here:


The dev-board sports an industrial temperature range Artix  XC7A100T-1CSG324I  FPGA which comes in a speed grade -1.  This is a cost optimized version of the higher speed varieties -2 and -3.


For this road-test I planned to do 3 things:


a) Run the OOB design package examples

b) Implement a simple video processing application on USB104A7

c) Port Linux to the USB104A7 board


First some unpacking photos:


I imageimage


The board comes with a wall wart with both a European and a North American plug.  In addition , there is a USB Type A cable.


No ZMODs were provided with the package so I could not test one of the reference designs which tested the DSPI interface using a ADC ZMOD.


The board also contains a USB hub which connects both the FTDI chipset with a parallel interface to the FPGA . This is used for data transfer between PC and USB104A7. This is helpful for entry level HIL (Hardware in the loop) designs due to the low bandwidth. However the lack of a Python interface requires using the Adept software framework.


The initial idea was to interface with a SPI ADC using a PMOD however I wanted to explore the breadth of the  board even more so I tried to implement Linux and run the ADC driver from the userspace. This was only part done since while the Linux image works on QEMU emulator it does not run on the board at the moment.



2. Out of Box designs

The board comes with two example apps.



The board comes pre-loaded with a blinky app stored on the SPI flash. Pressing the button shows a message on the UART terminal.


This design example showcases the parallel data transfer between the FPGA and USB port using the FT232H IC. However the hub can only support USB2.0 speeds. This FW makes use of the ZMODs.

The OOB design configured the Microblaze as a MCU without a MMU unit. One other thing I noticed is that the default design for the qspi configures it without support for the primitives.


The other issue once can point out is that the MIG is fed directly from the clock pin. Using a clocking wizard and providing the MIG vwith clocks from it gives some weird clock violations.

as seen here:



3. Video application


Here we'll create a system with MicroBlaze and the MIG. Instead of an image sensor will use the TPG which will write to DDR Memory through the MIG.

A PMOD VGA was used to interface the board to a VGA monitor. The same design can be easily adapted if one is using a HDMI ZMOD.



The first step was to modify the OOB design by adding the following blocks:


a) Test pattern generator

b) timing controller

c) AXI in to Video out

d) clocking wizard




The TPG was configured for 640x480 resolution.


The video timing controller was configured for 640x480 resolution. A note here; If you are using the VTC with newer Vivado /Vitis versions you may have to enter the timing data manually.

AXI stream to Video out

The AXI stream to Video out was configured in slave mode.

Clocking Wizard

The design is configured so that the clocking wizard it is clocked with a 100Mhz clock from the MIG. The clocking wizard generates a VGA 25.2Mhz clock.

All the AXI peripherals including the MIG are clocked with the same 100Mhz clock from ui_clk. So basically there are only 3 clock domains 200Mhz, 100Mhz, and 25.2 Mhz.





Configuring the DDR3 MIG.






The first design example simply piped the TPG data to a VGA screen.

The second design was augmented with a VDMA , in order to write and read the incoming data to DDR3 memory.








The second design example augments the initial design with a VDMA. The VDMA is configured using 3 frames for 640x480 resolution using a 24bit AXI stream width.






The design example on the Github repo shows how to exercise the TPG to write various patterns on the monitor.


4. Porting Linux


To make the device capable of running Linux the Microbalze has to be modified with an MMU.

In addition a timer needs to be added.


After recompiling, the design xpm is exported.  The next step was using Vitis 2020.1 to export the design from the xsa generated by Vivado. Petalinux was then used to produce a linux image.

Before exporting the image I tested the DDR.

One issue is that Vitis 2020.1 has some changes from the 2019.1 SDK so I had to use the xsct command line for programming.


{gallery} My Gallery Title
















I tested the image on Qemu , however burning the image on the SPI NOR flash failed to work since the image is larger than QSPI. This will require taking another look at the QSPI memeory map to see how to make the lInux image fit.



AXI TFT display + text


The last thing I tried for this project was to use the AXI TFT IP. This module is useful when you want to write data to the screen via the memory mapped AXI bus. Here's I used the example provided to write a string to the screen and plot two lines.



In the past versions of Vivado there were a couple of ways to enable writing custom text on the VGA monitor. However Xilinx has started deprecating perfectly working IPs lately.

The On Screen Display (OSD) IP is one example that has been retired by Xilinx which at the moment recommends using the video mixer IP with custom code in order to write text on screen.

Another issue I found was that the latest version of Vitis removes the presets from the timing controller which requires one to manually enter the timing parameters.



Code for the designs is given on the Github repo as always:


Some further ideas for projects are:


a) Run a RISC-V CPU on the USB104A7 instead of Microblaze

b) Build a HDMI ZMOD for image processing

c) Test NVDLA accelerator with Microblaze




I would have preferred that this board had Ethernet as opposed to simple serial and USB2.0 connectivity

Also a USB 3 PHY would have been helpful. One could use the board for SDR applications that require large data transfers.

A USB C connector would have given the board that present vibe. Multiplexing both JTAG and DSPI (FTDI) on single USB PHY looks like a recipe for decreased bandwidth



5. Verdict

The good:

1. USB104 A7 comes in a compact PC/104 form factor.

2. DDR voltage operation can be configured via a switch

3. Embedded Digilent JTAG programmer

4. Industrial temp grade device.


The bad:

1. Low speed grade device for main FPGA makes timing closure difficult

2. Only 16MB of NOR flash which means little space for an embedded Linux solution.

3. USB Type A connector, no USB C

4. No Ethernet so you'll need a PMOD external PHY.

  • Yes, it's a USB type B. You're correct.  The issue with this is that it cannot power the FPGA for anything more than a simple design.

    The part is given on Digilents website. You can also read it via JTAG.

  • I've now had a detailed read, great work and now I've a few questions/observations if I may ask?


    • How do you know what speed grade the device used is? I looked everywhere I could not find a link between the datasheet and the device markings on my Artix-7.
    • I really liked the paragraphs about the MIG as I had trouble whenever I added one in my tests and also had an error about BACKBONE etc. There were a few steps in Vivado where I'd place just one IP block and it would automatically place another 10 blocks leaving me struggling when the auto configure went wrong. Anyway I learned a lot when that happened.
    • Your choice of using a PMOD-VGA was good, I wish I had purchased one as they look fun; and thank you for providing your code on Github as I would like to replicate what you did.
    • I think you may have the wrong USB type listed....the chunky square one is type-B ?
  • A nice review, I am also going to finish the review of the product as soon as I could.

  • I’m interested in FPGA but not really sure what I could do with one!

    I'd say, aim to build something you enjoy as you'll have determination then to keep going. The reason is you'll have to make many smaller snippets of projects along the way to develop the skills.


    Many of these FPGA's contain powerful ARM based processors and those that don't have a soft core (the Microblaze on Xilinx FPGA) that can be implemented. Doing that allows you to quickly build a bespoke microprocesor based system and utilise all the development boards peripherals and connectors. Digilent development boards often have a PMOD connector that allows small plug in boards to be added to your project. I'd suggest having a look at those modules and how you could combine some into a great starter project.


    Do you have a FPGA board? The Digilent Arty-S7 Workshop Review has a good number of examples on Element14 and IMO makes a good starting platform.

  • Nice roadtest and example app.  I’m interested in FPGA but not really sure what I could do with one!

  • I added an example of writing text on a VGA monitor. May be helpful if you need to visualize the data from the ZMOD. One can easily make a DIY scope  with limited bandwidth. Could have been different if there was a USB3 PHY in there.

  • A nice road test. I like how you added video using the Pmod VGA.


    I did not get any ADC/DAC ZMODs with this roadtest so can't test those.

    Don't worry. I've covered the Zmod in my road test. It's good when we all look at different aspects of the same device.

  • I did not get any ADC/DAC ZMODs with this roadtest so can't test those.

    I may re-try getting Linux to boot from NOR flash, it works on QEMU.  It takes quite a bit of time to compile even offline.

    The other idea was to get a RISCV CPU but that will be a separate project.

  • Nice road test report.


    Are you going to do any more testing of the device?



  • @14rbh Code is up, so you can easily re-create it.