2017-01-14 69 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;