Hardware Specifications¶
This document details the hardware components, specifications, and requirements for the ND-120 CPU implementation.
Provenance note (02-AUG-2026): this document was drafted in September 2025. The component and status tables below have been re-checked against the RTL. The timing, power, environmental, mechanical, bus and expansion figures that stood further down were never traced back to the original Norsk Data documentation; they were removed on 28-SEP-2026 (still in git history).
System Overview¶
The ND-120 CPU is a 16-bit minicomputer processor originally designed by Norsk Data in 1988. This implementation recreates the complete system using modern HDL and FPGA technology.
Core Components¶
CPU Board 3202D¶
The main CPU board contains all essential processing components in a single-board design.
Major Integrated Circuits¶
| Component | Type | Function | Status |
|---|---|---|---|
| DELILAH CGA | Custom Gate Array | CPU execution engine | ✅ Implemented |
| NEC DGA | Custom Gate Array | Instruction decoder | ✅ Implemented |
| MC68705-U3 | 8-bit Microcontroller | Panel controller | ✅ ROM dumped & analyzed |
| SC2661 UART | Serial Communication | Console I/O | ✅ Implemented |
| AM29833A | Parity Bus Transceiver | Memory data path parity (sheet 46) | ✅ Implemented |
Memory Subsystem¶
| Component | Size | Type | Function | Status |
|---|---|---|---|---|
| Microcode ROM | 64KB | EPROM | Microinstruction storage | ✅ Dumped & implemented |
| Working Registers | 32×16-bit | Static RAM | CPU register file | ✅ Implemented |
| Cache Memory | Variable | Static RAM | MMU data cache | ✅ Implemented; all 8 CACHE-1X0-A00 tests pass on the Nexys 4 DDR (31-AUG-2026) |
| Main Memory | Up to 8MB | Dynamic RAM | System memory | ✅ Simulation (6MB) and SDRAM on Tang Nano 20K |
DELILAH CPU Gate Array (CGA)¶
Custom ASIC containing the main CPU execution logic.
Functional Units¶
| Unit | Function | Implementation |
|---|---|---|
| ALU | 16-bit arithmetic/logic operations | 74181-based design |
| MAC | Memory address calculation | Address generation unit |
| MIC | Microcode sequencing | Control store access |
| WRF | Working register file | 16×16-bit registers |
| INTR | Interrupt controller | Priority interrupt handling |
| TRAP | Exception handling | Trap vector processing |
| DCD | Instruction decode | Machine code to microcode |
Signal Interface¶
Input Signals: - MCLK: Master clock (system timing) - CD[15:0]: Command/Data bus - FIDB[15:0]: Fast Internal Data Bus - Interrupt Lines: BINT10-15, various error signals
Output Signals: - Address Buses: Memory and I/O addressing - Control Signals: Read/write, bus control - Status Flags: ALU conditions, CPU state
NEC Decoder Gate Array (DGA)¶
Custom ASIC for instruction decoding and microcode address generation.
Functions¶
- Instruction Decode: Machine language to microcode mapping
- Address Generation: Control store addressing
- Branch Logic: Conditional execution control
- Interrupt Vector: Interrupt address calculation
PAL Chips¶
Programmable Array Logic providing various control functions.
Implemented PALs¶
All PALs are converted from their PALASM listings: one file per chip in Verilog/PAL/, listings and scans in DesignDocuments/PAL-Code/, faithfulness check in Verilog/PAL/PROVENANCE.md.
Support Chips¶
Standard TTL Logic¶
| Chip Series | Function | Usage |
|---|---|---|
| 74xxx | Standard logic | Gates, flip-flops, counters |
| 74LSxxx | Low-power Schottky | High-speed logic |
| 74Sxxx | Schottky | Very high-speed logic |
Memory Controllers¶
| Controller | Type | Function |
|---|---|---|
| Dynamic RAM Controller | Custom logic | DRAM refresh and timing |
| Static RAM Controller | PAL-based | SRAM access control |
| ROM Controller | Address decode | EPROM access |
Panel Controller System¶
MC68705-U3 (CPU Board Controller)¶
Specifications: - Architecture: Motorola 6805 8-bit CPU - Package: 40-pin DIP - I/O Ports: 4× 8-bit ports - Memory: On-chip RAM and ROM - Timer: 8-bit timer with prescaler
Functions: - CPU board status monitoring - Power-on self-test control - Diagnostic interface - Front panel communication
MC68705-P3 (Front Panel Controller)¶
Specifications: - Architecture: Motorola 6805 8-bit CPU - Package: 28-pin DIP - I/O Ports: 2× 8-bit + 1× 4-bit ports - Memory: On-chip RAM and ROM - Timer: 8-bit timer with prescaler
Functions: - Switch scanning - LED/display control - Operator interface - System control commands
Memory Architecture¶
Microcode Memory¶
Organization:
- Total Size: 64KB, split low half + high half
- Word Width: 64 bits
- Technology: EPROM, AM27256 (the dumps used by the build are
AM27256_45132L.hex and AM27256_45133L.hex, microcode version L)
- Access Time: <150ns (unverified against the original data sheet)
The hex address map that stood here was internally inconsistent (it labelled
2KB ranges as 32KB) and is not reproduced. For the real control-store layout see
Verilog/mic-calculation.md and the microcode listing under Code/Microcode/.
Microcode Fields: see Verilog/nd120-plan.md for the 64-bit microword field table.
Main Memory¶
Dynamic RAM: - Technology: 4164/41256 series DRAM - Organization: 16-bit words - Capacity: Up to 8MB - Refresh: Every 2ms - Access Time: 150-200ns
Static RAM: - Technology: 6264/62256 series SRAM - Organization: 8-bit or 16-bit - Usage: Cache, buffers, register files - Access Time: <70ns
I/O Address Map¶
The ND-120 does not use a hex memory-mapped I/O window. Devices are reached with
the IOX instruction using octal device addresses (for example the floppy /
streamer controller at 1560). The hex table that stood here was never traced to
any Norsk Data source and has been removed rather than left as fact. The authoritative
per-device addresses are in the Norsk Data functional descriptions under
NorskData-Doc/, and in the device models under Verilog/ND-BUS-DEVICES/.
FPGA boards¶
Build flows live under Verilog/fpga/<board>/; the board list, status and limits are in Verilog/fpga/README.md.
Interfaces¶
Serial Interface (UART)¶
The original ND-120 hardware: - Standard: RS-232 compatible - Baud Rates: 110 to 19200 bps - Data Format: 7/8 bits, 1/2 stop bits, optional parity - Flow Control: XON/XOFF software control
What THIS Verilog actually implements: 115200 8N1, and no parity at all¶
Connect your terminal as 8 data bits, no parity, 1 stop bit. NOT 7E1.
The four lines above describe what the real SC2661 chip could be programmed to do. They are not
what Verilog/Shared/support/SC2661_UART.v does, and reading them as a terminal setting is how a
whole evening got lost on 30 August 2026 — a PC was set to 7E1 against this UART, the PC's driver
then validated a parity bit that is never sent, and every character it judged bad came back as a
question mark sprinkled through the text.
The mode registers that would select character length and parity are not implemented. From the file's own comment, line 108:
/*******************************************************************************
** Mode register 1 and 2 bits **
*******************************************************************************/
// Not implemented, we use constant 9600 8N1, or later 115200 8N1
The state machines agree with the comment rather than merely asserting it:
- Transmit:
IDLE → START_BIT → WRITE → STOP_BIT → DONE.TX_STATE_WRITEshifts outtxBitNumber0 through 7 (if (txBitNumber == 3'b111)), then goes straight toSTOP_BIT. - Receive:
IDLE → START_BIT → READ_WAIT → READ → STOP_BIT → DONE.RX_STATE_READshifts in 8 bits (if (rxBitNumber == 3'b111)), then goes straight toSTOP_BIT. - Neither machine has a parity state, and the word "parity" does not appear anywhere in the file. No parity bit is generated on transmit and none is checked on receive.
So the framing is fixed in hardware: 8 data bits, no parity, 1 stop bit. Only the baud rate is configurable, through the defines:
`define BOARD_CLK_FREQ 100_000_000 // 100 MHz (Basys3/Arty)
`define UART_BAUD_RATE 115_200 // clocks-per-bit = BOARD_CLK_FREQ / UART_BAUD_RATE
Why setting a terminal to 7E1 corrupts the text¶
A terminal told to expect even parity samples the 8th data bit in the parity position. For 7-bit ASCII that bit is 0, so any character with an odd number of set bits fails the check. What happens then is the terminal's business, and the two behave differently:
- PuTTY / TeraTerm and the FPGA's own VGA console show the text clean.
- A .NET
System.IO.Portsprogram substitutes a replacement byte for the failed character.SerialPort.ParityReplacedefaults to 63, which is?— so the failures arrive as question marks embedded in the data, looking exactly like characters the ND sent.
Measured on real hardware, same wire, same command:
| Reader | Framing | Bytes | ? |
|---|---|---|---|
| pyserial | 7E1 | 42 | 0 |
.NET, ParityReplace=63 (its default) |
7E1 | 48 | 6 |
.NET, ParityReplace=0 |
7E1 | 42 | 0 |
| pyserial / .NET | 8N1 | 42 | 0 |
Not fully explained: that model predicts a failure on nearly every odd-population character,
which would shred the text. In the capture only 6 of 42 bytes came back as ?, clustered around
the echo and the prompts. The framing mismatch is verified from this source file; the exact rate
and clustering are not, and pinning them down would need a controlled capture.