What do I need to learn for signal acquisition?


I’m interested in using FPGAs to acquire up to maybe a dozen signals around 1khz in parallel. So far I’ve been using arduino-type microcontrollers to poll i2c ADCs(*). But that gets messy quickly, because multiple arduino-type µcs need to talk to each other and I also need to send the data on its way to a network. And forget any signal analysis.

I have a background in Programming, but not a lot of EE. I began learning Verilog, but I’m not quite clear what I need to learn to progress with that project.

What would I need to learn to interface an FPGA with one or multiple I2C Busses (maybe SPI or I2S later)? Do I need to implement I2C in Verilog? Would I need to customize a processor core? And how do I learn how to do that? Or does all of this require multiple years of study in general?

(*) Yes, those ADCs have a continuous conversion mode, but that still means I need to ask them for the continuously converted values at roughly the right time. And putting them on the same bus with different addresses comes with separate issues, i2c multiplexers are probably even worse, considering I want to poll each chip at around 1khz without screwing up the timing too much.


Others will likely have different feedback for you but if it were me I’d look at SPI ADCs and an ARM microcontroller with a little more power than the typical AVR-based Arduino. SPI is a simpler protocol so there’s much less overhead than I2C, not to mention it’s way, way faster. 1kHz is not that fast. If you are just looking to move to FPGAs so you can get those signals ingested, you’re complicating your signal processing for yourself. You could try something like a Teensy 3.6: program it with your familiar Arduino libraries and environment, but it’s like 180 MHz and has FPU. Just my 2 cents.

One thing that wasn’t clear to me in your post: you mention multiple uCs. Is this a requirement of your system or is that what you ended up doing because you weren’t sure how to do it all with the resources of one? I’d definitely try to drop multiple processors unless you actually need it (e.g. distributed sensors placed very far apart or something).


Yes, I agree, SPI is quite low overhead. You can get a bunch of ADCs on an SPI bus with a separate Salve Select (SS) signal for each. The big advantage with FPGA is once you have one channel working. Scaling up to many channels should be easier without interactions between channels as all working in parallel.
Break the problem down. into small steps. Think early on about controllability and observability of a state machine and the data gathered. This will help a lot with debugging. But is actually a fair bit of work to start with. (Especially when getting used to the language, tools and practical steps.)
Initially design for a single channel and get the data out to whatever next stage you need.
Then expand for more channels.
Then look at what additional data processing can be done on the data. As the FPGA will be able to do quite a bit an all channels in parallel.


The comments on SPI are much appreciated. So far I’ve been using cheap ADS1115 modules, which offer I2C at 860khz, and variants up to 3Khz. I’m interested in bioelectric signals, for example from those cheap ecg amplifier boards, those have a low-pass of 1khz. In general I am more interested in the amplitude precision (hence 16bit) than in high sampling rates. Through filtering and other DSP magic, I guess I could downsample a faster ADC with less bits to a higher precision.

I haven’t yet found SPI ADCs that I believe would be better for my application. And for my skills, because while I don’t fear soldering, but I’d much rather avoid custom board design and SMD soldering at the moment…

At the moment I got an ESP32 working with two ADS1115 each and data transmission over UDP. It took a while to figure out how to use the two cores the right way, but eventually it worked nicely.

I’ll keep an eye on FPGA technology anyway. It’s interesting to me.


I was reading your post and immediately thought of the Teensy’s as well, and SPI, so basically I strongly agree with everything dgsharp said. That is certainly a very doable way to go.

Look at the PJRC.com website, you will see a lot of data on the teensys, and look at the signal processing that Paul has already done with his Audio board and library for the Teensy 3.1, I think it also works with the 3.6, (I haven’t checked that,) but even if the hardware is not appropriate for you, the libraries are a very good starting point for FFT analysis etc.

Even if you are new to soldering, spend the money for a cheap temperature controlled soldering iron with replaceable tips. Not the big-tipped plug it right into the wall type that just tell you the wattage! I never go over 650F on a circuit board, and that only for desoldering, 600F is good for SMT soldering, no more than that. AllElectronics.com has their IR-50 and with the 2mm chisel tip, that would be a pretty good setup for surface mount soldering. For SMT, I use a Hakko T18-CF1 1mm Bevel Tip, but that’s a few levels up in price) Look online there are a lot of good videos on how to solder surface mount chips. Make sure you also get good quality solder wick (I prefer MG Chemical, but there are others, but don’t use All Electronics solder wick, it’s not terrible, but it’s worth paying for better) maybe one to two mm would be best for surface mount fixups. You should also have a magnifying glass and I’ve found no-clean liquid flux very helpful. An inexpensive small, nylon bristle paintbrush is helpful with the flux, or I use the Haiko brush flux applicator. The biggest mistake people make is using too much solder, but with the wick that can be fixed, I mess up with too much solder all the time, a light touch with the solder wick, and usually the pin is perfect… Look closely, at each pin and make sure they look bright (if not, there might not have been enough flux) and that the solder is not balled up, indicating a cold joint. Both issues easily fixed.

There is one trick I use that makes the wick even better. If you do get no-clean flux, brush a little on the wick wider than the area you are trying to clean up, it makes the wick that much better. But If cost is a concern or you don’t plan on doing more than this one project, then a good quality wick alone is probably fine.

Get decent quality breakout boards for the chips you are trying to use, SchmartBoard are good, but not the only ones, and plan on messing up one and you should be able to SMT solder with no worries. If the chips you want to work with are expensive, find some chip that is cheap with the same pin spacing, (doesn’t even have to be the same number of pins,) and practice on one or two of those. For more of a challenge, with the practice ones, see if you can get the chip back off, clean up the board and do another chip, (or the same one!) on the same board. (hint, use a heat gun or hair dryer to get the whole breakout board as hot as possible first, or even carefully heat the board in a flat bottom pan in the stove. Definitely try that only on throw away parts until you get the hang of it.

The main point is, don’t be afraid of soldering, don’t use too much solder, and practice a bit first…