前回作成した分周器のVHDLプログラムについて、ModelSimというシミュレーションソフトを使って、動作確認を行っていきたいと思います。
前回のVHDL作成の記事はこちらです。
【FPGA学習】分周器を作る①~VHDLでの記述~
FPGAの使い方のお勉強として、今回は『分周器』をVHDLで実装していきたいと思います。分周器とは、クロック信号等の周波数を整数分の1に落とす装置のことです。例えば、16MHzのクロック信号を4分の1の4MHzにするといった感じです。 ちな...
ちなみに、筆者はFPGA初心者で、備忘録として開発環境を整える方法をブログとして残しているので、多少間違っている点などもあるかもしれませんのでご了承ください。
今回設計する分周器
今回設計する分周器は、外部から3bitデータで分周比を変更できるような分周器にします。分周比のテーブルは以下の表のような形です。また、リセット信号も入れています。
M2 | M1 | M0 | 分周比 |
0 | 0 | 0 | 2 |
0 | 0 | 1 | 4 |
0 | 1 | 0 | 8 |
0 | 1 | 1 | 16 |
1 | 0 | 0 | 32 |
1 | 0 | 1 | 64 |
1 | 1 | 0 | 128 |
1 | 1 | 1 | 256 |
テストベンチを作る
入力クロック(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周期出ていることがわかります。
Mbit=”011″→1/16に分周した場合についてシミュレーションしたのが次の波形です。CLK_INが16周期分で、CLK_OUTが1周期出ていることがわかります。
このようにシミュレーションで想定した動作になっていることを確認できました。
無事に、分周器の機能を実現することができました。今後も、FPGAのスキルアップを目指して、いろいろな機能の実装を練習していきたいと思います。
VHDLおすすめ書籍
リンク
コメント