FC2カウンター FPGAの部屋 ISE11.1iのチュートリアル4(テストベンチの作成)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ISE11.1iのチュートリアル4(テストベンチの作成)

”ISE11.1iのチュートリアル3(制約 (UCF) の作成)”の続き。

今回はシミュレーションの準備のためにテストベンチを作る。ISE10.1までは、テストベンチを生成するツールがついていて、それによって簡易的にテストベンチを作れたが、今回はテンプレートを見ながら自分で作れということなので、1回り面倒になってしまった。以前のツールをそのままにしたもらったほうが下位モジュールを簡易にシミュレーションしたいときには便利だったのだが。。。復活を望む。

それでは、シミュレーション用のテストベンチを作るところから始めよう。
Project NavigatorのDesignの下のSources for: でBehavioral Simulationを選択する。
ISE11_1_tutorial_34_090513.png

ProjectメニューからNew Source...を選択する。
ISE11_1_tutorial_35_090513.png

New Source WizardのSelect Source Typeダイアログが開く。VHDL Test Bench を選んでFile Name : にdice_top_tb と入力して、Next > ボタンをクリックする。
ISE11_1_tutorial_36_090513.png

Associate Sourceダイアログが開く。どのVHDLファイルのテストベンチかを指定する。ここでは、一番トップのdice_topを選択し、Next > ボタンをクリックする。
ISE11_1_tutorial_37_090513.png

Summaryダイアログが開く。Finishボタンをクリックする。
ISE11_1_tutorial_38_090513.png

そうすると、左のDesign、Hierarchyペインにはdice_top_tb.vhdが階層の一番上に作られる。
ISE11_1_tutorial_39_090513.png

そして、右のWorkspaceペインには、生成されたdice_top_tb.vhd が表示される。一番前のコメント分を除いて、生成されたコードを下に示す。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
 
ENTITY dice_top_tb IS
END dice_top_tb;
 
ARCHITECTURE behavior OF dice_top_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT dice_top
    PORT(
         reset_sw : IN  std_logic;
         clk : IN  std_logic;
         roll : IN  std_logic;
         an_n : OUT  std_logic_vector(3 downto 0);
         a_n : OUT  std_logic;
         b_n : OUT  std_logic;
         c_n : OUT  std_logic;
         d_n : OUT  std_logic;
         e_n : OUT  std_logic;
         f_n : OUT  std_logic;
         g_n : OUT  std_logic;
         dp_n : OUT  std_logic
        );
    END COMPONENT;
    

   --Inputs
   signal reset_sw : std_logic := '0';
   signal clk : std_logic := '0';
   signal roll : std_logic := '0';

     --Outputs
   signal an_n : std_logic_vector(3 downto 0);
   signal a_n : std_logic;
   signal b_n : std_logic;
   signal c_n : std_logic;
   signal d_n : std_logic;
   signal e_n : std_logic;
   signal f_n : std_logic;
   signal g_n : std_logic;
   signal dp_n : std_logic;

   -- Clock period definitions
   constant clk_period : time := 1us;
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: dice_top PORT MAP (
          reset_sw => reset_sw,
          clk => clk,
          roll => roll,
          an_n => an_n,
          a_n => a_n,
          b_n => b_n,
          c_n => c_n,
          d_n => d_n,
          e_n => e_n,
          f_n => f_n,
          g_n => g_n,
          dp_n => dp_n
        );

   -- Clock process definitions
   clk_process :process
   begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100ms.
      wait for 100ms;    

      wait for clk_period*10;

      -- insert stimulus here 

      wait;
   end process;

END;


かなりのコードがテンプレートとして用意される。これだと出力の検証を入れなければ、入力のスティミュラスを生成すればよいことになる。
そこで、以前このブログで紹介したタイミングチャートお絵かきツールTimingAnalyzerのVHDLテストベンチ生成スクリプトを使おうと思ってやってみたのだが、うまくスクリプトが動作しなかった。トラブル解析は後ですることにして、自分で入力波形を書いてみることにする。
下の図のタイミングチャート通りに波形を入力することにした。
ISE11_1_tutorial_40_090513.png

スティミュラスを書きこんで、上のタイミングチャート通りの波形を作る。下が書き換えた部分のスティミュラスプロセスだ。

    -- Stimulus process
    stim_proc: process
    begin    
        -- クロックは0から始まっているので、1クロック期間waitしても0から0までのwaitなので、レースが起こる心配はない。
        reset_sw <= '1'; roll <= '0';
        -- hold reset state for clk_period.
        wait for clk_period;
        reset_sw <= '0';
        wait for clk_period; -- 1クロック期間空けてからrollを1にする
        roll <= '1';
        wait for clk_period*42; -- 42クロック期間空けてrollを0に戻す
        roll <= '0';
 
        wait;
    end process;


最後に75行目のclk_periodが1usになっているので、これを動作周波数50MHzの周期20nsに変更する。

-- Clock period definitions
constant clk_period : time := 20ns;


テストベンチを作ってみて、かなりの部分をツールが書いてくれるので、だいぶ楽だった。惜しいのは、今回はだいぶ簡単なスティミュラスだったので良いのだが、複雑になってくると、waitを入れるのが大変なのでTimingAnalyzerでテストベンチを生成できると良いと思った。それともあきらめてprocedureを使って書くとかしたほうが良いかも?

”ISE11.1iのチュートリアル5(シミュレーション)”続く。
  1. 2009年05月14日 05:38 |
  2. FPGAリテラシー及びチュートリアル
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1108-0f368580
この記事にトラックバックする(FC2ブログユーザー)