Skip to content

Project History

Milestones

The results that mark eras, pulled out of the full table below:

Date Milestone
11. March 2023 Design documentation received from Lasse Bockelie - the project becomes possible
April 2024 The whole CPU board compiles in Verilator for the first time
13. December 2024 The CPU executes microcode in Verilator: MACL runs, OPCOM answers over UART
7. July 2026 OPCOM boots on real hardware for the first time (Basys3)
13. July 2026 Instruction set validated: 13/13 INSTRUCTION-B areas pass vs ND-110 golden traces, self-test clean
19. July 2026 First CPU boot on FPGA silicon (Tang Nano 20K)
24. August 2026 SINTRAN III boots on the Tang Nano 20K - the operating system runs on real hardware, login and programs work
25. August 2026 SINTRAN III boots on the Nexys 4 DDR - second board, main memory in DDR2, timing-clean
26. August 2026 Both boards clocked up, both verified on silicon: Nexys deployed at 45.45 MHz (50 MHz also booted) and Tang at 20.25 MHz timing-clean, each with a 115200 console - up from 16.667/6.75 MHz and 9600 baud
31. August 2026 Nexys cache on silicon: all 8 CACHE-1X0-A00 tests pass; deployed cache-on at 33 MHz gives ~2.9x the throughput of 45 MHz cache-off on the same SINTRAN workload
1-2. September 2026 Board-independent TDV2200 terminal core: real box-drawing font (set 2, from RetroCore) embedded in font_rom.v, PS/2 keyboard - the console is the machine's own screen and keyboard, on the Nexys, MiSTer and MEGA65
2. September 2026 SINTRAN III boots on the MiSTer (DE10-Nano) - third board on real silicon, TDV2200 console, self-test green
2. September 2026 MEGA65 cores built for both revisions (R3 HyperRAM 13.33 MHz, R4/R5/R6 SDRAM 20 MHz), timing-clean, not yet run on a MEGA65; Release 2 (bitstreams-2026-09) ships the MEGA65 and MiSTer binaries

Full history

Compressed history of the work progress on the ND-120 recreation:

Date Area Description
11. March 2023 DOC Received Design Documentation from Lasse Bockelie
21. August 2023 SCHEM Logisim Drawings completed for DGA and DELILAH/CGA
03. December 2023 CPU Using Logisim drawings to start generate Verilog files for DGA and CGA
12. December 2023 CPU Starting to consolidate all information about PAL chips (PNG for PALASM code, OCR to TXT and write Verilog version of PAL code)
26. December 2023 SCHEM Logisim drawings of CPU Board 3202D completed
27. December 2023 CPU Using Logisim drawings to start generate Verilog files for CPU Board 3202D
11. January 2024 CPU Most PALASM code has been ported to Verilog
January-June 2024 CPU Adding support chips, refactoring and bugfixing. Adding tests and test results
April 2024 CPU Control store finished in Verilog (sheets 16, 18, 19, 20, 21, 22 and ACAL 17); the whole CPU board compiles in Verilator for the first time; microcode moved into block RAM as hex files; every inout split into separate IN and OUT ports so the design can be synthesised at all
May 2024 TEST Support-chip and PAL cleanup, first testbenches and recorded test results
June-November 2024 No work done
9. November 2024 CPU Starting up again after a long break. Cleaning up code, refactoring and testing. Connecting everything together.
November 2024 CPU Code standardised for synthesis: the s_ internal-signal convention, module and top-file renaming, and the first simulation harness for the whole 3202D board
20. November 2024 CPU Verilator - Microcode is loaded from ROM to DRAM. MACL microcode starts but fail on STACK operations, and fails on COND operations.
13. December 2024 CPU Verilator - Microcode MACL starts, CPU test code runs. OPCOM is initialized and communication over UART works.
29. Januar 2025 TEST Verilator - Testprogram 'INSTRUCTION-B.BPUN' (204384B 83.11.01) loads and starts. 7 out of 14 tests succeed.
January 2025 CPU First transcription errors caught by re-reading the schematics: swapped inputs in BRKDET and TBUF, and PAL 45001B's TEST pin wired to a dead net. BPUN programs can now be loaded from the command line
22. Mars 2025 DEV Verilator & C++ - Interface with ND BUS via BIF module to C connector. Added support for Papertape reader and Floppy PIO written in C++
1. June 2025 DOC Reverse engineered the ROM chips for the panel controller's with help of Ghidra
June 2025 CPU Signal-documentation sweep across the CGA, MIC, MMU and I/O modules, and the first debug probes (control store address trace, DEBUGFLAG)
November 2025 FPGA First Vivado campaign: latch analysis, latch-to-flip-flop phase 1, the first xc7a35t (Basys3) constraints, and compile-time RAM sizing that separates simulator memory from FPGA block RAM
March-April 2026 FPGA Basys3 bring-up: Vivado batch build and lint scripts, 16-LED / 7-segment / ILA debug infrastructure, combinational-loop and block-RAM-inference fixes, LATCH.v rerouted through sysclk, and the MASEL race experiment tried and reverted
7. July 2026 SILICON OPCOM boots on Basys3 hardware (tag fpga-opcom-working-basys3); FF-mode clock architecture fixes
11. July 2026 SILICON SD/FAT stack proven on Tang Nano 20K hardware (read+write); microcode analysis proves the self-test never touches memory parity -> packed 16-bit SDRAM storage (ND_SDRAM_PACK16): CPU keeps 4 MB, 4 MB freed for the disk cache
12. July 2026 FPGA Dual-toolchain Tang builds: OSS CAD Suite (yosys/nextpnr) primary, Gowin EDA backup; nextpnr closes the full 27/54 MHz clock target with >2x margin
13. July 2026 FPGA Basys3 SD-Pmod port; memory-backend speed validation vs the no-wait-state protocol for every board; Cmod A7-35T activated (first 27 MHz BRAM build + SRAM bridge plan)
13. July 2026 TEST Instruction validation campaign complete: 13/13 testable INSTRUCTION-B areas pass vs ND-110 golden traces; MACL self-test clean (STERR=0); two CPU transcription bugs found and fixed (MPY product low word, ROT/shift control)
14. July 2026 SILICON Board-independent ND120_CORE extracted from ND120_TOP; Tang Nano 20K boots the papertape from a real SD card - proven on silicon
15. July 2026 CPU RUN test area unblocked: Am2914 interrupt status fence made default, MOR (memory-out-of-range) wired to level 12; 29 new interrupt/trap gate-level testbenches
18. July 2026 SILICON Tang masked level-10 grant root cause: a stale-INTRQN panel pulse taken as a macro interrupt; fixed faithfully (IO_37 STAT3 from real panel activity) - Verilog/fpga/tang-nano-20k/ANALYSIS-cga-intr-masked-grant-root-cause.md
19. July 2026 SILICON First CPU boot on FPGA silicon (Tang Nano 20K) - WCS read-address transparent-latch fix
20. July 2026 DEV Portable C device cores (NDDeviceCore) added as a submodule; ND-BUS seam gate validates the C cores against the real ND_BUS_SLAVE.v in Verilator
23.-26. July 2026 DEV ND-BUS device campaign: floppy/SMD/DMA IOX conformance testbenches; DMA master validated against the real bus arbiter
27. July 2026 DEV Floppy boot (1560&) works in Verilator - FLOMON + TPE monitor load from a floppy image (DMA zero-word capture fix)
27. July 2026 TEST TPE CONFIGURATION D05 runs to NO ERRORS DETECTED in Verilator (trap-vector TVGEN_P2 muxIn_3, cache HIT gate, CUP fixes)
30. July 2026 SILICON PAL transcription audit vs the original PALASM: 8 equation fixes; PAGING test suite passes 11/11 on Tang silicon (MMU page-table fix in PAL 44306A)
31. July 2026 SILICON MOVEW APT-to-APT word-drop and double-trap phantom-vector-7 fixed; full INSTRUCTION multi-level run (levels 1-9) passes clean on Tang silicon
03.-04. August 2026 DEV SMD illegal-load and status-read conformance with real CHS->LBA mapping; ST506/8-inch Winchester disc controller written in RTL at IOX 500
04. August 2026 FPGA Parity is never stored on an FPGA target (computed on the read path instead); stale SDRAM bank map corrected
10. August 2026 DEV SD storage hub reworked: per-client ports instead of flat concatenations, per-client bus slices gated so a dropped one cannot hide, failure reasons carried out to each controller's status, sub-block writes served by read-modify-write
10. August 2026 CPU Sheet-20 control-store capture was missing, so TRA CS read 000000; CDLBD's own output was absent from the LBD wired-OR; ALD strap set to bootstrap-load the Winchester
11. August 2026 CPU PAL/sheet audit batch, eight fixes: parity could never be reported (sheets 43 and 46), the cache comparator was fed the wrong bus and the wrong tag bits (sheets 24 and 27), the PPN<->IDB transceiver outputs were ungated (sheet 28), the ND-bus data lines were not released on direction change (sheet 10), and the BANK/MWRITE idle condition was inverted (sheet 45)
11. August 2026 FPGA ND120_NO_CACHE compile-time cache removal - the machine reports the cache as disabled, matching the board's own SW1 switch
21. August 2026 FPGA Nexys 4 DDR board port added
22. August 2026 CPU IDB combinational ring cut - FIDBO is OUTMUX-only and the PCR readback is registered; BRAM inference for main RAM and sysclk edge-capture for the parity-error latches
23. August 2026 CPU Level-10 interrupt request was wired to BINPUT~ (sheet 5C)
24. August 2026 SILICON SINTRAN III boots on the Tang Nano 20K. The memory bank was decoded from the wrong side of the bus transceiver (ND3202D.v:533), so every DMA write landed in BANK0 and the CPU fetched a page nothing had written
24. August 2026 FPGA 42 storage seam nets were implicit 1-bit (declared below first use); EX3638 42 -> 0 and the disc-activity LEDs work. Winchester read cache re-enabled
24. August 2026 SILICON Clock variants added above the 6.75 MHz baseline: 13.5 MHz closes with 0 setup violations, 27 MHz runs SINTRAN and s3 but reports 1667 setup violations - fast and functional, not timing-clean
24. August 2026 TEST Regression guards for the bank decode (make test-bdbank) and for flip-flop mode on every board (make test-no-latches); board preflight.sh and a hard sim log-size cap
24. August 2026 SILICON Boot was disc-bound: the FAT chain was walked one card read per hop. Following it inside the streamed sector cut boot 168 -> 29.4 s and S3 cold start 235.8 -> 13.2 s
24. August 2026 SILICON SD write bit clock raised 2.7 -> 13.5 MHz. The 4-bit data bus was wired and pinned but left disabled - it does not reach the SINTRAN banner
25. August 2026 DOC Tang microSD slot wiring settled from the Sipeed schematic: all four data lines are routed, so a 4-bit failure is logic and not wiring
25. August 2026 FPGA Nexys 4 DDR main memory moved from 24 KB BRAM to the 128 MiB DDR2: MIG port wrapper, two-client arbiter (main memory + SD storage), sheet-49 backend with a BRAM cache whose miss freezes the control PALs (MEM_HOLD) to meet the no-wait-state deadline
25. August 2026 SILICON SINTRAN III boots on the Nexys 4 DDR. The DDR2 cache dropped its update when a late write strobe compared against the live tag RAM (address already drifted), leaving one stale cached word per boot - spin hangs, ERRFATALs and silent WAITs from the same bitstream. Fix: hit verdict latched at address-check. 7/7 boots to banner (~40 s), console login, timing-clean at 16.667 MHz
26. August 2026 TEST DDR2 arbiter hardened with a testbench that the old logic fails: ties alternate instead of starving the storage client, a watchdog flags a dead port (sticky, report-only - no invented completions), orphan responses are recorded instead of vanishing
26. August 2026 FPGA Nexys debug panel: tri-colour LEDs show DDR2/arbiter health (green healthy, red watchdog, blue orphan) and memory traffic; the four blanked 7-segment digits now show PIL, DDR2 bridge state and the health flags live (DEBUG-PANEL.md)
26. August 2026 FPGA Nexys clock-up campaign: ten post-route frequency probes found the wall - every step 25 to 45.45 MHz closes the default flow, 50 MHz needs phys_opt_design; one path family at every clock (WCS microcode BRAM through the full microcycle to the register-file clock-enables, routing-dominated); stale 80 ns crossing bounds fixed; per-run report battery added to build.tcl (fpga/nexys4ddr/timing.md)
26. August 2026 SILICON SINTRAN boots on the Nexys at 50 MHz, then deployed at 45.45 MHz with a 115200 console (3x/2.7x the 25-AUG clock). The 50 MHz closure proved fragile: changing one UART constant re-rolled placement from +0.007 to -0.210 ns. Console physical baud is the build constant alone - the microcode's 1988 BAUDV thumbwheel table tops out at 9600 and its value is stored but never times a bit
26. August 2026 SILICON Tang fast20 variant: SINTRAN boots at 20.25 MHz with a 115200 console, TIMING-CLEAN (TNS 0, Fmax 20.556 MHz) - the fastest clean Tang (3x the validated 6.75 MHz; the 27 MHz variant runs 32% past its own Fmax). New rPLL branch 40.5/20.25 MHz on a 648 MHz VCO
27. August 2026 TEST Both fast configurations soaked: 4 unattended SINTRAN hours each (Nexys 45.45 MHz, Tang fast20), 8/8 console probes; all four release bitstreams boot-checked on silicon. Same day: test backlog burned down (101 unregistered testbenches -> 0 unmeasured, 104 registered, memchain resolved as a stale expectation), make test green end to end for the first time since 21-AUG (328/328), and a Verilog CI added (registry + yosys netlist gates every push, Tang OSS bitstream on release tags)
27. August 2026 SILICON Nexys SD-card deployment works end to end: configure from the card, boot SINTRAN from the same card - no PC software. The bug: sd_reset was a constant, the card stayed in the SPI mode the board's config controller left it in (only a power cycle exits SPI mode), so every disc op after SD-config failed with FDISK error 3. Fix: a power-cycle controller (slot OFF 100 ms + 50 ms settle) triggered by configuration, reset, MACL and the machine's own system clear
31. August 2026 SILICON Nexys cache brought up on the board: all 8 CACHE-1X0-A00 tests pass after four single-input transcription fixes (PAL 44511A CWR latch + its pin-19 polarity, a dropped Am9150 used-bit write, a DGA EPANS data-window leak that alone caused 20062 test-1 errors). Deployed build runs cache ON at 33 MHz - ~2.9x the throughput of 45 MHz cache-off on the same SINTRAN workload
1-2. September 2026 FPGA Board-independent TDV2200 terminal core: 800x600 screen, PS/2 keyboard, console UART (7E1/8N1), the real TDV2200 box-drawing font (set 2, dumped from RetroCore) embedded in font_rom.v so every board carries the glyphs; wired on the Nexys with the physical keyboard (incl. the Left-arrow bridge fix). Console framing settled at 7E1 - the SC2661 sends one stop bit, so the earlier 7E2 in the docs was documentation only
2. September 2026 SILICON SINTRAN III boots on the MiSTer (DE10-Nano): the whole machine, 4 MB in the DE10-Nano SDRAM module, TDV2200 console on its own screen and keyboard, storage from the OSD; boot, CPU self-test (green G lamp), font and keyboard all confirmed
2. September 2026 FPGA MEGA65 cores built for both revisions on the MiSTer2MEGA65 framework (R3 HyperRAM 13.33 MHz / R4-R6 SDRAM 20 MHz), timing-clean, not yet run on hardware. Release 2 (bitstreams-2026-09) published with the MEGA65 and MiSTer binaries and per-board quickstarts

Retired documents

Plans, worklogs and handoffs whose work is finished were removed on 28-SEP-2026. Git history keeps their full text; this table says what each one was and where its still-useful facts went.

Document Dated What it was Facts now in
LATCH_ANALYSIS.md 7 Nov 2025 Inventory of the six latch kinds (F595, TTL_74373, AM29841, generic LATCH, PAL_44401B DAP, CGA_INTR LAA) and a plan to turn them into flip-flops Done as the dual latch/flip-flop build (USE_TRANSPARENT_LATCHES, FPGA_FF_MODE): Verilog/docs/build-defines.md, DEVELOPMENT.md "Build modes"
VIVADO_FIX_PLAN.md 7 Nov 2025 First Vivado campaign: synthesis failed on 3496 RAMB18 (35x the xc7a35t), 66 latch warnings, declaration order, port widths RAM sizing done in MEM_RAM_49.v (Verilog/readme.md "RAM Configuration"); Basys3 state in Verilog/fpga/basys3/README.md
verilog-code.md 2024 figures Module-by-module tour of the 2024 tree (75,511 lines in 259 files) The per-module docs in */circuit/doc/ and HARDWARE.md
Verilog/verilog-remove-latch.md 29 Mar 2026 Latch-to-flip-flop migration plan; phase 0 complete (dual mode, PAL_45001B stray-semicolon fix, sys_rst_n threaded to the PALs, latch_ff_compare.cpp) Why the flip-flop mode is safe: DEVELOPMENT.md "Build modes"; the defines: Verilog/docs/build-defines.md
Verilog/worklog-latch-refactor.md Mar-Apr 2026 Branch redo-idb worklog for LATCH.v: the edge-detect version stopped the LCS load at CSA o000231 (ALUCLK is held constant during the load), so the level-sensitive sysclk capture was kept The comment in Verilog/Shared/ndlib/LATCH.v
Verilog/fast-clock-design-ida.md Apr 2026 Idea only, never built: run the CPU on a slower clock than the latch-sampling clock to catch 1-sysclk enable pulses (MCLK, MACLK, ALUCLK) Overtaken - the boards run 20-45 MHz in flip-flop mode with one sysclk and clock-enables
Verilog/FPGA-BRINGUP-PLAN.md 3 Jul 2026 Basys3 bring-up plan on branch redo-idb (boot stuck in phase 3 at CSA 0x0425/0x0426; the "MASEL Variant F" experiment, a second try after the revert in 0e4be9d) The comparison method, the boot golden-model idea and the ILA capture notes: Verilog/sim/FPGA_DEBUG_RUNBOOK.md
Verilog/DELILAH-CPU/CGA_MIC/LDLCN_o000016_investigation.md 14 Apr 2026 LDLCN / o000016 PANVC dispatch check: LC loads o01 at the first PANVC dispatch in Verilator; MASEL "Variant F" sysclk stage Dispatch path and LC value: Verilog/docs/boot-golden-spec.md Phase 5; the analysis scripts: Verilog/sim/VCD_ANALYSIS_GUIDE.md last section; Variant F is in CGA_MIC_MASEL.v
Verilog/sim/IDB_ANALYSIS.md 6 Apr 2026 "Before" map of every IDB driver and reader, made ahead of the sysclk refactor The IDB as it is now: Verilog/docs/HANDOFF-cga-idb-ring-cut.md
Verilog/sim/HANDOFF-session-2026-07-22.md 22 Jul 2026 Session handoff: built the scriptable probe (nd120_probe), captured the real INSTRUCTION-B paging set-up (sim/tpe_paging.csv, never committed: identity page table, PON after the table is filled, VPN 63 -> PPN o77, PT 162000), added CPU_MMU_PT_29_replay_tb.v, fixed the probe's UART send pacing Verilog/sim/PROBE-README.md; the 177777 question is in Verilog/TODO.md
Verilog/sim/HANDOFF-csharp-paging-capture.md Jul 2026 Request to the C# ND-120 team for a reference capture of the TPE INSTRUCTION paging set-up, because every paged store to logical 177777 (the top page) read back 0 while the same store with paging off worked The open question is in Verilog/TODO.md
Verilog/floppyTester/PLAN-floppy-validation.md 20 Jul 2026 Floppy validation campaign, phases 0-6, goal a full 1560& boot Goal met 27 Jul 2026 (above); ground rules and ownership split in Verilog/floppyTester/CONFORMANCE.md; testbenches in Verilog/ND-BUS-DEVICES/FLOPPY-DMA/sim/
Verilog/tests/TESTBENCH-COVERAGE-CATALOG.md 31 Jul 2026 One-off coverage sweep (109 registered entries then) Generated Verilog/tests/TESTBENCH-CATALOGUE.md and UNTESTED-MODULES.txt (make catalog)
Verilog/tests/doc-examples/COLOR-STANDARDS.md - Byte-identical copy of Verilog/docs/COLOR-STANDARDS.md Verilog/docs/COLOR-STANDARDS.md
Verilog/sim/PROBE-DESIGN.md 22 Jul 2026 Design note for the probe, implemented Folded into Verilog/sim/PROBE-README.md

Area tags

Every entry carries one area tag. Choose it by where the result landed, not where the work happened: a PAL fix proven on a board is SILICON, the same fix proven only in Verilator is CPU. If a day produced two results in different areas, write two rows for that date rather than tagging one row twice.

The set is fixed. Do not invent new tags - if something genuinely does not fit, change this list deliberately.

Tag Covers
DOC Original design documentation, ROM dumps, reverse engineering of the paper and the chips
SCHEM Logisim-Evolution schematics
CPU CPU and board logic in Verilog, including the PAL conversions and the bug fixes, proven in simulation
DEV Peripherals and the ND bus: papertape, floppy, SMD disc, DMA, SD storage
TEST Verification: testbenches, instruction campaigns, regression gates
FPGA Synthesis, constraints, boards, toolchains, debug infrastructure
SILICON Proven working on real hardware