did that, took me a while to get it right because I wasn't very familiar with the pins, but then I had other issues...
namely, my waveforms were all distorted, which makes me believe I'm clocking it too slow or messing it up at some crucial point before that.
They're distorted because the digital data feeding your DACs is constantly moving. You need to capture the deserialized data at just the right moment and store it in another register to feed the DAC.
You need a 5-bit counter, but those are rare. The 74HC590 is an 8-bit synchronous counter. Just ignore the upper three bits.
Your oscillator always drives the clock of the counter. Also run the oscillator to an AND gate along with the counter output E. The output of the AND gate is your shift clock of 16 pulses, then a silent period of the same duration. That is the signal that goes to all shift register clock pins, both tx and rx.
The last thing you need to do at the TX end is generate the parallel load signal. I would use a 74HC138 decoder, but you can use a 4-bit comparator. You need to load when shifting is inactive, and that is when counter output E is low. I recommend against loading immediately before shifting starts, so lets have counter output D be low as well. Tie the other two inputs to counter outputs B and C, and compare them to High, though that's arbitrary.
At the receive end you need:
- A missing pulse detector watching the clock signal. I'll let you research this one. Timing target is for it's output to go high about 40 to 80% through the silent period of the clock stream.
- Two cascaded 8-bit serial in, parallel out shift registers. Same clock to both.
- Two 8-bit storage registers. When the missing pulse detector goes active, these take a snapshot of the output of the shift registers.
- Two 8-bit DACs. Tied to the outputs of the storage registers.
Note, the 74HC595 integrates both the shift and storage registers in a single package.