FC2カウンター FPGAの部屋 Synthesijerを試してみる1(VHDLファイルを出力)
FC2ブログ

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

FPGAの部屋

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

Synthesijerを試してみる1(VHDLファイルを出力)

Synthesijer を試してみることにした。まずはLチカからか。
Synthesijer はjava ベースの高位合成ツールだ。わらさぼで作られている。java はあまり分からないがサンプルをやってみようと思う。
Vivado HLSとくらべて、どんなHDLコードが出力されるのかを見てみたい。
環境がよくわからないんだけど、Linuxは問題無いとして、Windowsでも行けるのだろうか?(javaだからjava が動けばどれでもよいんですね?)
とりあえず、Windowsでやってみようと思う。

sourceforge のSynthesijer からsynthesijer-20141211.jar をダウンロードした。

Synthesijer のページから Writing 1st Program を Test.jave をコピー&ペーストして、作製した。Test.java を引用する。

public class Test{
  public boolean flag;
  private int count;

  public void run(){
    while(true){
      count++;
      if(count > 5000000){
    count = 0;
    flag = !flag;
      }
    }
  }
}


・Synthesijer フォルダを作製して、synthesijer-20141211.jar と Test.java を入れて

java -cp synthesijer-20141211.jar synthesijer.Main Test.java

コマンドを実行すると Test.vhd ファイルを出力した。
Synthesijer_1_141217.png

・現在使用している java のバージョンは 1.7.0_17 だ。無事に実行できた。
Synthesijer_2_141217.png

・Synthesijer フォルダを見ると、いろいろな中間ファイルが生成されていた。Test.vhd も生成されていた。
Synthesijer_3_141217.png

・Test.vhd を見ると、clk, reset, flag_in, flag_we, flag_out, run_req, run_busy のポートが生成されている。出力ポートは flag_out, run_busy で、後は入力ポートだ。
ステートは、run_method_IDLE から run_method_S_0014 までの16ステートある。
どうやら、tmp_0007 で class_count_0001 を +1 して、tmp_0008 で、class_count_0001 が 0x4C4B40 (5000000) 以上になった時を判定しているようだ。

・Test.vhd を下に示す。

ibrary IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity Test is
  port (
    clk : in std_logic;
    reset : in std_logic;
    flag_in : in std_logic;
    flag_we : in std_logic;
    flag_out : out std_logic;
    run_req : in std_logic;
    run_busy : out std_logic
  );
end Test;

architecture RTL of Test is


  signal clk_sig : std_logic;
  signal reset_sig : std_logic;
  signal flag_in_sig : std_logic;
  signal flag_we_sig : std_logic;
  signal flag_out_sig : std_logic;
  signal run_req_sig : std_logic;
  signal run_busy_sig : std_logic := '1';

  signal class_flag_0000 : std_logic := '0';
  signal class_flag_0000_mux : std_logic;
  signal tmp_0001 : std_logic;
  signal class_count_0001 : signed(32-1 downto 0) := (others => '0');
  signal unary_expr_00002 : signed(32-1 downto 0) := (others => '0');
  signal binary_expr_00003 : std_logic := '0';
  signal unary_expr_00004 : std_logic := '0';
  signal run_req_flag : std_logic;
  signal run_req_local : std_logic := '0';
  signal tmp_0002 : std_logic;
  type Type_run_method is (
    run_method_IDLE,
    run_method_S_0000,
    run_method_S_0001,
    run_method_S_0002,
    run_method_S_0003,
    run_method_S_0004,
    run_method_S_0005,
    run_method_S_0006,
    run_method_S_0007,
    run_method_S_0008,
    run_method_S_0009,
    run_method_S_0011,
    run_method_S_0012,
    run_method_S_0013,
    run_method_S_0014  
  );
  signal run_method : Type_run_method := run_method_IDLE;
  signal run_method_delay : signed(32-1 downto 0) := (others => '0');
  signal tmp_0003 : std_logic;
  signal tmp_0004 : std_logic;
  signal tmp_0005 : std_logic;
  signal tmp_0006 : std_logic;
  signal tmp_0007 : signed(32-1 downto 0);
  signal tmp_0008 : std_logic;
  signal tmp_0009 : std_logic;

begin

  clk_sig <= clk;
  reset_sig <= reset;
  flag_in_sig <= flag_in;
  flag_we_sig <= flag_we;
  flag_out <= flag_out_sig;
  flag_out_sig <= class_flag_0000;

  run_req_sig <= run_req;
  run_busy <= run_busy_sig;
  process(clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        run_busy_sig <= '1';
      else
        if run_method = run_method_S_0001 then
          run_busy_sig <= run_req_flag;
        end if;
      end if;
    end if;
  end process;


  -- expressions
  tmp_0001 <= flag_in_sig when flag_we_sig = '1' else class_flag_0000;
  tmp_0002 <= run_req_local or run_req_sig;
  tmp_0003 <= '1' and '1';
  tmp_0004 <= '1' and '0';
  tmp_0005 <= '1' when binary_expr_00003 = '1' else '0';
  tmp_0006 <= '1' when binary_expr_00003 = '0' else '0';
  tmp_0007 <= class_count_0001 + X"00000001";
  tmp_0008 <= '1' when class_count_0001 > X"004c4b40" else '0';
  tmp_0009 <= not class_flag_0000;

  -- sequencers
  process (clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        run_method <= run_method_IDLE;
        run_method_delay <= (others => '0');
      else
        case (run_method) is
          when run_method_IDLE => 
            run_method <= run_method_S_0000;
          when run_method_S_0000 => 
            run_method <= run_method_S_0001;
            run_method <= run_method_S_0001;
          when run_method_S_0001 => 
            if run_req_flag = '1' then
              run_method <= run_method_S_0002;
            end if;
          when run_method_S_0002 => 
            if tmp_0003 = '1' then
              run_method <= run_method_S_0004;
            elsif tmp_0004 = '1' then
              run_method <= run_method_S_0003;
            end if;
          when run_method_S_0003 => 
            run_method <= run_method_S_0014;
          when run_method_S_0004 => 
            run_method <= run_method_S_0005;
          when run_method_S_0005 => 
            run_method <= run_method_S_0006;
          when run_method_S_0006 => 
            run_method <= run_method_S_0007;
          when run_method_S_0007 => 
            if tmp_0005 = '1' then
              run_method <= run_method_S_0009;
            elsif tmp_0006 = '1' then
              run_method <= run_method_S_0008;
            end if;
          when run_method_S_0008 => 
            run_method <= run_method_S_0013;
          when run_method_S_0009 => 
            run_method <= run_method_S_0011;
          when run_method_S_0011 => 
            run_method <= run_method_S_0012;
          when run_method_S_0012 => 
            run_method <= run_method_S_0008;
          when run_method_S_0013 => 
            run_method <= run_method_S_0002;
          when run_method_S_0014 => 
            run_method <= run_method_S_0000;
          when others => null;
        end case;
      end if;
    end if;
  end process;


  process(clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        class_flag_0000 <= '0';
      else
        if run_method = run_method_S_0011 then
          class_flag_0000 <= unary_expr_00004;
        else
          class_flag_0000 <= class_flag_0000_mux;
        end if;
      end if;
    end if;
  end process;

  class_flag_0000_mux <= tmp_0001;

  process(clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        class_count_0001 <= (others => '0');
      else
        if run_method = run_method_S_0005 then
          class_count_0001 <= unary_expr_00002;
        elsif run_method = run_method_S_0009 then
          class_count_0001 <= X"00000000";
        end if;
      end if;
    end if;
  end process;

  process(clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        unary_expr_00002 <= (others => '0');
      else
        if run_method = run_method_S_0004 then
          unary_expr_00002 <= tmp_0007;
        end if;
      end if;
    end if;
  end process;

  process(clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        binary_expr_00003 <= '0';
      else
        if run_method = run_method_S_0006 then
          binary_expr_00003 <= tmp_0008;
        end if;
      end if;
    end if;
  end process;

  process(clk)
  begin
    if clk'event and clk = '1' then
      if reset = '1' then
        unary_expr_00004 <= '0';
      else
        if run_method = run_method_S_0009 then
          unary_expr_00004 <= tmp_0009;
        end if;
      end if;
    end if;
  end process;

  run_req_flag <= tmp_0002;



end RTL;

  1. 2014年12月17日 05:54 |
  2. Synthesijer
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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