Skip to the content
PCBKitNew board
6 layers74 × 99.7 mmAwg1, the printed circuit board in 3D

Now your computer can make waves

Size
74 × 99.7 mm
Copper layers
6
Thickness
1.6 mm
Parts
235
Nets
311
Pads
949
Tracks, vias
1,356, 640
Pours
18
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
5 Apr 2025
Updated
17 May 2025

Overview

Awg1 is an open-source printed circuit board by Oscilllator, from the Oscilllator/waveform-generator repository on GitHub. It is a 6-layer board of 74 × 99.7 mm with 235 parts on 311 nets, routed with 1,356 tracks and 640 vias.

It is built around the TLV62569DRL, AD9744AR and W25Q128JVPIQ, with the 93LC56BT-I/OT, FT232H and X252012MMB4SI-24 among its other parts. Its parts include 90 resistors, 74 capacitors, 22 diodes, 17 transistors and 12 ICs. It belongs with the FPGA and CPLD boards of this library.

Main components

12

README

README.md

Why does it exist

The purpose of this waveform generator is to give your computer the ability to make waves. It should be thought of as a waveform interface for your computer, like a network interface or an audio interface. The computer streams waveforms continuously to the generator, the generator itself has no memory. I created this because I don't like the software interface to any other waveform generator I have used.

You use it like this:

python
import numpy as np
import awglib
awg = awglib.awg()
samples = np.sin(np.linspace(0, 2 * np.pi, 1000))
awg.send_volts(samples)

You can simply stream samples to it, or gate the sending of the samples on a trigger input. It also has two digital outputs which are embedded in the sample stream. You can use them like this:

python
samples = np.sin(np.linspace(0, 2 * np.pi, 1000))
d0 = samples > 0.8
d1 = samples < -0.5
awg.send_volts(samples, digital=[d0, d1])

Which then would look like this: image

This is useful for triggering your scope or other instruments.

Specifications

ParameterValue
Samples rate10 MSa/s
Rise/fall time50 ns
Max output current600 mA
Resolution14 bit
Digital outputs2

The device also has a 16 bit digital output bus for debugging the fpga, and 8 LED's. The digital outputs come straight from the FPGA and so have no drive strength to speak of. You won't blow up the FPGA if you 50R terminate them, though.

It looks like this:

image

Examples

Scrolling text

This example is examples/scrolling_text.py and demonstrates some of the benefits of having a streaming setup - there is a lot of memory on your main computer as compared to any reasonable waveform generator.

This whole gif is one single waveform of about ~500MB over the wire. Several passes are made over the text, one for each letter section. The persistence of vision within the oscilloscope stitches them together, producing whole letters. Once the whole text has been emitted the waveform is then re-emitted with the embedded digital trigger pulse sent with a slightly different time delay. This is easily done by simply concatenating the waveform to itself many times, attaching a shifted version of the trigger array each time. This wastes a lot of memory but was trivial to implement.

demo

Setup

From a new computer

Udev rules

The USB chip is a FT232, but I have programmed it to have a custom Vid and Pid, so that the linux kernel doesn't grab it.

This script sets up the udev rules so the device can be opened without root:

./ft/setup.sh

Python library

I install it like this from the root directory of the repository:

pip install -e .

That way the library is loaded from the repository on startup rather than being copied to an install directory. Ask your favourite AI what's right for you.

From a bare PCB

The EEPROM of the FT2332 needs to be programmed so that it will output in synchronous FIFO mode, and so that the default vendor ID and product ID is changed, preventing the linux kernel from recognising it.

./program_eeprom.sh

Repository contents

This repository contains the kicad files, RTL, and API to operate a waveform generator.

Hardware

I got the PCB's assembled with JLCPCB's 6 layer service with plated over vias, to make the routing of the FPGA BGA package easy. The device uses an FT232 as a USB->FIFO adapter, that currently streams exclusively in the PC->FT232 direction. Use of the device in this mode requires flashing the eeprom, for which a utility is also included.

RTL

The Flow of information is as follows:

PC -> FT232 -> ECP5 FPGA -> AD9744 DAC -> Amplifier

The RTL for the fpga is provided, which uses the excellent repository here to interface with the FT232. The AD9744 has a simple parallel interface, so that also makes things easy.

The simulation can be run as a unit test with ./run_tests.sh

API

The waveform generator is interfaces with in python, though I may port it to C at some point.

Bringup notes

This device was designed as a series of sub-boards. It started as a Colorlight DAC dev board and the amplifier stage. These were then merged into a Single PCB. There are various other notes on my lab notes page that detail other parts of the design process.

Parts

235
QtyValueFootprintReferences
28100nCapacitor_SMD:C_0402_1005MetricC201, C202, C204, C205, C206, C207, C209, C210, C211, C212, C213, C214, C215, C216, C217, C220 +12
1210kRResistor_SMD:R_0603_1608MetricR202, R212, R504, R505, R601, R701, R801, R901, R1001, R1101, R1201, R1301
12LEDDiode_SMD:D_0603_1608MetricD401, D402, D601, D701, D801, D901, D1001, D1101, D1201, D1301, D2001, D2002
100Resistor_SMD:R_0603_1608MetricR2003, R2004, R2023, R2024, R2031, R2032, R2034, R2035, R2036, R2037
100.1uCapacitor_SMD:C_0603_1608MetricC401, C402, C403, C405, C406, C407, C408, C409, C410, C411
910KResistor_SMD:R_0402_1005MetricR201, R203, R204, R205, R206, R208, R209, R210, R211
9Q_NMOS_Depletion_GSDPackage_TO_SOT_SMD:SOT-23Q201, Q601, Q701, Q801, Q901, Q1001, Q1101, Q1201, Q1301
9SS14Diode_SMD:D_SMAD1401, D1402, D1404, D1501, D1502, D1601, D1602, D1701, D1702
810uFCapacitor_SMD:C_0603_1608MetricC302, C306, C307, C308, C311, C312, C313, C314
8300Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR602, R702, R802, R902, R1002, R1102, R1202, R1302
84kResistor_SMD:R_0603_1608MetricR2013, R2014, R2015, R2016, R2017, R2018, R2019, R2020
610kResistor_SMD:R_0603_1608MetricR408, R409, R410, R411, R2021, R2022
64u7Capacitor_SMD:C_0402_1005MetricC203, C208, C218, C219, C227, C228
5100nFCapacitor_SMD:C_0603_1608MetricC2002, C2004, C2009, C2010, C2011
54.7uCapacitor_SMD:C_0603_1608MetricC404, C412, C413, C414, C415
5DNPCapacitor_SMD:C_0603_1608MetricC2001, C2003, C2007, C2008, R305
5IPEX-004Connector_Coaxial:SMA_Amphenol_132289_EdgeMountJ1401, J1501, J1601, J1701, J2005
40RResistor_SMD:R_0603_1608MetricR407, R501, R502, R503
4100RResistor_SMD:R_0603_1608MetricR1901, R1903, R1904, R1905
42SCR512RPackage_TO_SOT_SMD:SOT-23Q2001, Q2003, Q2004, Q2005
449.9RResistor_SMD:R_0603_1608MetricR1402, R1502, R1602, R1702
3100nFResistor_SMD:R_0603_1608MetricC501, C502, C503
310KResistor_SMD:R_0603_1608MetricR401, R403, R404
350Resistor_SMD:R_0603_1608MetricR2005, R2006, R2010
3BLM18HE152SN1DInductor_SMD:L_0603_1608MetricFB402, FB403, FB404
21.5Resistor_SMD:R_0603_1608MetricR2027, R2028
2100Resistor_SMD:R_0603_1608MetricR2025, R2026
210pForange_cram:C_0603_1608MetricC309, C310
22.2uHInductor_SMD:L_0805_2012MetricL302, L303
2225Resistor_SMD:R_0603_1608MetricR2007, R2008
222uFCapacitor_SMD:C_1206_3216MetricC2005, C2006
22SAR512RPackage_TO_SOT_SMD:SOT-23Q2002, Q2006
2MF-FSMF035X-2Inductor_SMD:L_0603_1608MetricFB401, FB405
2TLV62569DRLPackage_TO_SOT_SMD:SOT-563U303, U304
1100kCapacitor_SMD:C_0603_1608MetricR306
110kCapacitor_SMD:C_0603_1608MetricR304
1120kCapacitor_SMD:C_0603_1608MetricR307
112KResistor_SMD:R_0603_1608MetricR406
116MHzorange_cram:CDFN_3.2x2.5mm_XOX201
122RResistor_SMD:R_0402_1005MetricR207
12SAR572D3TLPackage_TO_SOT_SMD:TO-252-2Q2008
12SCR572D3TLPackage_TO_SOT_SMD:TO-252-2Q2007
12kResistor_SMD:R_0603_1608MetricR2029
12kRResistor_SMD:R_0603_1608MetricR506
12kRResistor_SMD:R_0402_1005MetricR405
13.3kResistor_SMD:R_0603_1608MetricR2009
1360kCapacitor_SMD:C_0603_1608MetricR308
147589-0001Connector_USB:USB_Micro-B_Molex_47346-0001J401
182kCapacitor_SMD:C_0603_1608MetricR309
18kResistor_SMD:R_0603_1608MetricR2030
193LC56BT-I/OTvs:SOT-23-6U401
1AD9744Package_SO:TSSOP-28_4.4x9.7mm_P0.65mmU501
1ADS7866/CI7476Package_TO_SOT_SMD:TSOT-23-6U502
1AP2127K-3.3vs:SOT-23-5U404
1Conn_01x02_PinConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ1802
1Conn_01x03_PinConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ1801
1Conn_02x16_Odd_EvenConnector_PinHeader_2.54mm:PinHeader_2x16_P2.54mm_VerticalJ201
1DNIResistor_SMD:R_0603_1608MetricR402
1ECP5U_12_CABGA256Package_BGA:BGA-256_14.0x14.0mm_Layout16x16_P0.8mm_Ball0.45mm_Pad0.32mm_NSMDU201
1FT232Hvs:QFN-48-1EP_8x8mm_P0.5mm_EP6.2x6.2mmU403
1JTAGjosh-connectors:STM_6_PIN_THT_StaggeredJ202
1LM7171xIMPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU2001
1NCP115-2.5Package_SON:Texas_X2SON-4_1x1mm_P0.65mmU302
1PTS810josh-buttons-switches:SW_SPST_PTS810SW201
1PinkLED_SMD:LED_0603_1608MetricD201
1TestPointTestPoint:TestPoint_Pad_D1.0mmTP401
1W25Q128JVPIQjosh-soic-sot-etc:WSON-8-1EP_6x5mm_P1.27mm_EP3.4x4.3mmU202
1X252012MMB4SIvs:Oscillator_SMD_Abracon_ASDMB-4Pin_2.5x2.0mmU402

Questions

How big is the Awg1 PCB?

It measures 74 × 99.7 mm and has 6 copper layers, 1.6 mm thick.

What parts does the Awg1 use?

235 parts, built around the TLV62569DRL, AD9744AR, W25Q128JVPIQ and 93LC56BT-I/OT. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Awg1 KiCad files?

From the Oscilllator/waveform-generator repository on GitHub, at the commit this page was made from: the board is hardware/awg2/awg1.kicad_pcb and its schematic hardware/awg2/AD9744.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Awg1 design in my own project?

Its repository states no licence, so its author keeps all rights: ask Oscilllator before reusing the design.

Similar boards

  • 4 layers52 × 27 mmEcp5.routed, the printed circuit board in 3D

    Ecp5.routed

    DaviBaum/loom

    112 parts
  • 4 layers52 × 27 mmEcp5-mini, the printed circuit board in 3D

    Ecp5-mini

    kitspace-test-repos/kicad6-file-collection

    111 partsMIT
  • 4 layers57 × 56.2 mmRp2040-decoder, the printed circuit board in 3D

    Rp2040-decoder

    mikesmitty/electronics-projects

    599 parts1
  • 4 layers100 × 100 mmFpga, the printed circuit board in 3D

    Fpga

    Atlantix-EDA/CopperForge

    Companion PCB Release & Manufacturing Tool for KiCad

    413 parts24MIT
  • 6 layers95 × 55 mmGlasgow, the printed circuit board in 3D

    Glasgow

    GlasgowEmbedded/glasgow

    Scots Army Knife for electronics

    782 parts2.2k0BSD
  • 4 layers22.9 × 61 mmPico ice, the printed circuit board in 3D

    Pico ice

    tinyvision-ai-inc/pico-ice

    Raspberry Pi PICO board + Lattice iCE40 FPGA's

    109 parts203MIT
  • 4 layers57 × 22.5 mmNB3 hindbrain, the printed circuit board in 3D

    NB3 hindbrain

    NoBlackBoxes/LastBlackBox

    A course for brains interested in brains (not tools interested in tools)

    147 parts69
  • 4 layers27.9 × 63.5 mmPico2-ice, the printed circuit board in 3D

    Pico2-ice

    tinyvision-ai-inc/pico2-ice

    Doc | Hardware | SDK | Schematic | Assembly | Discord

    124 parts60MIT