1 |
2 |
samiam9512 |
Intel 8080 CPU Verilog core
|
2 |
|
|
|
3 |
|
|
2006/9/12
|
4 |
|
|
|
5 |
|
|
PROJECT: 8080 CPU
|
6 |
|
|
LANGUAGE: VERILOG
|
7 |
|
|
TARGET: Xilinx xc3s1000-4
|
8 |
|
|
|
9 |
|
|
This core was implemented as a first project in Verilog by an old schematic
|
10 |
|
|
design engineer. There were a few reasons for implementing an 8080 processor.
|
11 |
|
|
First, it was the first true general purpose processor available. Second, it
|
12 |
|
|
was, by nature, designed to be compact in instruction set and implementation.
|
13 |
|
|
Third, it has a rich set of software applications, including assemblers,
|
14 |
|
|
compilers and operating systems.
|
15 |
|
|
|
16 |
|
|
More often, A Z80 target is used in Verilog or VHDL, with the idea that the
|
17 |
|
|
Z80 is the superset of the 8080. However, the Z80 is significantly more
|
18 |
|
|
complex than the 8080. The 8080 can make a useful maintainence processor for
|
19 |
|
|
SOC systems, since it consumes a small amount of resources. The 8080 has a
|
20 |
|
|
significant body of support, since it was a primary 8 bit processor before
|
21 |
|
|
the Z80, and coding for the 8080 instruction set often continued even after
|
22 |
|
|
general Z80 use, because that was the universal subset of both processors.
|
23 |
|
|
|
24 |
|
|
My own experience with 8080 coding lasted perhaps a year, then I switched
|
25 |
|
|
to the Z80. Although he Z80 was a significantly more usable processor to
|
26 |
|
|
code for than a 8080, it made a mildly non-orthogonal instruction set much
|
27 |
|
|
more so. I have worked on several processors through the series, including
|
28 |
|
|
working on the design for the Z280, a Z80 16 bit replacement at Zilog
|
29 |
|
|
Corporation, so hopefully nobody can accuse me of bias against the Z80 :-)
|
30 |
|
|
|
31 |
|
|
The core presented is completely compatible with the original 8080 instruction
|
32 |
|
|
set, although the exact handling of the two undefined bits in the status (flags)
|
33 |
|
|
register have not been verified to be identical to the original. This only
|
34 |
|
|
matters for "trick" code that expects a value which is pop'ed into the PSW
|
35 |
|
|
to be preserved when subsequently pushed. This core preserves all bits,
|
36 |
|
|
including the undefined bits, which means such code would function correctly.
|
37 |
|
|
Also needing verification to the original are the illegal opcodes, which on
|
38 |
|
|
this core are treated as nops.
|
39 |
|
|
|
40 |
|
|
The pinout is decidedly not compatible with the original pinout. The original
|
41 |
|
|
8080 pinout was a multiplexed nightmare that was never really designed to be
|
42 |
|
|
directly used. Intel was attempting to save on pins, and much of the CPU status
|
43 |
|
|
was sent out on every cycle via the data pins. Intel subsequently came out with
|
44 |
|
|
"demultiplexor" chips to result in simple signals.
|
45 |
|
|
|
46 |
|
|
The cpu8080 signals are a simple unmultiplexed 16 bit address, and a
|
47 |
|
|
bidirectional, separate 8 bit data bus. The read and write for each of memory
|
48 |
|
|
and I/O spaces are all separately decoded. An interrupt request and acknowledge
|
49 |
|
|
is implemented sufficient to allow an external interrupt controller to be
|
50 |
|
|
connected. A readint signal is implemented that is true for the entire time that
|
51 |
|
|
an interrupt fetch is occuring. This allows simple implementation of full
|
52 |
|
|
vectoring mode.
|
53 |
|
|
|
54 |
|
|
There were two vectoring modes on the 8080. The most famous one was the use of
|
55 |
|
|
a single instruction byte that was forced onto the data lines during an
|
56 |
|
|
interrupt acknowledge cycle. This instruction could be any valid instruction,
|
57 |
|
|
but was most likely a restart, which gave 8 possible vector locations for the
|
58 |
|
|
interrupt.
|
59 |
|
|
|
60 |
|
|
It was not as well known, but the original 8080 could accept a full 2 or 3 byte
|
61 |
|
|
instruction via the interrupt acknowledge cycle. This was used by advanced
|
62 |
|
|
Intel interrupt controllers to place a full CALL instruction on the data lines,
|
63 |
|
|
and thus achieve full arbitrary address vectoring. I have included such an
|
64 |
|
|
advanced interrupt controller as an accessory to the cpu8080 core, also in
|
65 |
|
|
verilog.
|
66 |
|
|
|
67 |
|
|
cpu8080 was implemented in Xilinx ISE, simulated, and then carried out to an
|
68 |
|
|
XESS XSA-3S1000 board with a Spartan-3 XC3S1000 FPGA. This board can download
|
69 |
|
|
the test design and run it with a standard PC keyboard and VGA monitor. To drive
|
70 |
|
|
the onboard pheriperhals, the total package includes a VGA/Keyboard driver that
|
71 |
|
|
emulates the original Altair serial port card, addressing for the flash, and
|
72 |
|
|
addressing for 64kb of the SDRAM.
|
73 |
|
|
|
74 |
|
|
The software provided includes a BIOS image sufficient to run CP/M 3.1 from the
|
75 |
|
|
onboard flash. The flash contains a short bootstrap, then the BIOS treats the
|
76 |
|
|
flash as partitioned disk drive. Also included are utilities to get the flash
|
77 |
|
|
images and programs on and off the board. The resulting software/hardware
|
78 |
|
|
combination emulates a minimal video terminal connected to a Altair or similar
|
79 |
|
|
Home Computer running CP/M. Several simulators can be found for the PC that
|
80 |
|
|
run this same combination.
|
81 |
|
|
|
82 |
|
|
Scott Moore
|
83 |
|
|
|