2017-07-12 5 views
0

VHDLで画像ヒストグラムを計算しようとしています。私は強度値が24ビットで、強度レベルが大きすぎるので、ビン(1920 max)を作成する必要があります。 入力ピクセルごとの強度値とビン値の決定に問題がありますので、ビン値をアドレスとして使用してBRAMのカウントを更新することができます。VHDLでのヒストグラム計算

シミュレーションしながら、私はエラーを取得する:私に教えてくださいビンを計算する別の方法がある場合は反復制限が

に達しました。ありがとう!

declaration--

signal data_in : std_logic_vector(23 downto 0); 
signal bin : std_logic_vector(11 downto 0); 
signal s_data_in : integer ; 
signal s_binsize : integer :=2048; 
signal s_bin : integer ; 
signal s_bincount : integer :=0 ; 
signal s_temp: integer :=2048; 

p_clk: process 
begin 
    s_clk <= '0'; 
    while (s_SimuDone /= 'H') loop 
    wait for C_CLOCK_PERIOD/2; 
    s_clk <= not s_clk; 
    end loop; 
    wait; 
end process p_clk; 

stimulus: process 
begin 
    data_in <= x"0000ff"; 
    wait for C_CLOCK_PERIOD*10; 
    data_in <= x"00000f"; 
    wait for C_CLOCK_PERIOD*10; 
    data_in <= x"000fff"; 
    wait for C_CLOCK_PERIOD*10; 
    data_in <= x"0fffff"; 
    wait; 
end process stimulus; 
s_data_in <= to_integer(unsigned (data_in)); 
bin <= std_logic_vector(to_unsigned(s_bin, 12)); 

process (s_data_in, s_bincount) 
begin 
    if (s_data_in < s_binsize) then 
     s_bin <= 0; 
    else if (s_data_in < s_temp) then 
      s_bin <= s_bincount; 
      s_bincount <= 0; 
      s_temp <= 2048; 
     else 
      s_bincount <= s_bincount + 1; 
      s_temp <= s_temp + s_binsize; 
     end if;  
    end if; 
end process; 
+0

これはあなたが探している答えとは関係ありませんが、2番目のプロセスは実際に合成するRTLの一部であるため、別のエンティティにあるはずです。これは、テストベンチの一部としてヒストグラムを作成しない限りです。しかし、それでも.... – Renato

+0

はい、それは正しいです。私はそれを別にしましたが、ここに示すために私はそうしました。私は1クロックサイクルでアドレスを見つけることができるようにしたいので、そこでclkを追加することはできません。 – user3094049

+0

ok私は古い回答を削除し、新しい回答を追加しました。あなたが望むのは、data_inを2048で除算するだけなので、プロセスは必要ありません。 – Renato

答えて

0

エラーが原因の文s_bincount <= s_bincount + 1に1つのシミュレーションデルタであまりにも多くの反復に関係しています。デザインは同期的なので、クロックを指定する必要があります。 しかし、あなたは、次のテストベンチを変更することができます必要なものだけで行うには:あなたが望むが、あなたは、この場合にする必要がない場合

signal data_in : std_logic_vector(23 downto 0); 
signal bin : std_logic_vector(11 downto 0); 
signal s_data_in : integer ; 
signal s_binsize : integer :=2048; 
signal s_bin : integer ; 
signal s_bincount : integer :=0 ; 
signal s_temp: integer :=2048; 

p_clk: process 
begin 
    s_clk <= '0'; 
    while (s_SimuDone /= 'H') loop 
    wait for C_CLOCK_PERIOD/2; 
    s_clk <= not s_clk; 
    end loop; 
    wait; 
end process p_clk; 

stimulus: process 
begin 
    data_in <= x"0000ff"; 
    wait for C_CLOCK_PERIOD*10; 
    data_in <= x"00000f"; 
    wait for C_CLOCK_PERIOD*10; 
    data_in <= x"000fff"; 
    wait for C_CLOCK_PERIOD*10; 
    data_in <= x"0fffff"; 
    wait; 
end process stimulus; 
s_data_in <= to_integer(unsigned (data_in)); 

bin <= data_in(22 downto 11); 

あなたはビンクロックド変数を作ることができます。 binは実際には13ビットで、12ではありません。

これをシミュレートしてお知らせください。

+0

このエラーは、 's_bincount <= s_bincount + 1'というステートメントのために1つのシミュレーションデルタで反復回数が多すぎるために発生します。デザインは同期的なので、クロックを指定する必要があります。 – Renato

関連する問題