COP8
From Wikipedia, the free encyclopedia
| General information | |
|---|---|
| Launched | 1988 |
| Common manufacturer | |
| Performance | |
| Max. CPU clock rate | 0 Hz to 2 MHz |
| Data width | 8 (RAM), 8 (ROM) |
| Address width | 8 (RAM), 15 (ROM) |
| Architecture and classification | |
| Application | Embedded |
| Instruction set | COP8 |
| Number of instructions | 69 |
| Physical specifications | |
| Package | |
| History | |
| Predecessor | COP400 |
| Successor | none |
The National Semiconductor COP8 is an 8-bit CISC core microcontroller. COP8 is an enhancement to the earlier COP400 4-bit microcontroller family. COP8 main features are:
- Large amount of I/O pins
- Up to 32 KB of Flash memory/ROM for code and data
- Very low EMI
- Many integrated peripherals (meant as single chip design)
- In-System Programming
- Free assembler toolchain. Commercial C compilers available
- Free Multitasking OS and TCP/IP stack
- Peak of 2 million instructions per second
The COP8 has a basic instruction cycle time 1/10 of the clock frequency; a maximum 10 MHz clock will result in a maximum 1 MHz instruction execution rate. (The 10 MHz clock is used directly by some timer peripherals.) The maximum instruction execution rate is 1 cycle per byte, and most 1-byte instructions operate in one instruction cycle. Some, particularly branch instructions, take one or two cycles more. Some models include a clock doubler, and although they still accept a maximum 10 MHz input clock, they internally double it to a 20 MHz master clock which then results in a 2 MHz instruction execution rate.[1]: 7,32
The chip is a static logic design which can tolerate an arbitrarily slow clock;[1]: 10 most models include a second 32768 Hz quartz clock crystal oscillator which can be used for the CPU clock while the high-speed clock is disabled to save power.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The COP8 uses separate instruction and data spaces (Harvard architecture).[2]: 2-1 [3]: 2-4 Instruction address space is 15-bit (32 KiB maximum), while data addresses are 8-bit (256 bytes maximum, extended via bank-switching).
To allow software bugs to be caught, all invalid instruction addresses read as zero, which is a trap instruction. Invalid RAM above the stack reads as all-ones, which is an invalid address.
The CPU has an 8-bit accumulator and 15-bit program counter. 16 additional 8-bit registers (R0–R15) and an 8-bit program status word are memory mapped. There are special instructions to access them, but general RAM access instructions may also be used.
The memory map is divided into half RAM and half control registers as follows:
| Addresses | Use |
|---|---|
| 0x00–6F | General purpose RAM, used for stack |
| 0x70–7F | Unused, reads as all-ones (0xFF) to trap stack underflows |
| 0x80–8F | Unused, reads undefined |
| 0x90–BF | Additional peripheral control registers |
| 0xC0–CF | Peripheral control registers. |
| 0xD0–DF | General purpose I/O ports L, G, I, C and D |
| 0xE0–E8 | Reserved |
| 0xE9 | Microwire shift register |
| 0xEA–ED | Timer 1 registers |
| 0xEE | CNTRL register, control bits for Microwire & Timer 1 |
| 0xEF | PSW, CPU program status word |
| 0xF0–FB | R0–R11, on-chip RAM mapped as registers |
| 0xFC | R12, a.k.a. X, secondary indirect pointer register |
| 0xFD | R13, a.k.a. SP, stack pointer register |
| 0xFE | R14, a.k.a. B, primary indirect pointer register |
| 0xFF | R15, a.k.a. S, data segment extension register |
If RAM is not banked, then R15 (S) is just another general-purpose register. If RAM is banked, then the low half of the data address space (addresses 0x00–7F) is directed to a RAM bank selected by S. The special purpose registers in the high half of the data address space are always visible. The data registers at 0xFx can be used to copy data between banks.
RAM banks other than bank 0 have all 128 bytes available. The stack (addressed via the stack pointer) is always on bank 0, no matter how the S register is set.
Control transfers
In addition to 3-byte JMPL and JSRL instructions which can address the entire address space, 2-byte versions of these instructions, JMP and JSR, can jump within a 4K page. The instruction specifies the low 12 bits, and the high 3 bits of the PC are preserved. (These are intended primarily for models with up to 4K of ROM.) For short-distance branches, there are 63 1-byte instructions, JP, which perform PC-relative branches from PC−32 to PC+31. This is a 15-bit addition, and no page boundary requirements apply.
There are also jump indirect and load accumulator indirect instructions which use the accumulator contents as the low 8 bits of an address; the high 7 bits of the current PC are preserved.
Conditional branches per se do not exist, nor does the processor provide the traditional ZCVN status flags, although the program status word contains carry and half-carry flags for multi-byte arithmetic. Rather, there are a number of compare-and-skip instructions. For example, IFEQ compares its two operands, and skips the following instruction if they are unequal. Any instruction may be skipped; it is not limited to branches.
An interesting extension of this mechanism is the RETSK return-and-skip instruction, which lets any subroutine conditionally skip the instruction following the call. This provides a very compact way to return a boolean value from a subroutine.
Another feature unique to the COP8 architecture is the IFBNE instruction. This one-byte instruction compares the low 4 bits of the B (memory pointer) register with a 4-bit immediate constant, and can be used to loop until B has reached the end of a small (up to 16 byte) buffer. There is also a one-byte LD B,#imm4 instruction.