第8・9回: 実習(4・5): FPGAへの論理回路の実装(ステートマシン)

前回構成をみてきたステートマシンの例であるタイマ(timer)を 実際にFPGAボードに実装して動作させてみましょう。 ボードにはSub1(LED8個とスイッチ8個)をさしておきます。

全体構成

全体構成は、以下の通りです、 timerの中には、controlとdatapathが含まれますが、 それらの対応関係も含めて、いまいちど接続関係を整理して、信号名とともに 第7回配付資料の最後のほうのメモのページに記載しておきましょう。

入力

このtimer_topには、入力としてrst, set, run, s10, s60の5つの信号が 必要になります。 ボードSub1には8個のスイッチ(SW(0)〜SW(7))がありますので、 どのスイッチをどの信号に割り当てるかを、あらかじめ自分で決め、 第7回配付資料の最後のほうのメモのページに記載しておきましょう。

出力

このtimer_topの出力として見たい信号としては、次の2つがあります。 しかしボードSub1にはLEDが8個(LED(0)〜LED(7))しかありませんので、 すべてをLEDに表示させて確認することはできません。 そのため、これらのうちどの8bitをどのLEDに割り当てるかを、 あらかじめ自分で決め、第7回配付資料の最後のほうのメモのページに 記載しておきましょう。 ※ヒント: doneは必須で、残りのLEDは7個。おのずとどれを選ぶかは決まるはず。

プロジェクトの作成・動作

実習(1)実習(2・3)と同様に、 Xilinx ISE Project Navigatorを使ってVHDL記述の論理回路の 設計と論理合成(コンパイル)を行います。 VHDLファイルの準備がおわったら、論理合成をかけ、FPGAボードにに転送して 動作させてみましょう。
※timer全体が、1Hzのクロックに同期して動作していることに注意。 つまり各ボタンは少し長めに押さないと反応しないように見えます。
※動作が怪しいときは、例えばclk1s (1Hzのクロック)をどこかのLEDに接続して 点滅するかを確認するなどしてデバッグするとよいでしょう。 デバッグの方法はいろいろありますが、例えばcontrolの中の ステートマシンの状態(state)を見るために、controlの出力として 状態変数を出力する出力信号state_outを以下のように追加(もちろん このstate_outに、状態変数を出力する記述も追加する)し、 このstate_outとトップ階層timer_topでどこかのLEDに接続することで、 その値を確認することができます。
entity control is
  port(
    clk, rst, set, run, s10, s60, done: in std_logic;
    p10, p60, m1: out std_logic
    state_out : out std_logic_vector(1 downto 0) -- appended
    );
end control;
...
  process (state) begin
    case state is
      when IDLE_ST => state_out <= "00";
      when SET_ST  => state_out <= "01";
      when RUN_ST  => state_out <= "10";
      when DONE_ST => state_out <= "11";
    end case;
  end process;
...

「構成を意識しない記述」によるtimer

余裕があれば、別プロジェクトとして、「構成を意識しない記述」によって timer.vhdを作成し、動作させ、論理合成の結果(回路規模など)を比較してみましょう。 "Report Summary"から論理合成の結果(回路規模や動作速度など)を確認できます。 ただし今回のtimerぐらいの規模の回路では、Xilinx ISEの論理合成の最適化が よく効くのか、両者の差はほとんど出ないようです。

7セグメントLEDでの表示

さらに余裕がある人は、7セグメントボード(Sub3)をつないで、 タイマの結果などを7セグメントLEDも使って表示してみましょう。 実習(2・3)の最後の方で使っている 7セグメントLED表示用の回路のseg7.vhdや それに対応するピン設定ファイルsub3_count8seg7.ucfを流用できます。 あとは7セグメントLEDのどの桁に何を表示するか、や、 2個のLEDをどう使うか、6個のスイッチをどの入力に割り当てるか、などを 自分で決めて、その通りに実装して動作させてみましょう。
戻る