NATUを作る(パート1)
HARUは失敗に終わってしまった。
だが、その悔しさをバネに、新たにNATUを作ることになった。
今回考えるのは、あくまで現時点で考えていることであって、作るのが決定しているわけではないし、今後変更されるかもしれません
CPU(NX RED VIII)
CPUは、NX RED VIIで廃止されていたアキュムレーターとマルチスレッドを復活させたい
NX RED VIIは安定性重視で性能を捨てていたが、結局ちゃんとテストしながら組み立てないとあまり意味がないことがわかったため、今回は性能向上の技術も取り入れていく
アキュムレーターを搭載し、8rt毎の演算を可能にして、マルチスレッド技術により4スレッド化させる
(理想)
理想は、5Hz・4スレッドだ
だが、実際に実現できるのか、あまり自信がない
最近、CRED XやHARUで失敗が続いているため、自信がない
ALU
ALUは、HARUと同じALUを採用したいと思う
4rt CCAをベースに、ALUに改造し改良したものだ
命令の種類は16に抑えたいため、もしかしたらALUの機能を無効化して扱うかもしれない
(命令デコーダーを作り直さないといけないから、出来ればしたくない)
レジスタ
レジスタ容量は、HARUから1Byte増えて15Byteにしたいと思う
HARUは15番地がI/Oポートに割り当てられていたが、I/Oポートの仕組みを変えることで、この15番地をレジスタとして使えるようにする
また、ROMから指定した値をレジスタに書き込める機能も追加したいと思っている
I/Oポート
I/Oポートは、指定したレジスタと指定したI/Oポートで行うようにしたいと思う
指定したレジスタから読み出してアウトプットしたり、指定したI/Oポートからインプットしたり…
といった感じだ
こうすれば、レジスタ容量とポート数を両立できるはずだ
メモリ
sushi memory architectureは、複数からアクセスできるのが利点だ
今回は、その利点を活かしてCPUがVRAMにアクセスできるようにしたいと思う
CPUがVRAMにアクセスできるようにすることで、点をVRAMに描画したり、指定した座標がオンなのかオフなのかも調べられるようになる
GPU(GRED II)
CPU化
GPUは、少し早いかもしれないが、速度的に可能であれば、
GRED Iで採用していた専用の回路から、CPUを利用したものに置き換えたいと思う
専用の回路だと、一つの処理しか行うことができないが、CPUなら一つでいろんな処理が行えるようになる
たとえば、一つのCPUで枠だけの四角形も、塗り潰す四角形も、直線を引いたり出来るはずだ
つまり、CPU用CPUとGPU用CPUを作るということになるかもしれない
CPU化の欠点
だが、CPUは並列処理能力は申し分ないが、シングル処理能力が専用回路より劣る可能性がある
つまり、sushi memory architectureのループ式メモリが一周する前に、処理を終わらせられない可能性がある
そうすると、目的の部屋が回ってくるまでまた必要が生まれるため、かなり時間がかかるということになる
今回のGRED IIは、解像度を16×16にするため、ループ一周にかかる時間は256rt(25.6秒)になる
専用回路からCPUに置き換えた時、この時間内に次の処理が終わらなかったら、CPU化は見送ることになる
それじゃあ、プログラムを考えてみる
命令セット
ちなみに、命令セットは下の画像のようにしたいと思う
塗りつぶす四角形
まず、塗りつぶす四角形の描画プログラムを考えてみる
大体の流れとしては、
VRAMに出力
上限かどうか調べる
移動
といった感じにしたいと思う
0:VRAMに書き込む
1:今のxをインクリメントして保存
2:上限のxから今のxを引く・フラグがオンだったら0にジャンプ
3:今のyから上限のyを引く・フラグがオンだったら7にジャンプ
4:今のyをインクリメントして保存
5:今のxを始まりのxに戻す
6:0にジャンプ
7:完了
解説
0でVRAMに書き込んでいます
1で今のxに1を足しています
2でxが上限を超えているか調べています
3でyが上限と同じか調べています
4で今のyに1を足しています
5でxをリセットしています
6で0にジャンプしています
7で完了を知らせています
イメージとしては、右下から左下へ、
一つ上に移動して右から左へ…
を繰り返している感じ
これで、塗りつぶしの四角形が描画できるはず
枠だけの四角形
次は、枠だけの四角形の場合を考えてみたい
大体の流れとしては、
VRAMに書き込む
方向転換するか調べる
移動
といった感じにしたいと思う
0:VRAMに書き込む
1:今のxから上限のxを引く・フラグがオンだったら4にジャンプ
2:今のxをインクリメントして保存
3:0にジャンプ
4:VRAMに書き込む
5:今のyから上限のyを引く・フラグがオンだったら8にジャンプ
6:今のyをインクリメントして保存
7:4にジャンプ
8:VRAMに書き込む
9:始まりのxから今のxを引く・フラグがオンだったら12にジャンプ
10:今のxをデクリメントして保存
11:8にジャンプ
12:VRAMに書き込む
13:始まりのyから今のxを引く・フラグがオンだったら16にジャンプ
14:今のyをデクリメントして保存
15:12にジャンプ
16:完了
解説
0でVRAMに書き込んでいます
1でxが上限か調べています
2で今のxに1を足しています
3で0にジャンプしています
4でVRAMに書き込んでいます
5でyが上限か調べています
6で今のyに1を足しています
7で4にジャンプしています
8でVRAMに書き込んでいます
9でxが下限か調べています
10で今のxから1を引いています
11で8にジャンプしています
12でVRAMに書き込んでいます
13でyが下限か調べています
14で今のyから1を引いています
15で12にジャンプしています
16で完了を知らせています
イメージとしては、左下から右下、右下から右上、右上から左上、左上から左下
といった感じ
これで、枠だけの四角形が描画できるはず
実際には、データの整理とかもあるかもしれないから、持った命令数が増えるかも知らないけど、とりあえずこんな感じのイメージでやろうと思う
命令は二つ合わせて25だから、ROMのアドレスは5bit(命令32行分)あれば足りそう
少し話を戻すが、問題はVRAMのループが一周する前に処理を終わらせられるのか だ
恐らく、最も遅延がかかるのは塗りつぶす四角形のプログラムで、条件分岐3回、通常演算3回だ
条件分岐は通常演算の5倍の遅延がかかると仮定した場合、通常演算18回分となる
ループが一周する時間は256rt
256÷18=14.22
つまり、クロック周波数が14rt毎の速度で動けば、目標を達成できるということになる
…全然可能な範囲だ
つまり、通常演算:14rt、条件分岐:70rtで実行できるようにすればいいという感じだ
これなら、可能かもしれない
よし、CPU型を採用しよう
文字
最後に、文字を考えたいと思う
GRED IIでは、文字を扱えるようにしたい
ディスプレイに数字なども表示できるようにしたい
そのためには、フォントを保存するROMと、文字をVRAMに書き込める機能が必要だ
この部分だけは、CPUではなく専用回路で動かしたいと思う
理由は、その方が高速にできる気がするからだ
CPUで処理する場合、基本1回ループする毎に1ピクセルだけ書き換えることができる
だが、文字の場合、専用回路を使えば1回ループする毎に4ピクセルも書き換えられる可能性があるのだ
だから、文字はとりあえず専用回路でVRAMに書き込むようにしたい
それじゃあ、次回、また会いましょう