Mass storage for FPGA systems

Mass storage – what do you mean?

In almost every FPGA based project we use internal embedded memories to store data or as a FIFO or as ROM/RAM memories. They are very fast (much faster than external ones), easy to use and very elastic (different write/read buses, different sizes, etc.). But even though the size of internal memories is getting bigger (ie. Xilinx Spartan 7 starting from 180 Kbits as Block RAMs and Xilinx Zynq Ultrascale+ with as much as 34.6 Mbits as Block RAMs and 36 Mbits as Ultra RAMs) it can be not enough. Also, these memories are volatile.  And what if we want to store data in non-volatile memories? Well, let’s check options of mass storage.

Types of mass storage

In fact, we can use almost any mass storage known in the computer world. So using Flash chip, MMC card, USB disk, SSD or NVMe drive can be done. The question is whether we want to use it as a peripheral in Linux on top of the embedded CPU or do we want to have a stand-alone solution.  The former is much easier – for example, PetaLinux for Xilinx devices contain drivers for all mentioned memories. Therefore it doesn’t require so much effort. But what if we don’t have embedded CPU/we want to store data directly from the source (ie. from ADCs) and we have high requirements regarding write/read speed? 

Fast – faster – NVMe

NVMe (NVM Express) is a standard which describes accessing non-volatile memory via PCI-Express bus. You might have it on your computer either in the form of PCI-Express card or M.2 format (pictures below).
Dmitry Nosachev [CC BY-SA 4.0 (] [CC BY-SA 4.0 (]

We are talking about write speed of 2700 MB/s and read speed of 3500 MB/s (based on the specification of Samsung 970 Pro) which makes a difference compared to SATA-3 disks where speeds are around 500 MB/s are the max. In some cases, even that speed is not enough. Saving raw data from 8 ADC channels at a rate of 4 Gb/s will require more than one disk – therefore we can run more of them in one FPGA. We need to keep in mind that these disks use PCI-E 3.0 bus and usually 4 lanes per disk. Therefore the FPGA needs to be able to serve it as a host. To evaluate possibilities of NVMe disk we recommend checking them on dev board with proper FPGA (ie. Xilinx Zynq UltraScale+ MPSoC ZCU106 Evaluation Kit) and FMC card as an interface for M.2 disks.

For more information about stand-alone NVMe Controller please contact us.