FC2カウンター FPGAの部屋 Altium Designer でC to Hardware のサンプルを試してみる1
FC2ブログ

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

FPGAの部屋

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

Altium Designer でC to Hardware のサンプルを試してみる1

日曜日にFPGA-CAFE でNonoBoard3000シリーズを借りてきた。今回は、Altium Designer でC to Hardware のサンプルを試してみることにする。

まずは、Altium Designer のサンプルデザインのページからTutorials (2 MB) をダウンロードして展開した。その中に入っているCHC Accumulator をやってみることにした。

・CHC Accumulatorの回路図を開くと、CのモジュールとCustom Instrument が入っていた。
Altium_Designer_C2H_1_120426.png

・Cの関数、Accumulateはスタティックな変数を定義して、それに入力の数を累算していくシンプルなプログラムだった。
Altium_Designer_C2H_2_120426.png

・このチュートリアルをコンパイルというかXilinx で言うとインプリメントするのだが、このプロジェクトはもう1つのFPGAボード、Desktop NanoBoard NB2DSK01用のプロジェクトだった。そのためNonoBoard3000シリーズ用に制約ファイルを追加して、新しいコンフィギュレーションを追加し、そっちに切り替える必要がある。

・Documents\Altium\AD 10\Library\FPGAにあるNB3000XN.05.Constraintをプロジェクトに追加した。
Altium_Designer_C2H_3_120426.png

・プロジェクトメニューからコンフィギュレーション マネージャを開く。

・NB3000XNのコンフィギュレーションを追加して、CHC_Accumulator.ConstraintとNB3000XN.05.Constraintにチェックを入れた。
Altium_Designer_C2H_4_120426.png

・表示からデバイスビューを表示して、Program FPGAをクリックした。FPGAのインプリメントが開始されて、FPGAにビットファイルがダウンロードされた。
Altium_Designer_C2H_5_120426.png

・CUSTOM_INSTRUMENT をダブルクリックすると、Instrument Rack が開いた。Totalは最初は0になっている。
Altium_Designer_C2H_6_120426.png

・Value に値をセットしてAdd ボタンをクリックすると足された数がTotalに表示される。
Altium_Designer_C2H_7_120426.png

これでC to Hardware のサンプルはやって見ることができたが、CがどのようにVHDLに落ちているかを見てみよう。

・Cプログラムはchc_accumulator_u_accumulate.VHD という名前のVHDLファイルに変換されて600行程度になったようだ。DONE信号が増えているので、加算処理に複数クロック掛かる可能性があると思う。
Altium_Designer_C2H_8_120426.png

・ISEのプロジェクトを作成して、まずはchc_accumulator_u_accumulate.VHD をコンパイルしてみた。
Altium_Designer_C2H_9_120426.png

・次にシミュレーションを行った。下に示すテストベンチを作成してISimでシミュレーションを行った。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY Accumulate_tb IS
END Accumulate_tb;
 
ARCHITECTURE behavior OF Accumulate_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT CHC_Accumulator_U_Accumulate
    PORT(
         CLOCK : IN  std_logic;
         DONE : OUT  std_logic;
         RESET : IN  std_logic;
         RESET_DONE : OUT  std_logic;
         START : IN  std_logic;
         TOTAL_O : OUT  std_logic_vector(31 downto 0);
         VALUE_I : IN  std_logic_vector(31 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal CLOCK : std_logic := '0';
   signal RESET : std_logic := '0';
   signal START : std_logic := '0';
   signal VALUE_I : std_logic_vector(31 downto 0) := (others => '0');

     --Outputs
   signal DONE : std_logic;
   signal RESET_DONE : std_logic;
   signal TOTAL_O : std_logic_vector(31 downto 0);

   -- Clock period definitions
   constant CLOCK_period : time := 10 ns;
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: CHC_Accumulator_U_Accumulate PORT MAP (
          CLOCK => CLOCK,
          DONE => DONE,
          RESET => RESET,
          RESET_DONE => RESET_DONE,
          START => START,
          TOTAL_O => TOTAL_O,
          VALUE_I => VALUE_I
        );

   -- Clock process definitions
   CLOCK_process :process
   begin
        CLOCK <= '0';
        wait for CLOCK_period/2;
        CLOCK <= '1';
        wait for CLOCK_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
   begin
      RESET <= '1';
      START <= '0';
      VALUE_I <= CONV_STD_LOGIC_VECTOR(0,32);
      -- hold reset state for 100 ns.
      wait for 100 ns;    
      
      RESET <= '0';
      
      wait for CLOCK_period*10;

      -- insert stimulus here 
      START <= '1';
      VALUE_I <= CONV_STD_LOGIC_VECTOR(64,32);
      
      wait for CLOCK_period;
      START <= '0';
      
      wait for CLOCK_period*3;
      START <= '1';
      VALUE_I <= CONV_STD_LOGIC_VECTOR(128,32);
      
      wait for CLOCK_period;
      START <= '0';

      wait;
   end process;

END;



・シミュレーション結果の波形を下に示す。
Altium_Designer_C2H_10_120426.png

startが1になると、すぐにdone が0に下がる。done の出力は組み合わせ回路を使用しているようだ。start が1になってから2つ目のclock の立ち上がりでdone が1に上がるので、3つ目のクロックでdone が1になったのをサンプルできる。同時にtotal_o にも累算結果が出てくる。ここでのクロックに対するレイテンシは3クロックと言うことができる。
  1. 2012年04月26日 05:38 |
  2. Altium Designer
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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