2017-01-14 6 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 - ТФ/Защелки < 1: 1 >> (без значения инициализации) имеет постоянное значение 0 в блоке.

ВНИМАНИЕ: Xst: 2404 - FFs/Защелки < 1: 2 >> (без значения значения инициализации) имеют постоянное значение 0 в блоке.

ВНИМАНИЕ: Xst: 2404 - FFs/Защелки < 1: 2 >> (без значения значения инициализации) имеют постоянное значение 0 в блоке.

ВНИМАНИЕ: Xst: 2404 - FFs/Защелки < 1: 2 >> (без значения значения инициализации) имеют постоянное значение 0 в блоке.

ВНИМАНИЕ: Xst: 2404 - FFs/Защелки < 3: 3 >> (без значения ) имеют постоянное значение 0 в блоке.

ВНИМАНИЕ: Xst: 2404 - FFs/Защелки < 1: 3 >> (без значения ) имеют постоянное значение 0 в блоке.

ВНИМАНИЕ: Xst: 2404 - FFs/Защелки < 1: 4 >> (без значения ) имеют постоянное значение 0 в блоке.

В testbench мой код работает нормально. Значения Init - 0, но предупреждения все еще остаются. Как я могу избавиться от них?

ответ

2

Почему не является параметром gamma_cor_array_s? GAMMA_COR - это константа класса, равная DEPH, вам не нужны флип-флопы, напишите функцию для инициализации 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: @ 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 (2) = 0 gamma_corrections.vhdl: 75: 13: @ 0ms: (примечание к отчету): gamma_cor_array_s (3) = 0 gamma_corrections.vhdl: 75: 13: @ 0ms: (примечание к отчету): 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 : 13: @ 0ms: (отчет примечание): gamma_cor_array_s (8) = 0 gamma_corrections.vhdl: 75: 13: @ 0ms: (примечание к отчету): gamma_cor_array_s (9) = 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: (примечание к отчету): гамма _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) = 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: 75: 13: @ 10ns: (отчет примечание): gamma_cor_array_s (10) = 10 gamma_corrections.vhdl: 75: 13: @ 10ns: (примечание к отчету): gamma_cor_array_s (11) = 11 gamma_corrections.vhdl: 75 : 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 

Ссылки на 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.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: (отчет примечание): 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: (отчет примечание): gamma_cor_array_s (13) = 13 gamma_corrections.vhdl: 126: 13: @ 0ms: (Докладная записка): gamma_cor_array_s (14) = 14 gamma_corrections.vhdl: 126: 13: @ 0ms: (отчет примечание) : 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; 
Смежные вопросы