138 8-bit DDS sine wave generator

138 : 8-bit DDS sine wave generator

Design render
  • Author: Abhinav Prasad, Steven O'Shea
  • Description: A simple direct digital synthesizer with 8-bit frequency control and external R-2R output
  • GitHub repository
  • Open in 3D viewer
  • Clock: 66000000 Hz

How it works

This project implements a basic 8-bit Direct Digital Synthesizer (DDS) that outputs a digitized sine wave with a user-defined frequency.

  • The user provides an 8-bit phase increment (phase_inc) via the ui_in[7:0] pins
  • A rising edge on uio_in[0] (load_freq) loads this value into DDS
  • If no load_freq trigger is applied, the DDS runs at a default low frequency (corresponding to phase_inc = 8'd1)

Internally, a phase accumulator adds phase_inc to a phase register on each clock cycle. The 8-bit output of the accumulator directly indexes a sine look-up table (LUT) with 256 entries. Each LUT value corresponds to a digtized amplitude sample of a sine wave. These values are sent to uo_out[7:0], which can be converted to an analog waveform using an external R-2R DAC.

The output frequency is given by the standard DDS formula:

f_out = (phase_inc / 2^N) * f_clk,

where,

  • phase_inc is the user-defined tuning word (8 bits)
  • N = 8 is the size of the phase accumulator (for this simplified implementation)
  • f_clk = 66 MHz is the system clock

This design is based on principles described in Analog Devices’ application note:

"Fundamentals of Direct Digital Synthesis (DDS)" — Analog Devices https://www.analog.com/media/en/training-seminars/tutorials/MT-085.pdf

How to test

  1. Connect an 8-bit DIP switch or microcontroller output to ui_in[7:0] to set the frequency
  2. Pulse uio_in[0] high momentarily to load the new value
  3. Connect uo_out[7;0] to an R-2R DAC to view the generated sine wave
  4. You can low pass filter the DAC output to generate a smooth wave

Example:

  • Phase increment = 8'b00000001 produces a wave of ~258 kHz
  • Phase increment = 8'b10000000 produces a wave of ~33 MHz (Nyquist limit)

External hardware

  • DIP switches or a microcontroller can be used to control the frequency (ui_in) and trigger (uio_in[0])
  • An 8-bit R-2R resistor ladder DAC is required to convert uo_out[7:0] into an analog sine waveform

IO

#InputOutputBidirectional
0phase bit 0sine amplitude bit 0load_freq trigger (active high)
1phase bit 1sine amplitude bit 1
2phase bit 2sine amplitude bit 2
3phase bit 3sine amplitude bit 3
4phase bit 4sine amplitude bit 4
5phase bit 5sine amplitude bit 5
6phase bit 6sine amplitude bit 6
7phase bit 7sine amplitude bit 7

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (Tiny Tapeout Factory Test) tt_um_oscillating_bones (Oscillating Bones) tt_um_tt_tinyQV (TinyQV - Crowdsourced Risc-V SoC) tt_um_rejunity_atari2600 (Atari 2600) tt_um_rejunity_lgn_mnist (LGN hand-written digit classifier (MNIST, 16x16 pixels)) tt_um_izh_neuron_lite (LIF Neuron) tt_um_blptrk_weaving01 (weaving in silicon #1) tt_um_rte_eink_driver (E-ink display driver) tt_um_bleeptrack_prism (Prism) tt_um_zerotoasic_logo_screensaver (VGA Screensaver with Zero to ASIC Logo) tt_um_kianV_rv32ima_uLinux_SoC (KianV uLinux SoC) tt_um_nefelimet_updown_cntr (3-bit up-down counter) tt_um_wokwi_434917577229968385 (LIF neuron) tt_um_wokwi_434917320361309185 (TinyTapeout 2025) tt_um_wokwi_434917171311441921 (MC first Wokwi) tt_um_wokwi_434917344830882817 ('') tt_um_wokwi_434918300941464577 (WowkiProject) tt_um_wokwi_434917453767462913 (Mini Calculator v1) tt_um_wokwi_434917219039482881 (and) tt_um_wokwi_434917025263649793 (DigOTA) tt_um_wokwi_434917044822739969 (TinyTapeoutWorkshop) tt_um_wokwi_434921821909078017 (and gate) tt_um_wokwi_434917167895180289 (Encoder) tt_um_wokwi_434917143298726913 (Chip design from Wokwi) tt_um_wokwi_434921804663145473 (Tapeout try) tt_um_wokwi_434917374201501697 (dummy) tt_um_wokwi_434917318393129985 (Tiny Tapeout Template Copy) tt_um_wokwi_434917632188986369 (Timo 1) tt_um_wokwi_434917842159020033 (And Gate) tt_um_wokwi_434917427319226369 (Tiny Tapeout Chip) tt_um_wokwi_434917260383792129 (Tiny Tapeout Workshop Project by Nick Figner) tt_um_wokwi_434917040492120065 (4 bit incrementer) tt_um_wokwi_434917990496885761 (Projekt) tt_um_wokwi_434917381796339713 (Nils Tinytapeout Proj) tt_um_wokwi_434917317189363713 (tinytapeoutchip) tt_um_wokwi_434917679388544001 (tiny tapeout chip) tt_um_wokwi_434917506576906241 (ToDo) tt_um_wokwi_434917139713644545 (in progress) tt_um_wokwi_434917382645687297 (numbers) tt_um_wokwi_434917816595781633 (number display) tt_um_wokwi_434918311072808961 (GG) tt_um_wokwi_434917362908337153 (noclue) tt_um_wokwi_434917682511205377 (Random) tt_um_wokwi_434925031692840961 (demo-tiny) tt_um_wokwi_434917760986646529 (Barans erster Template Design) tt_um_wokwi_434917419779963905 (Tapeout Test1) tt_um_wokwi_434917684709021697 (Tiny Tapeout Template Copy_Orion) tt_um_wokwi_434918956220790785 (Simple classification perceptron ) tt_um_wokwi_434918068909406209 (Tiny Tapeout) tt_um_parx (example-verilog) tt_um_wokwi_434917624377094145 (brostarscard) tt_um_urish_simon (Simon Says memory game) tt_um_emmk_riscv (ENSEIRB-MATMECA RISC-V ASIC) tt_um_abhinav8prasad_dds (8-bit DDS sine wave generator) tt_um_wokwi_436554456427191297 (OCDCpro TT key lock test design IHP) tt_um_wokwi_434391222509479937 (4-Bit Adder) tt_um_ihp_logo_screensaver (VGA Screensaver with the IHP Logo) tt_um_pqn (PQN Model with Verilog) tt_um_Xelef2000 (RNG) tt_um_gamepad_pmod_demo (Gamepad Pmod Demo) tt_um_anujic (Morse Code Trainer) tt_um_rodald_cpr (CRP - Custom Risc Processor) tt_um_alif_dual_unileak (LIF Neuron) tt_um_riscv_mini_ihp (RISC-V Mini IHP) tt_um_wokwi_434917200607612929 (test_design) tt_um_alif_single_dualleak (Simple LIF Neuron) tt_um_blptrk_weaving02 (weaving in silicon #2) tt_um_blptrk_weaving03 (weaving in silicon #3) tt_um_blptrk_weaving04 (weaving in silicon #3) tt_um_dumbrv_yliu_hashed (DUMBRV) tt_um_iz_neuron (IZH Neuron) tt_um_test_chip_pius (Verilog OR-Gate) tt_um_pwm_block (PWM_SPI) tt_um_2048_vga_game (2048 sliding tile puzzle game (VGA)) tt_um_dpi_adexp (AdExp DPI Neuron ) tt_um_urish_sic1 (SIC-1 8-bit SUBLEQ Single Instruction Computer) tt_um_cedrichirschi_sar (SAR ADC Controller) tt_um_htfab_yadge (Yet Another Diffraction Grating Experiment) tt_um_ds_comp_adc (Delta Sigma Comparator Based ADC) tt_um_tinytapeout_logo_screensaver (VGA Screensaver with Tiny Tapeout Logo) Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available Available