Alright, since I have not posted anything here in a while, here are some updates.
I have been doing quite a bit of work on the FPGA architecture to create a very powerful synthesizer platform. Just yesterday I tested a very simple DDS that played back a 1024 point sinewave from an FPGA block RAM at 250 MSa/sec with the phase accumulator set up for a 1 MHz output frequency. I only checked the direct DAC output as I do not have control over the front-end relays yet, so the output had quite a bit of 250 MHz noise on it from the DAC. Otherwise, the frequency and shape were accurate. This noise should be filtered out in the front end signal chain.
The plan I have right now is to instantiate 6 DDS engines inside the FPGA. Two will be basic DDS engines that can read from DRAM but do not support modulation. Two will be the same, but will support full rate (250 MSa/sec) AM and FM. The last two will be quadrature sine/cos DDS units with compressed tables (18 bit truncated phase = 256k entries, too big for block RAM without compression). The quadrature sine/cos DDS units will support full rate FM and I/Q AM. Then there will be some sort of routing network (crosspoint or collection of MUXes) to interconnect everything.
The DDS units will operate in 3 modes. One is with an internal memory addressed by the phase accumulator. This will support fixed-length waveforms (1024, 2048, 4096, or 8192 points, block RAM resources permitting) and the frequency will be determined by the phase accumulator rollover rate and can be used to upsample or downsample the waveform. The second two modes will output one sample per phase accumulator rollover, so the rollover rate determines the sample rate, not the repetition frequency. This can be used to upsample only to play back at a lower rate (no point skipping). The difference between these two modes is that one will use the internal buffer, and the other will stream from the DRAM, thus bypassing DRAM for short waveforms.
This architecture will allow for quite a bit of fun stuff. For example, you can trivially AM and FM modulate a sinewave or an arbitrary waveform with an arbitrary waveform. You can have one channel modulate the other channel, or add the two together. Or you can have two completely independent QAM modulators running with completely arbitrary inputs. I'm also going to look at getting a high bandwidth random number generator installed (Mersenne twister, if I can get it to run fast enough) and a uniform-to-normal converter so it is possible to output very wideband noise, or add noise to the output or to a modulating signal.