Skip to the content
PCBKitNew board
2 layers38.4 × 71.4 mmDvs, the printed circuit board in 3D

Digital Vinyl system implemented using System Verilog on Basys3 development board

Size
38.4 × 71.4 mm
Copper layers
2
Thickness
1.6 mm
Parts
51
Nets
50
Pads
149
Tracks, vias
167, 105
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
13 May 2026
Updated
14 Sep 2026

Overview

Dvs is an open-source printed circuit board by semitechen, from the semitechen/DVS_Basys3 repository on GitHub, published under the MIT licence. It is a 2-layer board of 38.4 × 71.4 mm with 51 parts on 50 nets, routed with 167 tracks and 105 vias.

Its parts include 36 resistors, 9 capacitors, 5 connectors and 1 IC. It belongs with the fPGA and programmable logic boards of this library.

README

README.md

🎧 Digital Vinyl System (DVS) on FPGA Basys 3

FPGA HDL Toolchain PCB Timing License: MIT

An autonomous, ultra-low-latency Digital Vinyl System (DVS) and lossless SD audio player implemented entirely in hardware on dual Digilent Basys 3 (Xilinx Artix-7) FPGA boards and custom analog front-end / R-2R DAC PCB shields.


🎬 Video Demonstration

Click the preview below to watch the complete hardware setup in action, demonstrating real-time scratch, pitch-shifting, backward playback, cueing, track selection, and autonomous QSPI Flash boot:

Digital Vinyl System FPGA Demonstration


📸 Hardware Gallery

Full Hardware Setup
Figure 1: Complete real-time test bench with analog turntable (Serato 1 kHz timecode vinyl), custom pre-amp/filter shield, Board A (Streamer), Board B (DAC Receiver), and audio output.

Custom PCB Preamp Angle 1 Custom PCB Preamp Angle 2
Figure 2: Custom AC-coupling pre-amplifier, active Sallen-Key low-pass filter, and 8-bit R-2R resistor ladder DAC PCB shield designed for Basys 3 Pmod headers.


📌 Project Overview & Motivation

Why Hardware DVS?

In modern DJing, Digital Vinyl Systems (DVS) bridge tactile analog turntables with digital music libraries. However, commercial DVS setups require:

  1. A laptop running resource-intensive software (Serato, Traktor, Rekordbox).
  2. Dedicated USB soundcards.
  3. Operating system audio buffers (introducing $5\text{--}20\text{ ms}$ of latency, audio dropouts, and CPU jitter).

The FPGA Solution

This project eliminates the computer entirely. By executing all timecode signal processing, quadrant phase decoding, flash memory DMA, rate modulation, and audio reconstruction directly in FPGA silicon at 100 MHz:

  • Sub-Microsecond Latency: From vinyl needle motion to DAC audio output in $< 5.0,\mu\text{s}$.
  • Zero Software Dependency: Autonomous non-volatile boot from onboard QSPI Flash.
  • Lossless Playback: Real-time variable-rate streaming of uncompressed 8-bit PCM audio ($44.1\text{ kHz}$) directly from FAT-less micro-SD sectors.
  • Audiophile Reconstruction: 16x oversampling engine with a 1st-order Noise Shaper ($1 - z^{-1}$) and Triangular Probability Density Function (TPDF) dither, dramatically suppressing resistor ladder quantization noise.

🏛️ System Architecture

The project employs a distributed Dual-Board FPGA Architecture linked by a dedicated 2,000,000 baud (2 Mbps) UART audio bus:

text
+---------------------------------------------------------------------------------------------------------+
|                                    BOARD A: TIME-CODE STREAMER & SD PLAYER                              |
|                                                                                                         |
|  [Turntable] ---> [Custom PCB Pre-amp] ---> [XADC (vauxp6/14)]                                          |
|                                                     |                                                   |
|                                            [xadc_interface]                                             |
|                                                     | x2t (12-bit L/R @ 100 kHz)                        |
|                                                     v                                                   |
|                                          [timecode_pos_tracker] <---> [led_pos_display] (16 LEDs)        |
|                                                     |                                                   |
|                                                     | t2p (Q4.12 Speed, Direction, Squelch)             |
|                                                     v                                                   |
|  [Micro-SD] <--- [sd_card_controller] <--- [sd_bram_bridge]                                            |
|                       (16.67 MHz SPI)               | b2f (512-byte Sector Writes)                      |
|                                                     v                                                   |
|                                              [audio_fifo] (1024-byte Dual-Port BRAM)                    |
|                                                     |                                                   |
|                                                     | f2p (Read FIFO Sample)                            |
|                                                     v                                                   |
|                                         [variable_speed_player] (NCO Phase Acc)                         |
|                                                     |                                                   |
|                                                     | p2u (8-bit PCM Sample Valid)                      |
|                                                     v                                                   |
|                                                [uart_tx] (2 Mbps Transmitter)                           |

🔬 Deep-Dive: Core DSP & Hardware Modules

1. Dual-Channel XADC & Dynamic DC Estimator (xadc_interface.sv)

  • Samples differential analog timecode inputs from Pmod JXADC (vauxp6/vauxn6 for Left, vauxp14/vauxn14 for Right).
  • A 32-bit fixed-point 1st-order IIR low-pass filter dynamically tracks and subtracts the DC bias offset ($\approx 0.6\text{ V}$ operating point), ensuring pure zero-centered AC timecode signals.

2. High-Sensitivity Squelch & 4x Quadrature Decoder (timecode_pos_tracker.sv)

  • Hysteresis Schmitt-Triggers: Dual digital Schmitt-triggers reject vinyl groove noise while tracking low-amplitude signals down to $16\text{ mV}$.
  • Envelope Squelch Gate: Computes signal envelope with fast attack and exponential decay. If the needle is lifted ($< 20\text{ mV}$), the audio player is instantly muted.
  • 4x Gray-Code State Machine: Decodes state transitions $((0,0) \to (0,1) \to (1,1) \to (1,0))$, generating 4 step pulses per $1\text{ kHz}$ timecode cycle ($11.025$ audio samples per step).
  • Sequential Multi-Cycle Divider: Measures clock cycles between pulses and executes an iterative 16-cycle restoring division ($102,400,000 / \Delta t$) to compute the exact speed factor in Q4.12 fixed-point ($16'\text{h}1000 = 1.0\times$) with zero combinational timing violations.

3. SPI SD Card Controller & BRAM Ring Buffer (sd_card_controller.sv, sd_bram_bridge.sv, audio_fifo.sv)

  • High-speed SPI master operating at 16.67 MHz (after 200 kHz CMD0/CMD8/ACMD41/CMD16 initialization).
  • Issues single-block read commands (CMD17) to fetch uncompressed 512-byte PCM audio sectors into a 1024-byte dual-port Block RAM FIFO (audio_fifo.sv), maintaining an autonomous prefetch waterlevel.

4. Numerically Controlled Oscillator (NCO) Player (variable_speed_player.sv)

  • A 32-bit phase accumulator driven by the formula: $$\Delta \text{Phase} = \frac{44100 \times 2^{32}}{100,000,000} \times \text{speed_factor}$$
  • Overflow pulses generate exact, cycle-accurate FIFO read requests, enabling continuous variable-speed pitch modulation from $0.01\times$ to $4.0\times$, forward and backward scratching.

5. 2 Mbps High-Speed Inter-Board UART (uart_tx.sv, uart_rx.sv)

  • Transmits 8-bit audio frames across Pmod JC1 (K17) at 2,000,000 baud ($50\text{ clock cycles per bit}$ at 100 MHz, $0.00%\text{ baud error}$).
  • Transmission time is only $5.0,\mu\text{s}$ per byte, allowing real-time sample transmission with zero FIFO buffering on Board B.
  • Includes a 200 ms watchdog on Board B that smoothly returns the DAC to mid-scale silence ($128 / 1.65\text{ V}$) if the communication cable is unplugged.

6. 16x Noise-Shaped DAC Engine (r2r_dac.sv)

  • 16x Oversampling: Interpolates $44.1\text{ kHz}$ PCM to $705.6\text{ kHz}$.
  • 1st-Order Noise Shaping: Implements a closed-loop error-feedback filter ($H(z) = 1 - z^{-1}$) shifting quantization noise into the inaudible ultrasonic spectrum ($> 50\text{ kHz}$).
  • TPDF Dither: Employs dual Galois Linear Feedback Shift Registers (LFSR) generating Triangular Probability Density Function dither to eliminate harmonic distortion and limit cycles.

📐 Custom PCB: Pre-Amplifier & R-2R DAC Shield

The project includes a custom 2-layer PCB shield designed in KiCad 8 that mounts directly onto the Basys 3 Pmod headers (pcb/ directory):

KiCad Schematic
Figure 3: KiCad Schematic showing dual-channel AC coupling, DC bias network, 2nd-order active Sallen-Key low-pass filter, and 8-bit R-2R resistor DAC ladder.

KiCad PCB Layout
Figure 4: KiCad 2-layer PCB layout with dedicated analog/digital ground separation and ultra-compact Pmod form-factor.


🎛️ Hardware Setup & Pinout Guide

Board A: Timecode Streamer (top_board_a_streamer)

FunctionBasys 3 PinHeader / Pin NameDescription
System ClockW5CLK100.00 MHz onboard oscillator
Global ResetU18BTNCPushbutton active-high synchronous reset
Track NextT18BTNUAdvance to next audio track
Track PrevU17BTNDReturn to previous audio track
Mode SwitchV17SW01 = DVS Vinyl Control, 0 = Standalone Auto-Play
Timecode L+ / L-J3 / K3Pmod JXADC Pin 1 / 7Left channel differential input (vauxp6/vauxn6)
Timecode R+ / R-L3 / M3Pmod JXADC Pin 2 / 8Right channel differential input (vauxp14/vauxn14)
SD SPI CSJ1Pmod JA Pin 1Micro-SD Card Chip Select (active-low)
SD SPI MISOL2Pmod JA Pin 2Micro-SD Master-In Slave-Out (pull-up enabled)
SD SPI MOSIJ2Pmod JA Pin 3Micro-SD Master-Out Slave-In
SD SPI SCKG2Pmod JA Pin 4Micro-SD SPI Clock (16.67 MHz)
UART Audio TXK17Pmod JC Pin 12 Mbps serial audio transmitter to Board B
Ground (GND)GNDPmod JC Pin 5/11Common ground reference line
Platter LEDsLED[12:0]Onboard LEDsOne-hot rotating vinyl position indicator
Squelch LEDLED13Onboard LEDNeedle presence indicator ($> 20\text{ mV}$)
Direction LEDLED14Onboard LED1 = Forward, 0 = Reverse scratch
Heartbeat LEDLED15Onboard LED100 MHz clock live blinker

Board B: DAC Output & VU-Meter (top_board_b_dac)

FunctionBasys 3 PinHeader / Pin NameDescription
System ClockW5CLK100.00 MHz onboard oscillator
Global ResetU18BTNCReset watchdog and DAC state
UART Audio RXK17Pmod JC Pin 12 Mbps serial audio receiver from Board A
Ground (GND)GNDPmod JC Pin 5/11Common ground reference line
DAC Bit 0..3G3, H2, K2, H1Pmod JA Pins 10, 9, 8, 7R-2R ladder lower nibble (dac[0..3])
DAC Bit 4..7M2, M1, N2, N1Pmod JXADC Pins 3, 9, 4, 10R-2R ladder upper nibble (dac[4..7])
VU-Meter LEDsLED[11:0]Onboard LEDs12-LED dynamic audio level bargraph
Watchdog LEDLED14Onboard LEDAudio stream activity monitor
Heartbeat LEDLED15Onboard LED100 MHz clock live blinker

⚡ Autonomous QSPI Flash Boot Setup

Both boards can run autonomously without a computer attached:

  1. Set Boot Jumpers: On both Basys 3 boards, locate the JP1 (MODE) jumper header and set the jumper block to QSPI (middle pin bridged to the top pin).
  2. Flash Bitstreams to SPI ROM:
    bash
    # Flash Board A (Timecode Streamer)
    ./tools/program_fpga.sh -t board_a -f -s <SERIAL_BOARD_A>
    
    # Flash Board B (DAC Engine)
    ./tools/program_fpga.sh -t board_b -f -s <SERIAL_BOARD_B>
  3. Connect Board A Pmod JC1 to Board B Pmod JC1, connect common GND, and power on both boards via any USB power supply.

📊 FPGA Resource Utilization & Timing Closure

Synthesized and implemented for Xilinx Artix-7 XC7A35T-1CPG236C in Vivado 2023.2:

ResourceAvailableBoard A (Streamer)Utilization ABoard B (DAC)Utilization B
Slice LUTs$20,800$9844.73%2481.19%
Slice Registers (FF)$41,600$1,1422.75%2860.69%
Block RAM Tile$50$1.53.00%0.00.00%
DSP48E1 Slices$90$11.11%00.00%
XADC Primitives$1$1100.00%00.00%
Bonded IOB Pins$106$2523.58%2624.53%
Global Clock BUFG$32$13.12%13.12%

Post-Route Timing Signoff (100.00 MHz System Clock)

Target ModuleWorst Negative Slack (WNS)Total Negative Slack (TNS)Worst Hold Slack (WHS)Status
top_board_a_streamer+0.278 ns0.000 ns+0.073 nsMET (0 Violations)
top_board_b_dac+0.504 ns0.000 ns+0.119 nsMET (0 Violations)
top_dvs_basys3 (Single)+0.312 ns0.000 ns+0.084 nsMET (0 Violations)

Build Quality Metric: 0 Errors, 0 Critical Warnings.


📂 Repository Directory Structure

text
DVS_Basys3/
├── doc/                            # Official course submission documents & PDF schematics
│   ├── lista_kontrolna_KJ_TJ_2026.docx
│   ├── raport_KJ_TJ_2026.docx
│   └── schemat.pdf
├── fpga/
│   ├── constraints/                # Dedicated XDC pinout constraints per board
│   │   ├── top_board_a_streamer.xdc
│   │   ├── top_board_b_dac.xdc
│   │   └── top_dvs_basys3.xdc
│   └── scripts/                    # Non-project mode Vivado build & program scripts
│       ├── generate_bitstream.tcl
│       ├── project_details.tcl
│       └── program_fpga.tcl
├── pcb/                            # KiCad 8 hardware project files
│   ├── dvs.kicad_pcb
│   ├── dvs.kicad_pro
│   └── dvs.kicad_sch
├── pictures/                       # High-resolution hardware & schematic photos
│   ├── full_hardware.jpeg
│   ├── custom_pcb_photo1.jpg
│   ├── custom_pcb_photo2.jpg
│   ├── schematic_kicad_screenshot.png
│   └── pcb_kicad_screenshot.png

🛠️ Quick Start & Build Instructions

1. Run Verification Simulations

Execute testbenches with Vivado xsim:

bash
./tools/run_simulation.sh timecode_pos_tracker
./tools/run_simulation.sh sd_card_controller
./tools/run_simulation.sh audio_fifo

2. Build Bitstreams

Generate bitstream and raw .bin files:

bash
# Build Board A (Streamer)
./tools/remote_build.sh board_a

# Build Board B (DAC Engine)
./tools/remote_build.sh board_b

# Build Single-Board Integrated Target
./tools/remote_build.sh integrated

3. Flash Audio Tracks to Micro-SD Card

Convert MP3/WAV tracks to raw 8-bit unsigned PCM ($44.1\text{ kHz}$ mono):

bash
# Convert track and write to SD sector
python3 tools/wav_to_sd.py my_track.wav --track 0 --disk /dev/diskN

👥 Authors & Academic Context

  • Kacper Jelonek (KJ) – Digital timecode processing engine, XADC analog front-end, SPI SD card bridge, NCO rate modulator, PCB hardware design.
  • Tomasz Jachymiak (TJ) – 16x noise-shaped R-2R DAC engine, high-speed UART inter-board communication bus, VU-meter visualization, audio conversion toolchain.

Course: Układy Elektroniczne Cyfrowe 2 (UEC2), AGH University of Krakow (AGH UST).
Supervisor: mgr inż. Piotr Kaczmarczyk (kaczmarczyk@agh.edu.pl).

Parts

51
QtyValueFootprintReferences
3210KResistor_SMD:R_0603_1608MetricR1, R2, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23 +16
310uFCapacitor_SMD:C_0603_1608MetricC2, C3, C7
20.1uCapacitor_SMD:C_0603_1608MetricC1, C9
210uFCapacitor_SMD:CP_Elec_6.3x5.4C6, C8
22.2KResistor_SMD:R_0603_1608MetricR24, R29
2AudioJack3_SwitchConnector_Audio:Jack_6.35mm_Neutrik_NMJ6HFD2-AU_HorizontalJ2, J5
2Conn_02x06_Odd_EvenConnector_PinSocket_2.54mm:PinSocket_2x06_P2.54mm_VerticalJ1, J3
11kResistor_SMD:R_0603_1608MetricR36
11nFCapacitor_SMD:C_0603_1608MetricC5
1470Resistor_SMD:R_0603_1608MetricR35
1470pFCapacitor_SMD:C_0603_1608MetricC4
1MCP6002-xSNPackage_SO:MSOP-8_3x3mm_P0.65mmU1
1SD_Card_ReceptacleConnector_Card:SD_Kyocera_145638009511859+J4

Questions

How big is the Dvs PCB?

It measures 38.4 × 71.4 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Dvs use?

51 parts. 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 Dvs KiCad files?

From the semitechen/DVS_Basys3 repository on GitHub, at the commit this page was made from: the board is pcb/dvs.kicad_pcb and its schematic pcb/dvs.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Dvs design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers216.9 × 86.8 mmSweepv2, the printed circuit board in 3D

    Sweepv2

    davidphilipbarr/Sweep

    Sweep - a small promicro based keyboard inspired by the Ferris.

    51 parts2.1k
  • 2 layers49.4 × 94.2 mmPin board 1, the printed circuit board in 3D

    Pin board 1

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    51 parts1.2k
  • 2 layers72 × 42 mmNRF24 jammer, the printed circuit board in 3D

    NRF24 jammer

    W0rthlessS0ul/nRF24_jammer

    The nRF24 jammer is a powerful tool that requires an ESP32 and configurable numbers of NRF24 modules to assemble.

    51 parts1kMIT
  • 2 layers170 × 162 mmSnowflake, the printed circuit board in 3D

    Snowflake

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    51 parts915
  • 2 layers33 × 50 mmESP32-bat monitor latch, the printed circuit board in 3D

    ESP32-bat monitor latch

    pcbreflux/espressif

    all espressif stuff will committed here

    51 parts608GPL-3.0
  • 2 layersTUSS4470 shield, the printed circuit board in 3D

    TUSS4470 shield

    Neumi/open_echo

    Open Source echo sounder / depth sounder / SONAR for bathymetry and research. Arduino based and compatible.

    51 parts530
  • 2 layers45.7 × 123.5 mmMASTER ARM PANEL, the printed circuit board in 3D

    MASTER ARM PANEL

    jrsteensen/OpenHornet

    OpenHornet 1:1 F/A-18C Simulator Repository

    51 parts431
  • 2 layers50.8 × 69.2 mmUikit, the printed circuit board in 3D

    Uikit

    vsfteam/vsf

    Versaloon Software Framework -- a tiny preemptive-capable event-driven incremental software framework for embedded systems

    51 parts341Apache-2.0