From OpenCores PDP-8 page:
Features
In this FPGA implementation, the PDP-8 CPU can be configured to emulate the instruction execution of a PDP-8 (Straight-8), PDP-8/S, PDP-8/S, PDP-8/I, PDP-8/L, PDP-8/E/F/M, PDP-8/A, HD-6100, or a HD-6120.
The CPU does not attempt to emulate the execution of any particular PDP-8 implementation. The clock rate is different, the number of clock cycles per instruction is different, and the bus implementation is different. The default is a PDP-8/A.
Just for fun, the CPU incorporates a single cycle multiplier and a single cycle barrel shifter (currently disabled).
Two VHDL Builds
MS8C 32K-Word Memory
The system includes 32K-Words of memory. Unlike normal RAM memory, the FPGA memory can be initialized at power-up. The memory is in this system is initialized as follows:
- RK8E Bootstrap program at location 0023
- BIN Loader at location 7626 (07627 ?)
- RIM Loader at 7756.
You can initialize the memory to all zeros if you are old-school and feel the need to use the front panel to toggle-in the boot loaders.
KC8E Front Panel
This device provides an interface to the front panel switches and LEDs that were present on the PDP-8/E front panel.
My PDP-8 Front Panel is supported in my build.
KE8 Extended Arithmetic Element
The PDP-8 Extended Arithmetic Element (EAE) provides optional advanced mathematics capabilities. The EAE is used to perform 23-bit floating-point and 24-bit integer operations. The EAE provides 24-bit add, subtract, load, store, multiply, divide, normalize, increment, complement, shift, and rotate instructions.
The KE8 EAE can be disabled.
KM8E Extended Memory
The basic PDP-8 architecture provided a 4K-word address space. The KM8E provides a memory extension mechanism that allows the PDP-8 address 32K-words of memory. The memory is all internal to the EP4CE15 FPGA.
The KM8E Extended Memory can be disabled.
KM8E Time Sharing
The KM8E time-sharing mechanism allows the CPU to operate in either Executive Mode or User Mode. In User Mode, instructions that could effect the operation of another program generate a User Mode Interrupt so that the operating system can handle the instruction correctly.
The KM8E Time Sharing can be disabled.
DK8EA/DK8EA/DK8EP Real Time Clock
The Real Time Clock (RTC) is used to create periodic interrupts to the processor. The RTC can be configured to operate in the following modes:
- 1 Hz (DK8-EC)
- 50 Hz (DK8-EC)
- 100 Hz (DK8-EA as if 50 Hz primary power is applied)
- 120 Hz (DK8-EA as if 60 Hz primary power is applied)
- 500 Hz (DK8-EC)
- 5 KHz (DK8-EC)
- Var (DK8-EP)
- Var (DK8-ES)
All timing is generated from the on-board 50 MHz crystal oscillator
KL8E Asynchronous Serial Interface
The system provides two serial interfaces.
LS8E Printer Interface
The LS8E device provides an interface to a serial printer. The device can provide hardware handshaking or XON/XOFF handshaking with the printer without software support.
PR8E Paper Tape Reader
The PR8E device provides an interface to a serial paper tape reader such as the Decitek 760. The device can provide hardware handshaking or XON/XOFF handshaking with the paper tape reader without software support.
KL8E Disk Controller
The Disk Controller is designed to 'front end' a Secure Digital disk chip which behaves as if it were four RK05 Disk Drives. The disk format is the same as SIMH so all of the SIMH disk images may be reused without change.
Runs OS/8 from SD card.
Impressive project, really end to end from a MUX and FF all the way up to OS! I need to dig in, much to learn here! Btw, quickly looking at the ALU implementation seems all OPR instruction combinations also execute in 1 cycle, was that the case with some "real" processors, or maybe just some (I know there were several iterations and implementations of them). If OPR are frequent than it pays off the extra complexity, but if they are relatively infrequent then doing them sequentially (how they are "logically" described in documentation) could dramatically simplify the monster MUX here: https://github.com/douggilliland/Retro-Computers/blob/master/PDP-8/PDP8_OpenCores/pdp8/cpu/alu.vhd -- just trying to learn about design considerations.