2nd order Sigma-Delta DAC

Details
Category: Uncategorized
Created: October 16, 2012
Updated: January 27, 2020
Language: VHDL
Other project properties
Development Status: Stable
WishBone compliant: No
WishBone version: n/a
License: Others
Description
Public domain code of the 2nd order Sigma-Delta DAC. Allows to produce reasonable quality audio signal from single digital ouput pin in the FPGA.
The resource consumption is very low (24-bit version of the DAC consumed 5% of slices in xc3s200).
Detailed description
This project implements 2nd order DAC, which I have created when I needed to add the voice output to one of my FPGA based systems.
The converter generates 1-bit digital signal on the dout output. You need to connect a simple RC lowpass filter to convert it into the analog signal.
There are directories containing two different implementations:
dsm2
allows to obtain higher clock frequency, and therefore higher oversampling ratio, but number of rising and falling slopes in time unit depends on signal value. Therefore you may experience nonlinear distortions if those two slopes are not symmetrical.
dsm3
The output of the DAC is updated once every three clock pulses. If there is a '1' on the DAC output, the sequence '110' is generated on the dout output. If there is a '0' on the DAC output, the sequence '100' is generated. Therefore we always have one rising slope and one falling slope generated in each DAC cycle. Unfortunately this implementation accepts lower clock frequencies, so the oversampling ratio is lower
Additionally in each directory there are two equivalent implementations.
The first one (dac_dsm2v.vhd, dac_dsm3v.vhd) uses the variables in the process (which maybe not acceptable for some synthesis tools).
The second one (dac_dsm2.vhd, dac_dsm3.vhd) is slightly less readable, but should be easier to synthesize.
The top entity (dac_dsm2_top.vhd, dac_dsm3_top.vhd) instantiates the DAC for synthesis (however before synthesis you should set the number of bits, setting the default value of the "nbits" generic).
For the dac_dsm2_top.vhd with Xilinx ISE 9.2 i've got the following results: Speed oriented synthesis for device xc3s200, package ft256, speed -5 resulted with 100MHz clock at 4% slice utilization (so you can get even 1000 oversampling ratio for 100kHz sampling frequency).
Synthesis of 24-bit version of the DAC resulted for the same chip in 5% slice utilization and also 100MHz fclk max.
To check DAC performance without putting it into real hardware, you can run "make" command in the appropriate directory (it requires free tools: ghdl, python and pylab). You'll see the spectra of the output signal (before low pass filtering) consisting of three sinusoids.