2011年2月2日水曜日

CPUの設計 1

命令表に一部間違いがあったので思い切って全部定義し直した。


乗除算命令は持っていない。
FPGAのDSPを使えば乗算命令の実装は出来るが、
excution unitのlatencyが(多分)1に出来なくなる事と、
FPGAのdevice依存になってしまうのが嫌だったので、
FPGAのDSPを使う案も考えられるが、DSPは入出力にF/Fを入れると
高周波数で動作できるがそれだとlatencyが1に出来なくなるし、
F/Fがない構成で使用すると遅延が大きくて駆動周波数を上げられない
といった経験を過去にしているので使用しないこととした。
また、除算はどう頑張っても1cycleで演算を行うことは出来ない気が
するので、除算器も実装しないことにした。
その代わりに32bit barrel shifterを持ち、これを利用して
乗除算はsoftwareで行う事にした。

zumi32は17個のregisterを持ちその内訳は以下のとおりだ。
  • R0 ... 常に値0を持つ
  • R1~14 ... 汎用
  • R15 ... program counter
  • EPC ... 割込み、例外発生時の戻り番地を格納する
また、flagはCarry flagとZero flagを持つ。

構造は以下のとおりだ。




















zumi32はcpu core部のみでありcacheは含んでいない。
(cacheは別設計)
zumi32内部はFETCH UNITとEXEC UNITから成り、
FETCH UNIT内部はregister file, instruction queue, address counterから成る。
instruction queueはDRAMCでも使用している2 stage FIFOを応用した物で、
後段のF/Fの入力部で命令のdecodeを行っており、後段のF/Fはこれらdecodeした
結果をone hot信号として保持したりしている。
register fileはR1からR14迄のregisterの配列だ。
execution unitは命令の実行unitでlatencyは1、つまりinstruction queueと
合わせて全体のpipeline段数は3段だ。
zumi32はload/store/swapを除いて1命令/1cycleで実行する。
分岐時は最小でも2cycle pipelineがstallする。
また、分岐は遅延分岐になる。

このzumi32は先日の133MHz版DRAMCまたは240MHz版DRAMCのdesignに統合して
動作させたいと考えていて、目標の動作周波数は60MHzだ。

しっかし、俺って文章書くの下手糞だな。もっと国語の勉強をしとくんだった。
ニポン語は苦手だ。
Verilogなら少しは出来るんだけどな。
おーるうぇいずー、あっとまーくー、ぽじえっじー、あっいけね括弧忘れた。。

0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...