|
How Microprocessors Work |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Microprocessor
History The first microprocessor to make it
into a home computer was the Intel 8080, a complete 8-bit computer on one
chip introduced in 1974. The first microprocessor to make a real splash in
the market was the Intel 8088, introduced in 1979 and incorporated into
the IBM PC (which first appeared in 1982 or so). If you are familiar with
the PC market and its history, you know that the PC market moved from the
8088 to the 80286 to the 80386 to the 80486 to the Pentium to the
Pentium-II to the new Pentium-III. All of these microprocessors are made
by Intel and all of them are improvements on the basic design of the 8088.
The new Pentiums-IIIs can execute any piece of code that ran on the
original 8088, but the Pentium-III runs about 3,000 times faster! The following table helps you to
understand the differences between the different processors that Intel has
introduced over the years.
Information about this table:
From this table you
can see that, in general, there is a relationship between clock speed and
MIPS. The maximum clock speed is a function of the manufacturing process
and delays within the chip. There is also a relationship between the
number of transistors and MIPS. For example, the 8088 clocked at 5 MHz but
only executed at 0.33 MIPS (about 1 instruction per 15 clock cycles).
Modern processors can often execute at a rate of 2 instructions per clock
cycle. That improvement is directly related to the number of transistors
on the chip and will make more sense in the next section. Inside a
Microprocessor A microprocessor executes a collection
of machine instructions that tell the processor what to do. Based on the
instructions, a microprocessor does three basic things:
There may be very
sophisticated things that a microprocessor does, but those are its three
basic activities. The following diagram shows an extremely simple
microprocessor capable of doing those three things:
This is about as simple as a
microprocessor gets. This microprocessor has:
Let's assume that
both the address and data buses are 8 bits wide in this example. Here are the components of this simple
microprocessor:
Although they are not
shown in this diagram, there would be control lines from the instruction
decoder that would:
Coming into the
instruction decoder are the bits from the test register and the clock
line, as well as the bits from the instruction register. RAM and ROM ROM stands for Read-Only Memory. A ROM
chip is programmed with a permanent collection of pre-set bytes. The
address bus tells the ROM chip which byte to get and place on the data
bus. When the RD line changes state, the ROM chip presents the selected
byte onto the data bus. RAM stands for Random Access Memory.
RAM contains bytes of information and the microprocessor can read or write
to those bytes depending on whether the RD or WR line is signaled. One
problem with today's RAM chips is that they forget everything once they
power goes off. That is why the computer needs ROM. By the way, nearly all computers
contain some amount of ROM (it is possible to create a simple computer
that contains no RAM (many micro controllers do this by placing a handful
of RAM bytes on the processor chip itself), but generally impossible to
create one that contains no ROM). On a PC, the ROM is called the BIOS
(Basic Input/Output System). When the microprocessor starts, it begins
executing instructions it finds in the BIOS. The BIOS instructions do
things like testing the hardware in the machine, and then it goes to the
hard disk to fetch the boot sector. This boot sector is another
small program, and the BIOS stores it in RAM after reading it off the
disk. The microprocessor then begins executing the boot sector's
instructions from RAM. The boot sector program will tell the
microprocessor to fetch something else from the hard disk into RAM, which
the microprocessor then executes, and so on. This is how the
microprocessor loads and executes the entire operating system. Understanding
Microprocessor Instructions Here's the set of assembly language
instructions that the designer might create for the simple microprocessor
shown above:
If you have read the
HSW article entitled How C Programming Works, then you know that this
simple piece of C code will calculate the Factorial of 5 (where the
Factorial of 5 = 5! = 5 * 4 * 3 * 2 * 1 = 120): a=1;
f=1;
while (a <= 5)
{
f = f * a;
a = a + 1;
}
At the end of the program's execution,
the variable f contains the factorial of 5. A C Compiler translates this C
code into assembly language. Assuming that RAM starts at address 128 in
this processor and ROM (which contains the assembly language program)
starts at address 0, then for our simple microprocessor the assembly
language might look like this: // Assume a is at address 128
// Assume F is at address 129
0 CONB 1 // a=1;
1 SAVEB 128
2 CONB 1 // f=1;
3 SAVEB 129
4 LOADA 128 // if a > 5 the jump to 17
5 CONB 5
6 COM
7 JG 17
8 LOADA 129 // f=f*a;
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128 // a=a+1;
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4 // loop back to if
17 STOP
So now the question is, "How do
all of these instructions look in ROM?" Each of these assembly
language instructions must be represented by a binary number. For the sake
of simplicity, let's assume each assembly language instruction is given a
unique number, like this:
The numbers are known
as opcodes. In ROM, our little program would look like this: // Assume a is at address 128
// Assume F is at address 129
Addr opcode/value
0 3 // CONB 1
1 1
2 4 // SAVEB 128
3 128
4 3 // CONB 1
5 1
6 4 // SAVEB 129
7 129
8 1 // LOADA 128
9 128
10 3 // CONB 5
11 5
12 10 // COM
13 14 // JG 17
14 31
15 1 // LOADA 129
16 129
17 2 // LOADB 128
18 128
19 8 // MUL
20 5 // SAVEC 129
21 129
22 1 // LOADA 128
23 128
24 3 // CONB 1
25 1
26 6 // ADD
27 4 // SAVEB 128
28 128
29 11 // JUMP 4
30 8
31 18 // STOP
You can see that 7 lines of C code
became 17 lines of assembly language and that became 31 bytes in ROM. The instruction decoder needs to turn
each of the opcodes into a set of signals that drive the different
components inside the microprocessor. Let's take the ADD instruction as an
example and look at what it needs to do:
Every instruction can
be broken down as a set of sequenced operations like these that manipulate
the components of the microprocessor in the proper order. Some
instructions, like this ADD instruction, might take 2 or 3 clock cycles.
Others might take 5 or 6 clock cycles. Performance More transistors also allow a
technology called pipelining. In a pipelined architecture,
instruction execution overlaps. So even though it might take 5 clock
cycles to execute each instruction, there can be 5 instructions in various
stages of execution simultaneously. That way it looks like one instruction
completes every clock cycle. Many modern processors have multiple
instruction decoders, each with its own pipeline. This allows multiple
instruction streams, which means more than one instruction can complete
during each clock cycle. This technique can be quite complex to implement,
so it takes lots of transistors. The trend in processor design has been
toward full 32-bit ALUs with fast floating point processors built in and
pipelined execution with multiple instruction streams. There has also been
a tendency toward special instructions (like the MMX instructions) that
make certain operations particularly efficient. There has also been the
addition of hardware virtual memory support and L1 caching on the
processor chip. All of these trends push up the transistor count, leading
to the multi-million transistor powerhouses available today. These
processors can execute about one billion instructions per second! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||