For a first, experiment, I connected it up to an Arduino Uno, with the top 6 bits on pins 8-13 (port B) and the bottom three on pins 5-7 (port D). It's fastest to drive the ports directly, rather than using digitalWrite. The code is below. It has multiple options in it: sampled triangle and sine waves, and a square wave, using a delay to get the frequency approximately right; and a version which drives the ports as fast as possible.
The results are remarkably good. Here are example triangle and sine waves at about 10kHz:
For square waves, they still look OK at 100kHz:
The fastest square (-ish) wave I could get was about 250kHz:
In the speed test version, I could get it up to around 2.63MHz, though of course the signal is nothing like a square wave at the point:
By ignoring the lower order bits on port D, I pushed it up to 4.17MHz, with the waveform looking not much different to above.
Note that this isn't a practical design for a real DAC. It works in these experiments because the scope doesn't put much load on it. In a real design, you would put some buffering such as an opamp on the output, and also use resistors with tighter tolerances and more exact values
Here's the code. XMOS version to follow in another post.