516 DJ8 8-bit CPU w/ DAC

516 : DJ8 8-bit CPU w/ DAC

Design render
  • Author: DaveX
  • Description: DJ8 8-bit CPU with parallel Flash / RAM interface and 8-bit R-2R DAC
  • GitHub repository
  • Clock: 2000000 Hz

How it works

DJ8 is a 8-bit CPU featuring:

  • 8 x 8-bit register file
  • 3-4 cycles per instruction
  • 15-bit address bus
  • 8-bit data bus
  • 8-bit DAC based on Tiny Tapeout Analog R2R DAC
  • Built-in 256-bytes demo ROM with 2 demos

Other implementations:

Memory Map

From To Description
0x0000 0x7fff External memory
0x8000 0xffff Internal Test ROM (256 bytes, mirrored)
0xff00 0xff00 DAC_OUT (8-bit unsigned, write-only)
External memory map if using the recommended setup (see pinout)
From To Description
0x2000 0x3fff External RAM (32 bytes)
0x4000 0x5fff External Flash ROM (16KB)

Registers

There are 8 general purposes 8-bit registers (A,B,C,D,E,F,G,H), two flag registers (CF, ZF), and 16-bit PC.

For memory addressing, 16-bit combined registers EF and GH are used.

At reset time, PC is set to 0x4000. All other registers are set to 0x80.

Instruction Set

For future compatibility, please set the don't care bits (?) to 0.

ALU reg, imm8: Immediate ALU operation
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 A A A D D D I I I I I I I I
  • A : ALU operation
    • 000: ADD: reg = reg + imm8
    • 001: ADC: reg = reg + imm8 + CF
    • 010: SUBC: reg = reg - (imm8 + CF)
    • 011: MOVR: reg = reg
    • 100: XOR: reg = reg ^ imm8
    • 101: OR: reg = reg | imm8
    • 110: AND: reg = reg & imm8
    • 111: MOVI: reg = imm8
  • D : register
  • I : imm8
ALU dest, src, A {,shift}: ALU operation with src register & register A
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 A A A D D D S S S ? F F 0 0
  • A : ALU operation
    • 000: ADD: dest = src + A
    • 001: ADC: dest = src + A + CF
    • 010: SUBC: dest = src - (A + CF)
    • 011: MOVR: dest = src
    • 100: XOR: dest = src ^ A
    • 101: OR: dest = src | A
    • 110: AND: dest = src & A
    • 111: MOVI: dest = A
  • D : dest register
  • S : src register
  • F : final shift operation
    • 00: No shift
    • 01: Shift right logical (shr)
    • 10: Shift right arithmetic (sar)
ALU dest, [mem], A {,shift}: ALU operation with memory & register A
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 A A A D D D ? ? ? M F F 1 0
  • A : ALU operation
    • 000: ADD: dest = [mem] + A
    • 001: ADC: dest = [mem] + A + CF
    • 010: SUBC: dest = [mem] - (A + CF)
    • 011: MOVR: dest = [mem]
    • 100: XOR: dest = [mem] ^ A
    • 101: OR: dest = [mem] | A
    • 110: AND: dest = [mem] & A
    • 111: MOVI: dest = A
  • D : dest register
  • M: memory mode
    • 0: [GH]
    • 1: [EF]
  • F : final shift operation
    • 00: No shift
    • 01: Shift right logical (shr)
    • 10: Shift right arithmetic (sar)
MOVR [mem], reg: Store content of register in memory
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 1 1 D D D ? ? ? M ? ? 0 1
  • D: register
  • M: memory mode
    • 0: [GH]
    • 1: [EF]
Jxx imm12: Conditional or unconditional jump to absolute address
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 J J I I I I I I I I I I I I
  • J: jmpcode
    • 01: Jump if zero (JZ)
    • 10: Jump if not zero (JNZ)
    • 11: Unconditional jump (JMP)
  • I: imm12
    • PC = (PC & 0xe000) | (imm12 << 1)
JMP GH: Unconditional jump to address GH
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Pinout

Due to TT07 IO constraints, pins are shared between Address bus LSB and Data bus OUT. It means that during memory write instructions, the address space is only 128 bytes.

Pins Standard mode During memory write execute+writeback cycles
ui[7..0] Data bus IN Data bus IN
uio[7..0] Address bus LSB (7..0) Data bus OUT
uo[6..0] Address bus MSB (14..8) Address bus MSB (14..8)
uo[7] Write Enable Write Enable
ua[0] DAC output DAC output

You can connect a 8KB parallel Flash ROM + 32b SRAM without external logic and use uo[6] for RAM OE# and uo[5] for Flash ROM OE#.

To get a bidirectional data bus (needed for SRAM), uio bus must be connected to ui bus with resistors. To be tested!

How to test

An internal test ROM with two demos is included for easy testing. Just select the corresponding DIP switches at reset time to start the demo (technically, a jmp GH instruction will be seen on the data bus thanks to the DIP switches values, with GH=0x8080 at reset).

Demo 1: Rotating LED indicator

SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8
0 0 0 0 0 0 1 0

No external hardware needed. This demo shows a rotating indicator on the 7-segment display. Its speed can be changed with DIP switches, the internal delay loop is entirely deactivated when all switches are reset.

Demo 2: Bytebeat Synthetizer

SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8
0 0 0 0 0 1 1 0

Modem handshakes sound like music to your hears? It's your lucky day! Become a bit-crunching DJ thanks to 256 lo-fi glitchy settings.

Connect ua[0] -> amp(TBD?) -> speaker. Play with the DIP switches to change the loop settings. Suggested frequency/amp/passives TBD.

External hardware

  • No external hardware for Demo 1
  • Speaker (+ amp?) for Demo 2
  • Otherwise: Parallel Flash ROM + optional SRAM

IO

#InputOutputBidirectional
0data in 0address out 8address out 0 / data out 0
1data in 1address out 9address out 1 / data out 1
2data in 2address out 10address out 2 / data out 2
3data in 3address out 11address out 3 / data out 3
4data in 4address out 12address out 4 / data out 4
5data in 5address out 13address out 5 / data out 5
6data in 6address out 14address out 6 / data out 6
7data in 7write enableaddress out 7 / data out 7

Analog pins

uaPCB PinInternal indexDescription
0B410DAC output

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Analog Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (TinyTapeout 7 Factory Test) tt_um_analog_factory_test (TT07 Analog Factory Test) tt_um_urish_charge_pump (Dickson Charge Pump) tt_um_adennen_inverter (Aron's analog buffer test) tt_um_rejunity_z80 (Zilog Z80) tt_um_kianv_bare_metal (KianV RISC-V RV32E Baremetal SoC) tt_um_macros77_subneg (SUBNEG CPU) tt_um_eater_8bit (Tiny Eater 8 Bit) tt_um_ender_clock (clock) tt_um_wokwi_397140982440144897 (7-Seg 'Tiny Tapeout' Display) tt_um_wokwi_397142450561071105 (Padlock) tt_um_Burrows_Katie (QIF Neuron) tt_um_vga_clock (VGA clock) tt_um_aidenfoxivey (CRC-8 CCITT) tt_um_PUF (Reversible logic based Ring-Oscillator Physically Unclonable Function (RO-PUF)) tt_um_devinatkin_dual_oscillator (dual oscillator) tt_um_urish_simon (Simon Says memory game) tt_um_ajstein_stopwatch (Stopwatch Project) tt_um_rnunes2311_12bit_sar_adc (12 bit SAR ADC) tt_um_DanielZhu123 (calculator) tt_um_wokwi_397268065185737729 (Mini Light Up Game) tt_um_toivoh_basilisc_2816 (Basilisc-2816) tt_um_MichaelBell_rle_vga (RLE Video Player) tt_um_wokwi_397774697322214401 (secret L) tt_um_ccattuto_charmatrix (Serial Character LED Matrix) tt_um_The_Chairman_send_receive (Send Receive) tt_um_mini_aie_2x2 (mini-aie-cgra) tt_um_twin_tee_opamp_osc (Twin Tee Sine Wave Generator) tt_um_brucemack_sb_mixer (Single Balanced Mixer) tt_um_revenantx86_tinytpu (TinyTPU) tt_um_chess (Chess) tt_um_vga_perlin (VGA Perlin Noise) tt_um_calonso88_74181 (ALU 74181) tt_um_tinytapeout_dvd_screensaver (DVD Screensaver with Tiny Tapeout Logo (Tiny VGA)) tt_um_TD4_Assy_KosugiSubaru (4bit_CPU_td4) tt_um_drburke3_top (FastMagnitudeComparator) tt_um_pongsagon_tiniest_gpu (Tiniest GPU) tt_um_jorga20j_prng (8 bit PRNG) tt_um_ejfogleman_smsdac8 (8-bit DEM R2R DAC) tt_um_ccattuto_conway (Conway's Terminal) tt_um_fp_mac (FP-8 MAC Module) tt_um_router (router) tt_um_serdes (SerDes) tt_um_rejunity_analog_dac_ay8913 (AY-8193 single channel DAC) tt_um_riscv_spi_wrapper (RISCV32I with spi wrapper) tt_um_mos_bandgap (MOS Bandgap) tt_um_shadow1229_vga_player (VGA player) tt_um_explorer (Explorer) tt_um_rtmc_top_jrpetrus (Real Time Motor Controller) tt_um_28add11_QOAdecode (QOA Decoder) tt_um_toivoh_basilisc_2816_cpu_OL2 (Basilisc-2816) tt_um_afasolino (integer to posit converter and adder ) tt_um_8bit_vector_compute_in_SRAM (8-bit Vector Compute-in-SRAM) tt_um_lfsr (LFSR) tt_um_tnt_diff_rx (TT07 Differential Receiver test) tt_um_urish_spell (SPELL) tt_um_underserved (underserved) tt_um_dpetrisko_ttdll (TTDLL) tt_um_mitssdd (co processor for precision farming) tt_um_wokwi_399192124046955521 (ECC_test1) tt_um_dusterthefirst_project (Communicate 433) tt_um_xeniarose_sha256 (tiny sha256) tt_um_njp_micro (MicroCode Multiplier) tt_um_VishalBingi_r2r_4b (4-bit R2R DAC) tt_um_lisa (LISA Microcontroller with TTLC) tt_um_template (TT7 Simple Clock) tt_um_seanyen0_SIMON (SIMON) tt_um_agurrier_mastermind (Mastermind) tt_um_KolosKoblasz_mixer (Gilbert Mixer) tt_um_Saitama225_comp (Analog comparator) tt_um_tt7_meonwara (TBD) tt_um_multiplier_mbm (Modified Booth Multiplier) tt_um_delay_line_tmng (Delay Line Time Multiplexed NAND Gate) tt_um_mandelbrot_accel (Mandelbrot Set Accelerator (32-bit IEEE 754)) tt_um_dvxf_dj8v_dac (DJ8 8-bit CPU w/ DAC) tt_um_obriensp_pll (PLL Playground) tt_um_unisnano (unisnano) tt_um_alfiero88_CurrentTrigger (Current Mode Trigger) tt_um_CktA_InstAmp (Instrumentation Amplifier for Electrocardiogram Signal Adquisition) tt_um_lcasimon_tdc (Analog TDC) tt_um_neural_network (Neural Network dinamic) tt_um_PS_PWM (Phase Shifted PWM Modulator) tt_um_litneet64_ro_puf (RO-based Physically Unclonable Function (PUF)) tt_um_wokwi_399163158804194305 (Digital Timer) tt_um_algofoogle_raybox_zero (raybox-zero TT07 edition) tt_um_wokwi_399336892246401025 (UART) tt_um_wokwi_399169514887574529 (Gaussian Blur) tt_um_maheredia (GPS signal generator) tt_um_pwm_elded (UACJ_PWM) tt_um_wokwi_399447152724198401 (8-Bit Register) tt_um_adonairc_dda (DDA solver for van der Pol oscillator) tt_um_6bitaddr (6 bit addr) tt_um_btflv_subleq (Subleq CPU with FRAM and UART) tt_um_emern_top (badGPU) tt_um_wokwi_399469995038350337 (dEFAULt 2hAC) tt_um_mixed_signal_pulse_gen (mixed_signal_pulse_gen) tt_um_maxluppe_digital_analog (All Digital DAC and Analog Comparators) tt_um_pyamnihc_dummy_counter (Dummy Counter) tt_um_wokwi_399488550855755777 (My 9-year-old son made an 8-bit counter chip) tt_um_toivoh_basilisc_2816_cpu_exp (Basilisc-2816 Experimental) tt_um_htfab_fprn (Field Programmable Resistor Network) tt_um_rejunity_ay8913 (Classic 8-bit era Programmable Sound Generator AY-3-8913) tt_um_maxluppe_NIST (Four NIST SP 800-22 tests implementation) tt_um_vga_snake (VGA Snake Game) tt_um_cm_1 (GDS counter-measures experiment 1) tt_um_nurirfansyah_alits02 (Analog Test Circuit ITS 2) tt_um_analog_rf_readout_circuit (RF_peripheral_circuits) tt_um_jleightcap (fractran-tt) tt_um_wokwi_399518371950068737 (Full-adder out of a kmap) tt_um_davidparent_hdl (PRBS Generator) tt_um_adia_psu_seq_test (Adiabatic PSU sequencer test) tt_um_spacecat_chan_john_pong_the_second (John Pong The Second) tt_um_rajum_iterativeMAC (Iterative MAC) tt_um_asinghani_tinywspr (TinyWSPR) tt_um_thatoddmailbox (DuckCPU) tt_um_rejunity_vga (VGA Checkers) tt_um_8bitadder (Ripple Carry Adder 8 bit) tt_um_vzayakov_top (Pong-VGA) tt_um_pa1mantri_cdc_fifo (Clock Domain Crossing FIFO) 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 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 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 Available Available Available Available Available