2017-01-14 14 views
0

整数の初期化について問題があります。整数の配列を初期化する

package mytypes is 
    type gamma_cor_array is array (NATURAL RANGE <>) of integer range 15 downto 0; 
end mytypes; 

library UNISIM; 
use UNISIM.VComponents.all; 
use work.mytypes.all; 

entity gamma_correction is 
    GENERIC (DEPH : natural:=4; GAMMA_COR : real:=1.0); 
    Port (clk : in STD_LOGIC; 
     gamma_cor_array_s : out gamma_cor_array(2**DEPH-1 downto 0):= (others => 0)); 

end gamma_correction; 

architecture Behavioral of gamma_correction is 

begin 
    PROCESS (clk) BEGIN 
     IF rising_edge(clk) THEN 
      for i in 0 to (2**DEPH - 1) loop 
       gamma_cor_array_s(i) <= integer(((real(i)/real(2**DEPH - 1))**GAMMA_COR)*real(2**DEPH - 1)); 
      end loop; 
     end if; 
    end process; 
end Behavioral; 

私はこれらの警告を得る:

警告:XSTで:2404 - のFF /ラッチ< 1:1 >>( のinit値なし)は、ブロック0の一定の値を持っています。

警告:Xst:2404 - FFs/Latches < 1:2 >>( 初期値なし)はブロック内で一定の値を持ちます。

警告:Xst:2404 - FFs/Latches < 1:2 >>( 初期値なし)はブロック内で一定の値を持ちます。

警告:Xst:2404 - FFs/Latches < 1:2 >>( 初期値なし)はブロック内で一定の値を持ちます。

警告:Xst:2404 - FFs /ラッチ< 3:3 >>( 初期値なし)は、ブロック内で一定の値を持ちます。

警告:Xst:2404 - FFs /ラッチ< 1:3 >>( 初期値なし)はブロックで一定の値を持ちます。

警告:Xst:2404 - FFs /ラッチ< 1:4 >>( 初期値なし)はブロック内で一定の値を持ちます。

私のコードは正常に動作しています。初期値は0ですが、警告は残っています。どうすればそれらを取り除くことができますか?

答えて

2

gamma_cor_array_sクラスが定数ではないのはなぜですか? GAMMA_CORはクラス定数でDEPHなので、フリップフロップは不要で、gamma_cor_sを使用する場所を初期化する関数を作成し、エンティティ/アーキテクチャのペアを使用しないでください。

gamma_cor_sの値がrising_edge(CLK)後(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)あるれるとおり

library ieee; 
use ieee.std_logic_1164.all; 
use work.mytypes.all; -- type gamma_cor_array 

entity gam_cor_tb is 
end entity; 
architecture foo of gam_cor_tb is 
    signal clk: std_logic := '0'; 
    constant DEPH: natural := 4; 
    constant GAMMA_COR: real := 1.0; 
    signal gamma_cor_array_s: 
       gamma_cor_array (2 ** DEPH - 1 downto 0) ; 
begin 
CLOCK: 
    process 
    begin 
     wait for 10 ns; 
     clk <= not clk; 
     wait for 10 ns; 
     wait; -- one ping only 
    end process; 
DUT: 
    entity work.gamma_correction 
     generic map (
      DEPH => DEPH, 
      GAMMA_COR => GAMMA_COR 
     ) 
     port map (
      clk => clk, 
      gamma_cor_array_s => gamma_cor_array_s 
     ); 
MONITOR: 
    process (gamma_cor_array_s) 
    begin 
     for i in 0 to (2 ** DEPH - 1) loop 
      report "gamma_cor_array_s(" & integer'image(i) & ") = " & 
        integer'image(gamma_cor_array_s(i)); 
     end loop; 
    end process; 
end architecture; 

結果:

gamma_corrections.vhdl:13:75 @は0ms(レポート注): gamma_cor_array_s(0) = 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポートノート):gamma_cor_array_s(1)= 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポート メモ):gamma_cor_array_s = 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポートノート):gamma_cor_array_s(3 (レポートの注釈):gamma_cor_array_s(4)= 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポート の注釈):gamma_cor_array_s(5)= 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポートノート):gamma_cor_array_s(6) = 0 gamma_corrections.vhdl:75:13:@ 0ms :(レポートノート):gamma_cor_array_s(7)= 0 gamma_corrections.vhdl:75 (レポートノート):gamma_cor_array_s(9) = 0 gamma_corrections.vhdl:75:13:@ 0ms :(レポート 注)gamma_cor_array_s(8)= 0 gamma_corrections.vhdl:75:13: @ 0ms :(レポートノート):gamma_cor_array_s(10)= 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポート ノート):gamma_cor_array_s(11)= 0 gamma_corrections。gamma_cor_array_s(12) = 0 gamma_corrections.vhdl:75:13:@ 0ms:(レポートノート):gamma_cor_array_s(13)= 0 gamma_corrections.vhdl:75:13 (レポートノート):gamma_cor_array_s(15) = 0 gamma_corrections.vhdl:75:13:@ 10ns(レポート 注):gamma_cor_array_s(14)= 0 gamma_corrections.vhdl:75:13:@ 0ms: (レポートノート):gamma_cor_array_s(0)= 0 gamma_corrections.vhdl:75:13:@ 10ns:(レポート メモ):gamma_cor_array_s(1)= 1 gamma_corrections.vhdl:75:13:@ 10ns: (レポートのノート):gamma_cor_array_s(3)= 3 gamma_corrections.vhdl:75:13:@ 10ns:(レポート メモ):gamma_cor_array_s(3)= gamma_cor_array_s(2) = 2 gamma_corrections.vhdl:75:13: 4)= 4 gamma_corrections.vhdl:75:13:@ 10ns :(レポートノート):ガンマgamma_cor_array_s(6)= 6 gamma_corrections.vhdl:75:13:@ 10ns:(レポート の注釈):gamma_cor_array_s(6)= gamma_cor_array_s(5) = 5 gamma_corrections.vhdl:75:13: = 7 gamma_corrections.vhdl:75:13:@ 10ns:(レポートノート):gamma_cor_array_s(8) = 8 gamma_corrections.vhdl:75:13:@ 10ns :(レポートノート):gamma_cor_array_s(9)= 9 gamma_corrections。 VHDL:13:75( 音符を報告):gamma_cor_array_s(10)= 10 gamma_corrections.vhdl:13:75(レポート注): gamma_cor_array_s(11)= 11 gamma_corrections.vhdl:75 10nsの@ 10nsの@ :13:( 音符を報告):gamma_cor_array_s(12)= 12 gamma_corrections.vhdl:75:13:10nsの@:(レポート注): gamma_cor_array_s(13)= 13 gamma_corrections.vhdl:75:13 @ 10nsの: @ 10ns :(レポート 注):あなたは、64個のフリップフロップを宣言し、すべてにそれらを初期化し gamma_cor_array_s(15)= 15

:75:13:10nsの@:(レポートノート)gamma_cor_array_s(14)が14 gamma_corrections.vhdlを= '0'、そのうち30個だけが '1'に変更されました - あなたはすべての警告を表示しませんでした(ここでは無視できます)。実数型の使用は移植性がありません(実数値は近似値です)。

エンティティgamma_correctionのコンテキスト句は次のようになります。

library ieee; 
    ieee.std_logic_1164.all; -- for type std_logic, function rising_edge 
    use ieee.math_real.all; -- for function "**" [integer, real return real] 
    use work.mytypes.all; -- for type gamma_cor_array 

UNISIMへの参照が必要とされていません。定数を初期化する代わりに、別のエンティティとアーキテクチャで発生した信号を使用するため

architecture fum of gam_cor_tb is 
    signal clk: std_logic := '0'; 
    constant DEPH: natural := 4; 
    constant GAMMA_COR: real := 1.0; 
    -- signal gamma_cor_array_s: 
    --    gamma_cor_array (2 ** DEPH - 1 downto 0) ; 

    function gamma_correct return gamma_cor_array is -- added pure function 
     use ieee.math_real.all; 
     variable gamma_cor_array_s: gamma_cor_array(2 ** DEPH - 1 downto 0); 
    begin 
     for i in 0 to (2 ** DEPH - 1) loop 
      gamma_cor_array_s(i) := integer (
       ((real(i)/real (2 ** DEPH - 1)) ** GAMMA_COR) * 
        real(2 ** DEPH - 1) 
      ); 
     end loop; 
     return gamma_cor_array_s; 
    end function; 

    constant gamma_cor_array_s: -- previously a signal 
       gamma_cor_array (2 ** DEPH - 1 downto 0) := gamma_correct; 
begin 
-- CLOCK: 
--  process 
--  begin 
--   wait for 10 ns; 
--   clk <= not clk; 
--   wait for 10 ns; 
--   wait; -- one ping only 
--  end process; 
-- DUT: 
--  entity work.gamma_correction 
--   generic map (
--    DEPH => DEPH, 
--    GAMMA_COR => GAMMA_COR 
--  ) 
--   port map (
--    clk => clk, 
--    gamma_cor_array_s => gamma_cor_array_s 
--  ); 
MONITOR: 
    process -- (gamma_cor_array_s) 
    begin 
     for i in 0 to (2 ** DEPH - 1) loop 
      report "gamma_cor_array_s(" & integer'image(i) & ") = " & 
        integer'image(gamma_cor_array_s(i)); 
     end loop; 
     wait; 
    end process; 
end architecture; 

機能仕様は、以前エンティティgamma_correctionに汎用定数として渡された定数の範囲内にあることが必要です。

この関数は、ガンマ補正を決定するルックアップテーブルである定数を初期化するために使用されます。

イベントに基づいてプロセス間で値を伝達するシグナルがないことに注意してください。あなたはgamma_cor_array_sを割り当てましたが、値は決して変更されませんでした(エンティティgamma_correctionのアーキテクチャのプロセスのドライバ)。

出力値は次のとおり

gamma_corrections.vhdl:126:13:@は0ms(レポート注):gamma_cor_array_s(0) = 0 gamma_corrections.vhdl:126:13:@は0ms :(gamma_cor_array_s(1)= 1 gamma_corrections.vhdl:126:13:@ 0ms:(レポート メモ):gamma_cor_array_s(2)= 2 gamma_corrections.vhdl:126:13:@ 0ms :(レポートノート): gamma_cor_array_s(3) = 3 gamma_corrections。gamma_cor_array_s(4)= 4 gamma_corrections.vhdl:126:13:@ 0ms:(レポート メモ):gamma_cor_array_s(5)= 5 gamma_corrections.vhdl:126:vhdl:126:13: gamma_cor_array_s(6) = 6 gamma_corrections.vhdl:126:13:@ 0ms:(レポートノート):gamma_cor_array_s(7)= 7 gamma_corrections.vhdl:126:13:@ 0ms: gamma_cor_array_s(8)= 8 gamma_corrections.vhdl:126:13:@ 0ms:(レポートノート):gamma_cor_array_s(9) = 9 gamma_corrections.vhdl:126:13:@ 0ms :(レポートノート):gamma_cor_array_s(10)= 10 gamma_corrections.vhdl:126:13:@ 0ms:(レポート 注):gamma_cor_array_s(11)= 11 gamma_corrections.vhdl:126:13:@ 0ms:(レポートノート): gamma_cor_array_s (12)= 12 gamma_corrections.vhdl:126:13:@ 0ms:(レポート 注):126:13:@は0ms(レポート注): gamma_cor_array_s(14)= 14 gamma_corrections.vhdl:126:13:@は0ms( 音符を報告)gamma_cor_array_s(13)13 gamma_corrections.vhdlを= :gamma_cor_array_s(15)は、クロックの立ち上がりエッジの後、前の信号の値と一致15

を=。

それはXSTでのいくつかのため、これらの警告を報告し

+0

ありがとうございます。あなたは私をたくさん助けてくれました。私はすべての私の友人にあなたのサイトをお勧めします... –

+0

[良い質問](https://stackoverflow.com/help/how-to-ask)良い答えを引き付けることができます。その結果は単なる質問と答え以上のものになります。彼らは、同じまたは同様の問題を持つ人のためのリソースになることができます。 – user1155120

0
(同時文が割り当てのためのプロセスを詳しく説明します)これは、すべての割り当ては、1つのプロセスで実行されている必要があり、動的な割り当てを受け、gamma_cor_array_s信号を作るために

可能です配列要素は0に固定されているため、レジスタは不要で最適化できます。警告を取り除くには、登録記述を削除する必要があります。または、警告を無視してください。または、ISEでフィルタリングします。

残りの配列要素は、最初のクロックエッジの後に一定の値を持ちます。初期値(最初のクロックエッジの前)が気にかからない場合は、アレイ出力の初期値を削除してください。ここで、これらの配列要素に対してレジスタを削除することもできます。

常に一定の値が必要な場合は、クロックは不要です。プロセスを今すぐに減らすことができます

PROCESS BEGIN 
    for i in 0 to (2**DEPH - 1) loop 
     gamma_cor_array_s(i) <= integer(((real(i)/real(2**DEPH - 1))**GAMMA_COR)*real(2**DEPH - 1)); 
    end loop; 
    wait; 
end process;