【FPGA学習】分周器を作る②~シミュレーションで動作確認~

FPGA

前回作成した分周器のVHDLプログラムについて、ModelSimというシミュレーションソフトを使って、動作確認を行っていきたいと思います。

前回のVHDL作成の記事はこちらです。

【FPGA学習】分周器を作る①~VHDLでの記述~
FPGAの使い方のお勉強として、今回は『分周器』をVHDLで実装していきたいと思います。分周器とは、クロック信号等の周波数を整数分の1に落とす装置のことです。例えば、16MHzのクロック信号を4分の1の4MHzにするといった感じです。 ちな...

ちなみに、筆者はFPGA初心者で、備忘録として開発環境を整える方法をブログとして残しているので、多少間違っている点などもあるかもしれませんのでご了承ください。

今回設計する分周器

今回設計する分周器は、外部から3bitデータで分周比を変更できるような分周器にします。分周比のテーブルは以下の表のような形です。また、リセット信号も入れています。

M2M1M0分周比
0002
0014
0108
01116
10032
10164
110128
111256

テストベンチを作る

入力クロック(CLK_IN)と分周比選択(M0~M2)を入力するテストベンチを作成し、動作確認を行います。作成したテストベンチは次のようなものです。こちらの例では、Mbit = “011”で分周比8に設定した場合です。

library ieee;
use ieee.std_logic_1164.all;

entity tb_freq_div is
end tb_freq_div;

architecture test of tb_freq_div is
  component freq_div
    port( RST, CLK_IN : in std_logic;
          Mbit        : in std_logic_vector(2 downto 0);
          CLK_OUt     : out std_logic );
    end component;

    constant    CLK_CYCLE   : time :=   50 ns;  -- 20MHz

    signal RST	   : std_logic;
    signal CLK_IN  : std_logic;
    signal Mbit    : std_logic_vector(2 downto 0);
    signal CLK_OUT : std_logic;

begin
  U0:freq_div
  port map(
 RST     => RST,
            CLK_IN  => CLK_IN,
            Mbit    => Mbit,
            CLK_OUT => CLK_OUT );

  -- rate select
  Mbit <= "011";

  -- CLK_IN signal generate
  process begin
    CLK_IN <= '0';
    wait for CLK_CYCLE / 2;
    CLK_IN <= '1';
    wait for CLK_CYCLE / 2;
  end process;

  -- reset signal generate
  process begin   
    RST <= '0';
    wait for 500 ns;
    RST <= '1';
    wait;
  end process;

end test;

ModelSimで動作確認

先ほど作ったテストベンチを使って、VHDLプログラムの動作確認をしていきたいと思います。

ModelSimでのシミュレーションの手順はこちらの記事を参考にしてください。

【Lattice Diamond】ModelSimでシミュレーションを行う手順
今回は、Lattice DiamondでVHDL記述をした後に、ModelSimというソフトウェアを使って動作シミュレーションを行う方法について解説します。ちなみに、筆者はFPGA初心者で、備忘録として開発環境を整える方法をブログとして残し...

Mbit=”001″→1/4に分周した場合についてシミュレーションしたのが次の波形です。CLK_INが4周期分で、CLK_OUTが1周期出ていることがわかります。

分周比4(Mbit=”001″)に設定した場合

Mbit=”011″→1/16に分周した場合についてシミュレーションしたのが次の波形です。CLK_INが16周期分で、CLK_OUTが1周期出ていることがわかります。

分周比16(Mbit=”011″)に設定した場合

このようにシミュレーションで想定した動作になっていることを確認できました。

無事に、分周器の機能を実現することができました。今後も、FPGAのスキルアップを目指して、いろいろな機能の実装を練習していきたいと思います。

VHDLおすすめ書籍

コメント

タイトルとURLをコピーしました