2011年12月23日金曜日

独自のCPUを創ってみる(10) - TD16


独自のCPUを創ってみる(9) - まとめ」の続き



TD32を創ってみて、CPUの設計方法が少しは分かった。
spartan-3 では、1個のスライスで最大 2:1 MUXしか実装できない。
4:1 MUXだとスライスが2個必要になる。
だから、32bit の 4:1 MUX を実装するには64スライス必要になる。
たった4種類の演算をするALUだけでこれだけのリソースが必要になる。
ところが pico blaze はCPU全体で96スライスだ。
だから、データ幅の広い信号のMUXは慎重に使わねばならない。
それと、メモリの使い方も重要なポイントだ。
TD32では単純にフラップフロップで複数のレジスタを実装したが、
これがリソース消費を拡大した。これは論外だった。
複数のレジスタは分散RAMかブロックRAMを使わねばならない。
どちらも高速なSRAMで、しかもデュアルポートの構成にできるから、
例えばパイプライン2ステージにして、それぞれのステージでRAMに
アクセスできる。pico blaze では16個の任意のレジスタ間で
sx <= sx + sy + carry
のような演算ができる。デュアルポートRAMをうまく使う必要があるだろう。

よく見かける、CPUのブロック図の見方も分かってきたような気がする。
データ幅の広い信号の流れに着目し、またMUXの使い方にも注意して
見るといいと思った。ブロック図にMUXが描かれているのは、
リソース消費や動作速度に大きく影響するからだろう。

改めて、16bit のCPUを作ってみた。
まだデバッグしてないのでまだまだバグがあると思うが。
注目したいのは動作速度とリソース消費だ。
現時点で最高速度 82.291MHz 、周辺回路含めて 142 スライスだった。

アーキテクチャは三段のパイプラインで、

(1) 命令アドレス計算、命令フェッチ、PC更新
(2) メモリアドレス計算、メモリ読み込み又は書き込み
(3) ALU実行、結果をアキュムレータに格納

という流れ。(1)と(2)ではデュアルポートのブロックRAMを同時にアクセスする。
アキュムレータは1つしかなく、フリップフロップで構成する。
パイプラインの制御はまだ実装してない。
(2)でブロックRAMから読み込んだ値をオペランドとしてALUを実行すると、
これだけで10nsecを超えてしまい、どうしても100MHz動作は無理なようだ。

高速化するためには、ALUのオペランドや結果の格納を分散RAMに
限定するしかなさそうだ。そうするとpico blazeと似てくるが、
pico blaze は2クロックで1命令実行だ。TD16 ではパイプラインで
なんとかして1クロックで1命令実行できるようにして、しかも16bit CPUと
することで差別化したい。当然pico blazeよりリソースを消費するだろうけど。

2 件のコメント:

  1. Spartan-3e starter kit自分も持ってるので応援します

    返信削除
    返信
    1. ありがとうございます。ちょっと仕事が忙しくなりましたが、ゆっくり進めます。

      削除