2017-01-14 64 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 >>(不 初始化值)爲0的塊的恆定值。

警告:Xst:2404 - FFs/Latches < 1:2 >>(沒有 初始值)在塊中具有常數值0。

警告:Xst:2404 - FFs/Latches < 1:2 >>(沒有 初始值)在塊中具有常數值0。

警告:Xst:2404 - FFs/Latches < 1:2 >>(沒有 初始值)在塊中具有常數值0。

警告:Xst:2404 - FFs/Latches < 3:3 >>(沒有 初始值)在塊中具有固定值0。

警告:Xst:2404 - FFs/Latches < 1:3 >>(沒有 初始值)在塊中具有固定值0。

警告:Xst:2404 - FFs/Latches < 1:4 >>(沒有 初始值)在塊中具有常數值0。

在測試平臺我的代碼工作正常。初始值爲0,但警告仍然存在。我怎樣才能擺脫它們?

回答

2

爲什麼gamma_cor_array_s類不是常量? GAMMA_CORDEPH類似,不需要觸發器,編寫一個函數來初始化gamma_cor_s的使用位置,而不使用實體/體系結構對。

正如gamma_cor_s的值是(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) rising_edge(CLK)後:

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:75:13:@ 0毫秒:(報告注): 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(2) = 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:(報告 note):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。vhdl:75:13:0ms:(報告附註):gamma_cor_array_s(12) = 0 gamma_corrections.vhdl:75:13:0ms:(報告附註):gamma_cor_array_s(13)= 0 gamma_corrections.vhdl:75:13 :@ 0ms :(報告 注):gamma_cor_array_s(14)= 0 gamma_corrections.vhdl:75:13:0ms:(報告註釋):gamma_cor_array_s(15) = 0 gamma_corrections.vhdl:75:13:@ 10ns :報告註釋: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(2) = 2 gamma_corrections.vhdl:75:13:10ns :(報告註釋):gamma_cor_array_s(3)= 3 gamma_corrections.vhdl:75:13:@ 10ns :(報告 註釋):gamma_cor_array_s( 4)= 4 gamma_corrections.vhdl:75:13:@ 10ns :(報告說明):gamma gamma_cor_array_s(5) = 5 gamma_corrections.vhdl:75:13:@ 10ns :(報告註釋):gamma_cor_array_s(6)= 6 gamma_corrections.vhdl:75:13:@ 10ns :(報告 註釋):gamma_cor_array_s(7) (報告註釋):gamma_cor_array_s(8) = 8 gamma_corrections.vhdl:75:13:10ns :(報告註釋):gamma_cor_array_s(9)= 9 gamma_corrections。 (報告註釋): gamma_cor_array_s(11)= 11 gamma_corrections.vhdl:75(vhdl:75:13:@ 10ns)(報告 注意):gamma_cor_array_s(10)= 10 gamma_corrections.vhdl:75:13: :13:@ 10ns :(報告 註釋):gamma_cor_array_s(12)= 12 gamma_corrections.vhdl:75:13:@ 10ns :(報告註釋): gamma_cor_array_s(13)= 13 gamma_corrections.vhdl:75:13: @ 10ns :(報告 注):gamma_cor_array_s(14)= 14 gamma_corrections.vhdl:75:13:@ 10ns的:(報告註釋): gamma_cor_array_s(15)= 15

您申報64個人字拖,他們初始化所有'0',只有​​30個變爲'1' - 你沒有顯示所有的警告(這裏可以忽略)。使用real類型是不可移植的(實際值是近似的)。

對實體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 

到新躍大​​學的引用。

用於初始化常數,而不是使用在一個獨立的實體和架構產生的信號:

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:@ 0毫秒:(報告注):gamma_cor_array_s(0) = 0 gamma_corrections.vhdl:126:13:@ 0毫秒:(報告註釋):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。vhdl:126:13:@ 0ms :(報告註釋):gamma_cor_array_s(4)= 4 gamma_corrections.vhdl:126:13:0ms:(報告 註釋):gamma_cor_array_s(5)= 5 gamma_corrections.vhdl:126: 13:@ 0ms :(報告註釋):gamma_cor_array_s(6) = 6 gamma_corrections.vhdl:126:13:0ms:(報告註釋):gamma_cor_array_s(7)= 7 gamma_corrections.vhdl:126:13:0ms: (report report note):gamma_cor_array_s(8)= 8 gamma_corrections.vhdl:126:13:0ms:(report report):gamma_cor_array_s(9) = 9 gamma_corrections.vhdl:126:13:0ms:(report report ):gamma_cor_array_s(10)= 10 gamma_corrections.vhdl:126:13:0ms:(報告 note):gamma_cor_array_s(11)= 11 gamma_corrections.vhdl:126:13:0ms:(報告說明): gamma_cor_array_s (12)= 12 gamma_corrections.vhdl:126:13:0ms:(報告 註釋):gamma_cor_array_s(13)= 13 gamma_corrections.vhdl:126:13:@ 0毫秒:(報告注): gamma_cor_array_s(14)= 14 gamma_corrections.vhdl:126:13:@ 0毫秒:(報告 註釋) :gamma_cor_array_s(15)= 15

它與在時鐘的上升沿之後的先前信號的值匹配。

這有可能使gamma_cor_array_s的信號,進行動態分配,這需要所有的作業都是在一個過程中完成的(並行語句將制定一個過程的分配)

+0

謝謝你的建議。你幫了我很多。我會推薦你​​的網站給我所有的朋友... –

+0

[良好的問題](https://stackoverflow.com/help/how-to-ask)可以吸引很好的答案。結果不僅僅是一個問題和答案。他們可以爲那些有相同或類似問題的人提供資源。 – user1155120

0

XST報告這些警告,因爲一些數組元素被卡在零處,以便不需要寄存器,並且可以對其進行優化。要擺脫警告,您必須刪除寄存器說明。或者只是忽略警告。或者在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;