I'd use a
Teensy 4.0, and two of the SPI peripherals in slave mode, one for each of the data lines, clocked by the SPI SCK line.
I've verified it can sustain 25 Mbytes/sec (200 Mbit/s) over USB Serial, so it would be a quick thing to use Arduino+Teensyduino to create a sketch that reads those into buffers using DMA, with the main loop writing each buffer when full or timeout elapsed to the computer via USB Serial.
I don't know the maximum SPI slave clock frequency supported, but 33 MHz master SPI clock should not be a problem.
Sampling just the SCK and MOSI pins at a fixed frequency is a bit more work. You use a separate SPI peripheral for each signal line you want to sample, and use DMA to read them into a buffer. You connect their SCK lines together, and either make one master and the other slaves, or connect all of them to a PWM pin. (FlexPWM maxes out at 37.5MHz when running at 600 MHz, 33 MHz when running at 528 MHz; the SPI clock can go a bit higher but has fewer possible frequencies.) Each will use a DMA channel to read data into say a 504-byte buffer (so you have eight bytes to identify the channel and buffer, and still fit in a single USB 2.0 HS packet); if you use a SPI clock, then you may need one more DMA channel to write the same byte/word (doesn't matter what) to the SPI output to enable the clock. When a buffer is full, you update the DMA for the next buffer (in an ISR), and tell your main loop this buffer is ready to be sent.
The main loop just waits for buffers to complete, checks for incoming connections and for the userspace application closing the device (
Serial will evaluate to
true only when an application has the device open, at least in Linux), and sends each buffer in turn via
Serial.write(buffer, len); whenever
Serial.availableForWrite() >= len. Note that in both approaches above, the data is a sequence of bits in each packet, with different packets providing data for different channels. So do expect to include a short header (one to eight bytes) identifying where the bits are coming from.
For three sampled signals, I expect 60 Mbit/s each to be feasible; for two, 90 Mbit/s each. (This is
sustained indefinitely, as long as the receiver does not stall too much. I recommend against using Raspberry Pi's for this, as their USB hardware is wonky, and can drop packets without informing anything. Most other Linux SBCs (with either USB3, native SATA, or native PCIe interface) should be able to sustain this indefinitely to an SSD, using either PCIe, SATA, or a cheap USB3-to-SATA adapter like the JMicron ones. If you use Dual or Triple Serial, you can squeeze a bit more bandwidth, but then it is very important each USB packet has a sequence number as they do not necessarily arrive at the userspace program in the order they were sent, being separate "devices"; otherwise you cannot sync the different bit sequences. Dual/Triple Serial is especially useful if your machine is otherwise relatively idle, and you have two or more CPU cores. I do suggest using a C program with a separate thread for each USB Serial port.
For FX2LP, I do recommend taking a look at Sigrok and its
fx2lafv firmware. Alas, the existing cheap ones (<$10) use a 24 MHz clock.