#概要
windowsでiverilogやってみた。
polyphonyでcpu書いてみる。
#俺cpu仕様案
命令長 16ビット
レジスタ 8ビット4本
命令メモリー 8ビット256バイト
データメモリー 8ビット256バイト
命令セット
bit15,bit14 算術命令、転送命令、ジャンプ、アドレスを分ける。
bit13,bit12 上の細分
bit11,bit10 レジスタ指定
bit9,bit8 レジスタ指定
bit7~bit0 アドレス、データ
#俺cpu命令セット案
|ニーモニック|bit15,bit14 |bit13,bit12|bit11,bit10|bit9,bit8|bit7,bit0|説明|
|:--|:--|:--|:--|:--|:--|:--|:--|
|+ |0 |0 |0-3 |0-3 |- |加算|
|- |0 |1 |0-3 |0-3 |- |減算|
|* |0 |2 |0-3 |0-3 |- |乗算|
|/ |0 |3 |0-3 |0-3 |- |除算|
|jmp |1 |0 |- |- |0-255 |ジャンプ|
|if jmp |1 |1 |- |- |0-255 |条件ジャンプ|
|> |1 |2 |0-3 |0-3 |- |条件|
|% |1 |3 |0-3 |0-3 |- |剰余|
|set |2 |0 |0-3 |- |0-255 |レジスタセット|
|set2 |2 |1 |0-3 |0-3 |0-255 |レジスタセット|
|out |2 |2 |0-3 |- |- |出力|
|out2 |2 |3 |- |- |0-255 |出力|
|load |3 |0 |0-3 |- |0-255 |メモリロード|
|save |3 |1 |0-3 |- |0-255 |メモリセーブ|
|load2 |3 |2 |0-3 |0-3 |0-255 |メモリロード|
|save2 |3 |3 |0-3 |0-3 |0-255 |メモリセーブ|
#サンプルコード
while pc != 0:
iaddr = pc
ins = imem[iaddr]
pc = pc + 1
op = (ins >> 14) & 0x3
funct = (ins >> 12) & 0x3
a = (ins >> 10) & 0x3
b = (ins >> 8) & 0x3
data = ins & 0xff
addr = ins & 0xff
if op == 0:#keisan
if funct == 0:
reg[a] = reg[a] + reg[b]
elif funct == 1:
reg[a] = reg[a] - reg[b]
elif funct == 2:
reg[a] = reg[a] * reg[b]
elif funct == 3:
reg[a] = reg[a] / reg[b]
else:
pc = 0
elif op == 2:#jump
if funct == 0:
pc = addr
elif funct == 1:
if (reg[a] == 0):
pc = addr
elif funct == 2:
reg[a] = reg[a] < reg[b]
elif funct == 3:
reg[a] = reg[a] % reg[b]
else:
pc = 0
elif op == 3:#data
if funct == 0:
reg[a] = data
elif funct == 1:
reg[a] = reg[b] + data
#elif funct == 2:
#reg[a] = reg[b] + 1
#elif funct == 3:
#reg[a] = reg[a] < reg[b]
else:
pc = 0
else:#mem
if funct == 0:
reg[a] = dmem[addr]
elif funct == 1:
dmem[addr] = reg[a]
elif funct == 2:
reg[a] = dmem[reg[b] + addr]
elif funct == 3:
dmem[reg[b] + addr] = reg[a]
else:
pc = 0
#アセンブラ案
a-zをout
r0set 0
r0save 0
loop:
r0load 0
r1set 26
r0 < r1
if pass
r0load 0
r1set 97
r0 + r1
r0out
r0load 0
r1set 1
r0 + r1
r0save 0
jp loop
pass:
#メモリーに落とす。
imem = [
0x8000, #r0set 0
0xd000, #r0save 0
#loop:
0xc000, #r0load 0
0x841a, #r1set 26
0x6100, #r0 < r1
0x400f, #if pass
0xc000, #r0load 0
0x8461, #r1set 97
0x0100, #r0 + r1
0xa000, #r0out
0xc000, #r0load 0
0x8401, #r1set 1
0x0100, #r0 + r1
0xd000, #r0save 0
0x5002, #jp loop
0x500f, #pass:
]
以上。