FC2カウンター FPGAの部屋 Synthesijerを試してみる3(Test2.java)
FC2ブログ

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

FPGAの部屋

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

Synthesijerを試してみる3(Test2.java)

Lチカする java ソフトウェア Test.java だが、私は違う書き方で書きたいので書いてみた。それをTest2.java とする。
Test2.java を下に示す。

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

  public void run(){
    while(true){
      if (count <= 10){
        count++;
      } else {
        count = 0;
        flag = !flag;
      }
    }
  }
}


これを、Synthesijer でコンパイルするために、Synthesijer の make.bat を参考にして私も make.bat を作製した。なお、Cygwinで Makefile を make してみたが、java コマンドを実行した所でエラーになってしまった。java のエラー・メッセージが日本語化けでわからないので、諦めて、Windows上でバッチファイルでコンパイルすることにした。make.bat を下に示す。

java -cp C:\Users\Masaaki\Documents\Synthesijer\synthesijer-20141211.jar synthesijer.Main --vhdl --verilog^
                   Test2.java 

make.bat を実行すると、Test2.vhd と Test2.v ができる。
テストベンチ Test2_tb.v は、前回の Test_tb.v と殆ど同じだ。
シミュレーションの結果を下の図に示す。
Synthesijer_7_141220.png

このソフトウェアだと、flag_out の周期は 1.92 usec となって、前回の 1.6 usec よりも長くなった。
前回は count を一つカウントアップするまでに7ステートだったが、今回は8ステートかかっているようだ。多分だが、こちらは、count++ するのに条件をつけているので、1クロック余計に必要としているのだろう?
この辺りの事情を汲んで java コードを書いたほうが良いかもしれない?

Test2.vhd を下に示す。

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity Test2 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 Test2;

architecture RTL of Test2 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 binary_expr_00002 : std_logic := '0';
  signal unary_expr_00003 : signed(32-1 downto 0) := (others => '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_0010,
    run_method_S_0012,
    run_method_S_0013,
    run_method_S_0014,
    run_method_S_0015  
  );
  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 : std_logic;
  signal tmp_0008 : signed(32-1 downto 0);
  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_00002 = '1' else '0';
  tmp_0006 <= '1' when binary_expr_00002 = '0' else '0';
  tmp_0007 <= '1' when class_count_0001 <= X"0000000a" else '0';
  tmp_0008 <= class_count_0001 + X"00000001";
  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_0015;
          when run_method_S_0004 => 
            run_method <= run_method_S_0005;
          when run_method_S_0005 => 
            if tmp_0005 = '1' then
              run_method <= run_method_S_0007;
            elsif tmp_0006 = '1' then
              run_method <= run_method_S_0010;
            end if;
          when run_method_S_0006 => 
            run_method <= run_method_S_0014;
          when run_method_S_0007 => 
            run_method <= run_method_S_0008;
          when run_method_S_0008 => 
            run_method <= run_method_S_0009;
          when run_method_S_0009 => 
            run_method <= run_method_S_0006;
          when run_method_S_0010 => 
            run_method <= run_method_S_0012;
          when run_method_S_0012 => 
            run_method <= run_method_S_0013;
          when run_method_S_0013 => 
            run_method <= run_method_S_0006;
          when run_method_S_0014 => 
            run_method <= run_method_S_0002;
          when run_method_S_0015 => 
            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_0012 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_0008 then
          class_count_0001 <= unary_expr_00003;
        elsif run_method = run_method_S_0010 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
        binary_expr_00002 <= '0';
      else
        if run_method = run_method_S_0004 then
          binary_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
        unary_expr_00003 <= (others => '0');
      else
        if run_method = run_method_S_0007 then
          unary_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_0010 then
          unary_expr_00004 <= tmp_0009;
        end if;
      end if;
    end if;
  end process;

  run_req_flag <= tmp_0002;



end RTL;

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

コメント

コメントの投稿


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

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