OpenCores
URL https://opencores.org/ocsvn/tinycpu/tinycpu/trunk

Subversion Repositories tinycpu

[/] [tinycpu/] [trunk/] [docs/] [design.md.txt] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 earlz
This is the design of TinyCPU. It's goals are as follows:
2
 
3
1. 8-bit registers and operations (8 bit processor)
4
2. 16-bit address bus
5
3. fixed 16-bit instruction length
6
4. use a small amount of "rich" instructions to do powerful things
7
5. 1 instruction per clock cycle
8
 
9
Register list:
10 5 earlz
r0-r5 general purpose registers
11
sp stack pointer (represented as r6)
12 4 earlz
ip instruction pointer register (represented as r7)
13 3 earlz
cs, ds, es, ss segment registers (code segment, data segment, extra segment, stack segment)
14
tr truth register for conditionals
15
 
16
general opcode format
17
 
18
first byte:
19
first 4 bits: actual instruction
20 4 earlz
next 3 bits: (target) register
21
last 1 bit: conditional
22 3 earlz
 
23 4 earlz
second byte:
24
first 1 bit: second portion of condition (if not immediate) (1 for only if false)
25 5 earlz
next 1 bit: use extra segment
26 4 earlz
next 3 bits: other register
27
last 3 bits: extra opcode information or third register. such as for ADD it could be target=source+third_register
28 3 earlz
 
29
...or second byte is immediate value
30
 
31
For opcodes requiring 3 registers but without room, the target opcode is assume to be the second operation. Such as for AND, target=source AND target
32
 
33
short list of instructions: (not final, still planning)
34 4 earlz
immediates:
35
1. move reg, immediate
36
2. move [reg], immediate
37
3. push and move reg, immediate (or call immediate)
38
4. push immediate
39 5 earlz
5. jmp immediate
40 4 earlz
 
41
groups: (limited to 2 registers and no immediates. each group has 8 opcodes)
42
group 1:
43
move(store) [reg],reg
44
move(load) reg,[reg]
45
out reg1,reg2 (output to port reg1 value reg2)
46
in reg1,reg2 (input from port reg2 and store in reg1)
47 5 earlz
pop reg
48
push reg
49
move segmentreg,reg
50
move reg,segmentreg
51 4 earlz
 
52
group 2:
53
and reg1,reg2 (reg1=reg1 and reg2)
54
or reg, reg
55
xor reg,reg
56
not reg1,reg2 (reg1=not reg2)
57
left shift reg,reg
58
right shift reg,reg
59
rotate right reg,reg
60
rotate left reg,reg
61
 
62
group 3: compares
63
is greater than reg1,reg2 (TR=reg1>reg2)
64
is greater or equal to reg,reg
65
is less than reg,reg
66
is less than or equal to reg,reg
67
is equal to reg,reg
68
is not equal to reg,reg
69 5 earlz
equals 0 reg
70
not equals 0 reg
71 4 earlz
 
72 5 earlz
group 4:
73
push segmentreg
74
pop segmentreg
75
push and move reg, reg (or call reg)
76
exchange reg,reg
77
exchange reg,seg
78
clear TR
79
Set TR
80 4 earlz
 
81 5 earlz
group 5:
82
increment reg
83
decrement reg
84
far jmp reg1, reg2 (CS=reg1 and IP=reg2)
85
far call reg1,reg2
86
far jmp [reg] (first byte is CS, second byte is IP)
87
push extended segmentreg, reg (equivalent to push seg; push reg)
88
pop extended segmentreg, reg (equivalent to pop reg; pop seg)
89
reset processor (will completely reset the processor to starting state, but not RAM or anything else)
90 4 earlz
 
91 14 earlz
group 6:
92
set register bank 0
93
set register bank 1
94
push extended reg, reg
95
pop extended reg,reg
96 4 earlz
 
97 5 earlz
 
98 4 earlz
3 register instructions:
99
1. add reg1, reg2, reg3 (reg1=reg2+reg3)
100
2. sub reg1, reg2, reg3
101
 
102
 
103 5 earlz
opcodes used: 12 of 16. 4 more opcodes available. Decide what to do with the room later.
104 4 earlz
 
105
 
106 5 earlz
 
107 3 earlz
 
108
1 -move immediate (only uses first byte)
109
2 -move
110
3 -push
111
4 -push immediate
112
5 -push and move (or call when acting on ip)
113
6 -compare (is less than, is less than or equal, is greater than, is greater than or equal, is equal, is not equal) (6 conditions room for 2 more in extra)
114
7 -add
115
8 -subtract
116
9 -bitwise operations (xor, or, and, shift right, shift left, not)
117
 
118
x -multiply (if room)
119
x -divide
120
 
121
 
122
conditionals
123 4 earlz
 
124
1 -- only if true
125
for only if false, there should basically be another compare or if applicable an always afterwards
126 3 earlz
 
127
push
128
pop
129
move
130
add
131
sub
132 5 earlz
 
133
limitations that shouldn't be passed with instructions
134
* Doing 2 memory references
135
* pushing a memory reference (equates to 2 memory references)
136
 
137
Note it is possible however to read and write 16bits at one time to the memory to consecutive addresses.
138
 
139
 
140
segments:
141
DS is used in all "normal" memory references
142
SS is used in all push and pop instructions
143
ES is used when the ExtraSegment bit is set for either push/pop or normal memory references
144
CS is only used for fetching instructions
145 14 earlz
 
146
 
147
States needed:
148
0. reset
149
1. decode current instruction (All without memory capable within 1 clock cycle)
150
2. increment IP(and SP if needed) and fetch next instruction
151
3. Write 1 register to memory
152
4. Read 1 register from memory
153
5. Write 2 registers to memory
154
6. Read 2 registers from memory
155
7. Write 1 register to memory and setup increment of sp
156
8. Write 2 registers to memory and setup double increment of sp
157
9. Read 1 register from memory and setup decrement of sp
158
10. Read 2 registers from memory and setup double decrement of sp
159
11.
160
 
161
 
162
 
163
registerfile map:
164
0000: general r0
165
0001: general r1
166
0010: general r2
167
0011: general r3
168
0100: general r4
169
0101: general r5
170
0110: SP (r6)
171
0111: IP (r7)
172
1000: second bank r0
173
1001: second bank r1
174
1010: second bank r2
175
1011: second bank r3
176
1100: CS
177
1101: DS
178
1110: ES
179
1111: SS
180
 
181
Banking works like if(regnumber(2) = '0') then regnumber(3)=regbank; end if;
182
 
183
 
184
ALU operations
185
00000 and reg1,reg2 (reg1=reg1 and reg2)
186
00001 or reg, reg
187
00010 xor reg,reg
188
00011 not reg1,reg2 (reg1=not reg2)
189
00100 left shift reg,reg (logical)
190
00101 right shift reg,reg (logical)
191
00110 rotate right reg,reg
192
00111 rotate left reg,reg
193
 
194
01000 is greater than reg1,reg2 (TR=reg1>reg2)
195
01001 is greater or equal to reg,reg
196
01010 is less than reg,reg
197
01011 is less than or equal to reg,reg
198
01100 is equal to reg,reg
199
01101 is not equal to reg,reg
200
01110 equals 0 reg
201
01111 not equals 0 reg
202
 
203
10000 Set TR
204
10001 Reset TR
205
10011 Increment
206
10010 Decrement
207
10100 Add
208
10101 Subtract
209
 

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.