第11回: 実習(6): FPGAへのCPUの実装(1)

前回概略を設計したCPUを、順番に作っていくことにします。 まず今回は、レジスタと演算器(データパス)のまわりをつくってみます。

全体構成

全体の動作は、クロックclkに同期して(=clkの立ち上がりで)行います。 若干天下り的ですが、全体構成を以下のようにすることにしてみます。

演算関係のデータパスの設計

前回のCPUの仕様をもとに、以下のような入出力に対して データパス部分(datapath_reg.vhd)を設計し、VHDLで記述してみましょう。 これらの入出力を使って、前回のCPUの命令実行の仕様を満たすように レジスタに代入するべきresとZフラグにセットするべき値を求める データパスを記述し、シミュレーション・実機により動作を確認してみましょう。 ただし次回の制御回路の設計で必要となるため、入力であるr0i, r1iを そのまま出力する出力r0o, r1oをつけておきます。

以下、ひな形:

entity datapath_reg is
  port( op, imm: in std_logic_vector(3 downto 0);
        r0i, r1i: in std_logic_vector(3 downto 0);
        zi: in std_logic;
        res, r0o, r1o, : out std_logic_vector(3 downto 0);
        zo: out std_logic_vector);
end datapath_reg;

architecture Behavioral of datapath_reg is
begin
...
end Behavioral;
ちなみにこのresの値を、クロックにあわせて 命令opに応じて別途レジスタ(r0またはr1)に保存することになります。

ヒント

プログラムカウンタのデータパスの設計

続いて、プログラムカウンタ(PC)まわりとZフラグの動作を記述する datapath_pc.vhdをつくってみます。 前回のCPUの仕様をもとに、以下のような入出力に対して データパス部分(datapath_pc.vhd)を設計し、VHDLで記述してみましょう。 ※上のブロック図ではziに対応する線がありませんが、PCの値の決定には、現在のZフラグの値が必要なので、追加しておいてください。
これらの入出力と内部変数を使って、前回のCPUの命令実行の仕様を満たすように PCに代入するべき値pcoをきめるデータパスを記述してみましょう。

以下、ひな形:

entity datapath_pc is
  port( op, imm, pci: in std_logic_vector(3 downto 0);
        zi: in std_logic;
        pco: out std_logic_vector(3 downto 0));
end datapath_pc;

architecture Behavioral of datapath_pc is
begin
...
end Behavioral;

ヒント

メモリの設計

今回はメモリは読み出し専用ですから、デコーダと同様に 入力として与えるアドレスaddrに応じて、そこの値dataを出力する 回路、として設計すればよいことになります。 例えばテスト用に次のような「プログラム」を保持するメモリを設計してみましょう。
アドレス内容命令
00000 0001mov 1, r0
10010 0010add r0, 2, r0
20110 0010jmp 2

以下、ひな形:

entity mem is
  port( addr: in std_logic_vector(3 downto 0);
        data: out std_logic_vector(7 downto 0));
end mem;

architecture Behavioral of mem is
begin
...
end Behavioral;

戻る