Despite playing with my miniSpartan3 board for quite a while, I’d never attempted to write my FPGA designs to the SPI flash on the board. This means that the FPGA board didn’t do anything until I deployed my design onto it manually - quite useless if you were using the board for a real project, and on power-on you needed it to go to work immediately.
Turns out though, it is fairly simple to do, as long as you have the larger XC3S200A variant with an Atmel AT45DB041D flash chip - that’s the only way I’ve been able to validate this method with. Here are the steps you need to follow.
First, you’ll need to use utilities from the xc3sprog project. You use this to deploy your designs anyway, so should be familiar with it. You will want to update to the latest version, and we need to grab a file from the source distribution.
The way this works is that we’ll program the xc3sa_vq100.bit file onto our FPGA. What this does is configures the FPGA to use the SPI flash pins in a way that can subsequently be programmed, by allowing the FPGA to forward the commands on to the flash. Just by luck, this bitfile is set up for the Spartan3 200A FPGA on the miniSpartan3 I have.
Once that step completes successfully, we will then re-run xc3sprog with our design .bit, this time with the -I command which lets it know we are programming the SPI flash though the fpga.
The two commands are:
An example output of writing my LED test projct:
C:\dev\xc3sprog>xc3sprog.exe -c ftdi xc3sa_vq100.bit XC3SPROG (c) 2004-2011 xc3sprog project $Rev$ OS: Windows Free software: If you contribute nothing, expect nothing! Feedback on success/failure/enhancement requests: http://sourceforge.net/mail/?group_id=170565 Check Sourceforge for updates: http://sourceforge.net/projects/xc3sprog/develop Libusb not found, expect failure Could not open FTDI device (using libftdi): usb_find_busses() failed Using FTD2XX, DNA is 0xb5513bdfa1138aff C:\dev\xc3sprog>xc3sprog.exe -c ftdi -I minispartan3_leds.bit XC3SPROG (c) 2004-2011 xc3sprog project $Rev$ OS: Windows Free software: If you contribute nothing, expect nothing! Feedback on success/failure/enhancement requests: http://sourceforge.net/mail/?group_id=170565 Check Sourceforge for updates: http://sourceforge.net/projects/xc3sprog/develop Libusb not found, expect failure Could not open FTDI device (using libftdi): usb_find_busses() failed Using FTD2XX, JEDEC: 1f 24 0x00 0x00 status: 9c Found Atmel Device, Device ID 0x2400: AT45DB041 Unique number: 108070284c00f8240000d424ffff2fff0c0cec2a6c0c6c9c105490ffffffffff fcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 264 bytes/page, 2048 pages = 540672 bytes total Verify: Success!
And that’s all you need! You should now be able to power cycle the miniSpartan3 board and see your design in action - in this case some FPGA counting LEDs.
The reason I’m writing this post is because I was asked for advice on this very topic, however for the smaller XC3S-50a FPGA variant of miniSpartan3. My miniSpartan3 is the larger one, and this procedure runs fine. I was able to build a version of the xc3sa_vq100.bit file used earlier for the smaller FPGA using the other sources in the xc3sprog repo, but sadly this got even more confusing - as the JEDEC id that was being forwarded during the second part of step was corrupt.
I tweeted out the other day:
Anyone got a miniSpartan3 board to hand with the smaller xc3s50a fpga? Got an odd problem with one and interested to know what flash chip is on your version. My xc3s200a one is working as intended, with an Atmel AT45DB041D spi flash.— Colin Riley đźŽ— (@domipheus) July 22, 2021
This is because the smaller miniSpartan3 board that was failing seems to have a different SPI flash with a completely different pinout - one which will not work here at all.
So yeah - if anyone has one of these boards, please tell me what flash chip you have! Quite puzzled by this one.
Thanks for reading. Any comments or questions can be directed to me on Twitter @domipheus.