When generating an analog signal with a DAC, there are two things you need to worry about: bandwidth and signal-to-noise ratio.
An NTSC composite signal traditionally has 4.2 MHz of bandwidth. (This comes from RF, where the vestigial subband is below the signal and the FM audio is above it.) Per
Nyquist's theorem (NICK-vist), you really only
need to generate samples at twice that frequency, or 8.4 MHz. But it's a good idea to slightly oversample the signal so that the design of the analog filter after your DAC has a bit of
he-he-he-headroom. For algorithmic simplicity, you might want at an integer multiple of the color subcarrier, such as your 4*fc = 14.3 MHz or the NES's 6*fc = 21.5 MHz, but the exact multiplier might be based on the exact pixel counts that you're trying to generate. How many is that? Do you want 320 or 640 square pixels, or do you want something else?
So you have a 5-bit-per-channel input and a 6-bit output. If you maintain all the internal calculations at 8 bits per channel, you can probably (educated guess) generate a decent signal with a dither on the final stage before the 6-bit DAC.
As I understand it, here are the conceptual phases of NTSC signal generation:
- Matrix multiply each RGB pixel to get Y, R-Y, and B-Y
- Apply a low-pass filter to the Y, U, and V channels so that chroma and luma bleed into each other less. Luma bleeding into chroma causes fringing; chroma bleeding into luma causes dot crawl.
- Add framing signals (vsync, hsync, black level, and color burst)
- Apply quadrature amplitude modulation: multiply R-Y and B-Y by sine waves at fc to produce the U and V (or equivalently I and Q) components of the color subcarrier
- Add dither
- DAC
- Analog filter