Writing a digital signal synthesis array driver in Go

About me

  • 2011: started web development1
  • 2013: wrote a websocket libary2
  • 2014: wrote my own online store 2,3
  • ...
  • 2015: wrote a OpenCV backend for retinal aneurysm detection 3
  • 2016: implemented some computer vision papers 4
  • 2018: wrote a device driver for a digital signal synthesis array driver 3

Many body quantum optics

Vacuum apparatus

apparatus

Ultracold Atoms Group at the University of Washington, USA.

Optical lattice

optical lattice

Atomic, Molecular, and Optical Phsyics Group at the University of Marryland, USA.

Acousto-optics

acousto-optic

Elent Technics

Digital signal synthesis

RF signals

Simple architecture

digital signal synthesis simple architecture

Synthesis

digital signal synthesis

Advanced architecture

digital signal synthesis advanced architecture

Clock generation

digital signal synthesis clock generation

Parameters

Parameter Related Register Register Bits Values
System Clock1 Multiplier (N) 7 100 MHz to 1 GHz
Frequency1,2 Frequency Tuning Word (FTW) 32 1 Hz to 420 MHz
Amplitude1,3 Amplitude Scale Factor (ASF) 14 0 to 100 %
Phase1 Phase Offset Word (POW) 16 0 to 2π

  • 1 for the AD9910
  • 2 10 MHz reference clock signal
  • 3 relative to full scale output

Connection

driver connection

Implementation

Requirements

  • can run on linux
  • reproducible builds
  • enforce code style
  • static types

Libraries

Architecture

driver architecture

Shell


              dds --select 1 const --frequency 100e6
              dds --select 1 sweep --param frequency --start 90e6 --stop 110e6
            

Python


              import control

              // constant frequency at 100% amplitude
              control.aod_h(frequency=100e6)

              // frequency sweep from 90e6 to 110e6
              control.aod_h(frequency=[90e6, 110e6])

              // frequency sweep from 90e6 to 110e6 with custom amplitude values
              control.aod_h(frequency=[90e6, 110e6], amplitude=[0.1, 0.4, 0.5, 1.0])
            
2D AOD projection

Summary

  • What were the challenges of this project?
  • Were there any Go relevant problems?
  • How was the library support?

Thank you

Link to repository