The mBed-style USB mass storage is done by having another micro that would need to be programmed first.
Right, but I'd be willing to pay for such a thing in prepackaged form, if it existed.
Not sure I completely understand your needs down to the fine details... Do you need to have a a number of configurations stored and depending on the jumpers load a specific one? Or do you need to load just one image in it, depending on the configuration?
Just a single image, but it will of course need updating as bug fixes/feature enhancements/etc roll out.
I have an idea, how about you migrate to ... off-the-shelf FPGA daughterboard with very slick USB-based firmware loader?
))
Several reasons I want to replace this thing:
- Cost. This thing is really, really expensive compared to what we get out of it. We could also go down two FPGA size grades if we had any choice in the matter... which we don't with this dev board. (And before anyone goes there, this thing was chosen by my now-long-gone predecessor and we're locked in to it for now.)
- Form factor. Right now this daughterboard determines the final mechanical dimensions of the whole thing. We could shrink it significantly if we weren't so constrained.
- BOM simplification. I don't like having to maintain inventory of an expensive part not stocked at the usual distributors, and making sure we have one per assembly available, every time we build an assembly.
- Power. Its power circuitry is neither robust nor particuarly efficient. Also, there's a DDR2 memory onboard that we don't even use, which wastes about a watt.
- Fragility. The dev board is not particularly robust and we have already killed several due to both a complete lack of protection on the power input and a power connector that is trivially mated to the wrong thing, frying the entire board if your attention lapses for a moment.
- Miniaturization. Once we have an in-house FPGA design that's tested and known-good, next revision we can move it onto the mainboard and drop the daughterboard entirely. Then we can integrate and shrink things a lot, which matters for our (portable) device.
You can definitely do it! There's no need to fork out for the expensive Xilinx flash chips.
I wasn't planning on going that route unless it simplified the software dramatically, but they'd be well within our budget if they are the right choice.
Unfortunately, when you move from an FPGA dev board to making your own you have to read a LOT of documentation. In this case, I suggest you look at the Spartan 6 configuration guide (http://www.xilinx.com/support/documentation/user_guides/ug380.pdf)
I've already leafed through UG380 a couple of times, but haven't given it a serious readthrough yet. As I've said, I am most focused on keeping the software simple, and then the details of the hardware design will follow from that goal.
The SPI loader application is NOT documented (Xilinx doesn't really make it clear what's going on) and puts all the GPIO pins into an undocumented (note: not undefined) state. I think weak pullup. Make sure whatever you've got connected to the FPGA can survive that.[/li][/list]
Another really important thing to consider is what will happen to the IO pins during configuration. One of the FPGA pins has something to do with their unconfigured state. You may need to add external pullups/pulldowns to make sure nothing goes wonky. Especially if you're connected to something that could be dangerous!
I believe our COTS dev board does something similar during programming, so we should be OK there. (Also, there's nothing particularly fancy attached.) Still, always something to keep an eye on.
My final piece of advice: just pay for a proper JTAG programmer. It will save you a lot of pain. The Xilinx Platform Cable II is quite reasonable when you think about how much time you might save. The Digilent XUP programming cable (6003-410-011) may also do the trick.
Oh, we'll definitely be doing that once we move off of this bloody board! The Platform Cable is a fraction of the price of one of these things. I'll have no problem ordering one. Or two. Or three.
Anyway, thanks everyone for the pointers. I'm particularly grateful to hear the real-world experiences with iMPACT, as it sounds like it will do exactly what we really need. (Xilinx documentation, while good at describing details, isn't always good for choosing the
right way to do something given a particular use case.)