Skip to the content
PCBKitNew board
2 layersArduino, the printed circuit board in 3D

Verilog clone of YM2149

Copper layers
2
Thickness
1.6 mm
Parts
7
Nets
51
Pads
92
Tracks, vias
43, 0
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
10 Nov 2018
Updated
25 Oct 2026

Overview

Arduino is an open-source printed circuit board by jotego, from the jotego/jt49 repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board with 7 parts on 51 nets, routed with 43 tracks and 0 vias.

It is built around the 74LS04PC. Its parts include 4 resistors and 1 IC. It belongs with the AVR (ATmega, ATtiny) boards of this library.

Main components

1

README

README.md

JT49 FPGA Clone of YM2149 hardware by Jose Tejada (@topapate)

You can show your appreciation through

  • Patreon, by supporting open source retro releases

YM2149 compatible Verilog core, with emphasis on FPGA implementation as part of JT12 in order to recreate the YM2203 part.

Documentation

Using JT49 in a git project

If you are using JT49 in a git project, the best way to add it to your project is:

  1. Optionally fork JT49's repository to your own GitHub account
  2. Add it as a submodule to your git project: git submodule add https://github.com/jotego/jt49.git
  3. Now you can refer to the RTL files in jt49/hdl

The advantages of a using a git submodule are:

  1. Your project contains a reference to a commit of the JT49 repository
  2. As long as you do not manually update the JT49 submodule, it will keep pointing to the same commit
  3. Each time you make a commit in your project, it will include a pointer to the JT49 commit used. So you will always know the JT49 that worked for you
  4. If JT49 is updated and you want to get the changes, simply update the submodule using git. The new JT49 commit used will be annotated in your project's next commit. So the history of your project will reflect that change too.
  5. JT49 files will be intact and you will use the files without altering them.

Usage

There are two top level files you can use:

  • jt49_bus: presents the expected AY-3-8910 interface
  • jt49: presents a simplified interface, ideal to embed. This is the one used by jt12

clk_en cannot be set to 1 for correct operation. The design assumes that there will be at least one empty clock cycle between every two clk_en high clock cycles.

Files for Simulation and Synthesis

When used inside a JTFRAME project, you can use the yaml file provided. If you are using this repository on its own, there is a qip for Intel Quartus available.

It is recommended to use this repository as a git submodule in your project.

Port Description jt49

NameDirectionWidthPurpose
rst_ninputactive-low asynchronous reset signal
clkinputclock
clk_eninputclock enable. It cannot be a permanent 1
addrinput4selects the register to access to
cs_ninputchip-select, active low
wr_ninputactive-low write signal
dininput8data to write to registers
selinputinput clock is further divided by 2 when low
doutoutput8data read from registers. Updated when cs_n is low
soundoutput10Unsigned combined output of the three channels
Aoutput8Unsigned output of channel A
Boutput8Unsigned output of channel B
Coutput8Unsigned output of channel C

The module is not designed to be used at full clk speed. The clock enable input signal should divide the clock at least by two. This is needed because the volume LUT is shared for all three channels and the pipeline does not include wait states for the LUT as wait states happen naturally when clk_en is used.

The ports of jt49_bus replace the CPU interface with that of the original AY-3-8910.

NameDirectionWidthPurpose
rst_ninputactive-low asynchronous reset signal
clkinputclock
clk_eninputclock enable. It cannot be a permanent 1
bdirinputbdir pin of AY-3-8910
bc1inputbc1 pin of AY-3-8910
dininput8data to write to registers
selinputinput clock is further divided by 2 when low
doutoutput8data read from registers. Updated when cs_n is low
soundoutput10Unsigned combined output of the three channels
Aoutput8Unsigned output of channel A
Boutput8Unsigned output of channel B
Coutput8Unsigned output of channel C
IOA_ininput8I/O port A, input side
IOA_inoutput8I/O port A, output side
IOB_ininput8I/O port B, input side
IOB_inoutput8I/O port B, output side

Comparison with AY-3-8910 Verilog Model

A simulation test bench of jt49 vs the AY-3-8910 model (available in the doc folder via a git submodule) is available in folder ver/comp. The simulation uses a simple text file to enter arbitrary commands (test_cmd). The command file is converted to hexadecimal by parser.awk and used in simulation. The following parameters were tested:

ItemComplianceRemarks
channel periodYesTested: 0, 1 and FFFF values
noise periodYesTested: 0, 7 and 1F values
envelope shapeYesTested all 16 shapes
envelope periodYesTested 0 and FFF values

Resistor Load Modelling

The YM2149 was used to measure the output circuitry. According to AY-3-8910 schematics, there are 16 NMOS devices for each channel. Depending on the amplitude settings, only one of them will be active. These numbers render values that agree with the datasheet and measurements:

  • Rload = 1 kOhm
  • Smallest Ron = 900 Ohm (for level=15)
  • Largest Roff = 3 MOhm (for level=0)
  • Scale factor from one MOS to the next = 1.55

Each output level is the combination of one MOS being on and the rest off, so they combine into a single impedance, which then forms a resistor divider with the load.

The output MOS will hold its impedance even if an extra 1V is added at the load resistor (reducing the MOS headroom)

Non Linear Effects

  • Channel mixing effects by short circuiting the outputs in AY-3-8910 are not modelled
  • Non linearity in YM2203 when shorting all outputs is modeled via parameter YM2203_LUMPED

Non linear effects depend on the way the chip is connected and its model. See the connection list.

Related Projects

Other sound chips from the same author

ChipRepository
YM2203, YM2612, YM2610JT12
YM2151JT51
YM3526JTOPL
YM2149JT49
sn76489anJT89
OKI 6295JT6295
OKI MSM5205JT5205
NEC uPN7759JT7759

Parts

7
QtyValueFootprintReferences
31kResistor_THT:R_Axial_DIN0411_L9.9mm_D3.6mm_P15.24mm_HorizontalR1, R2, R3
147kResistor_THT:R_Axial_DIN0411_L9.9mm_D3.6mm_P15.24mm_HorizontalR4
174LS04Package_DIP:DIP-14_W10.16mmU1
1Arduino_UNO_R2Module:Arduino_UNO_R2A1
1YM2203Package_DIP:DIP-40_W15.24mmYM1

Questions

What parts does the Arduino use?

7 parts, built around the 74LS04PC. 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 Arduino KiCad files?

From the jotego/jt49 repository on GitHub, at the commit this page was made from: the board is lab/kicad/arduino.kicad_pcb and its schematic lab/kicad/arduino.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Arduino design in my own project?

Its repository publishes it under the GPL-3.0 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 layers171.2 × 72.9 mmAmiga gfxcard old, the printed circuit board in 3D

    Amiga gfxcard old

    mntmn/amiga2000-gfxcard

    MNT VA2000, an Open Source Amiga 2/3/4000 Graphics Card (Zorro II/III), written in Verilog

    34 parts1k
  • 2 layers196.3 × 118.7 mmMotherboard, the printed circuit board in 3D

    Motherboard

    Redherring32/OpenTendo

    An Open-Source HardWare (OSHW) recreation of the original 1985 front-loading NES Motherboard

    100 parts860
  • 2 layers49.6 × 78.3 mmOdyssey, the printed circuit board in 3D

    Odyssey

    jotego/jtcores

    FPGA cores compatible with multiple arcade game machines and KiCAD schematics of arcade games. Working on MiSTer FPGA/Analogue Pocket

    24 parts346GPL-3.0
  • 2 layers237.5 × 102.9 mmInstruction, the printed circuit board in 3D

    Instruction

    jes/scamp-cpu

    A homebrew 16-bit CPU with a homebrew Unix-like-ish operating system.

    112 parts301Unlicense
  • 2 layers182.9 × 172.7 mmMulti, the printed circuit board in 3D

    Multi

    homebrew8088/8088-PC-Compatible

    8088 PC XT Compatible

    120 parts238GPL-3.0
  • 2 layers365.1 × 203.2 mmDIAG, the printed circuit board in 3D

    DIAG

    Nakazoto/CenturionComputer

    This is just a simple backup of all the files related to the Centurion that I have stored on my HD. The Wiki itself has far more in-depth information about the Centurion and it's individual cards.

    150 parts172
  • 2 layers135.3 × 106.7 mmAdlib, the printed circuit board in 3D

    Adlib

    schlae/adlib

    Reproduction AdLib Sound Card, OPL2, Circa 1990

    61 parts168
  • 2 layers370.8 × 298.5 mm8 Bit Computer, the printed circuit board in 3D

    8 Bit Computer

    The-Invent0r/8-bit-Computer-PCB

    These are the KiCAD files for my 8-Bit Computer.

    323 parts142