2013-02-09 4 views
1

Я хочу реализовать алгоритм K & R для расчета веса помех для 256-битного вектора. Я написал свой код в VHDL как:Превышен предел нестатического контура

entity counter_loop is 
    Port (dataIn : in STD_LOGIC_VECTOR (255 downto 0); 
       dataOut : out STD_LOGIC_VECTOR (8 downto 0); 
      threshold : in STD_LOGIC_VECTOR (8 downto 0); 
      clk : in STD_LOGIC; 
      flag : out STD_LOGIC); 
end counter_loop; 

architecture Behavioral of counter_loop is 
    signal val : STD_LOGIC_VECTOR (255 downto 0) := X"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"; 
begin 
    process (clk) 
     variable count : STD_LOGIC_VECTOR (8 downto 0):= "000000000";  
    begin 
     flag <= '0'; 
     val <= dataIn; 
     --if(clk'event and clk = '1') then 
      while (val > 0) loop 
       count := count+1; 
       val <= (val and (val-1)); 
       if (count > threshold) then 
        flag <= '1'; 
       end if; 
      end loop; 
       dataOut <= count; 
     --end if; 
    end process; 
end Behavioral; 

Но, в то время как его синтеза с использованием Xilinx, ошибка появляется как

Line 53: Non-статический предел цикла превышено

Любые подсказки пожалуйста?

P.S: Линия 53 - в то время как (значение> 0) петля

ответ

3

Итак, я буду игнорировать вопросы вещей на самом деле, отвечающие времени (val - 1 дорого) и на самом деле говорить о вашей логике.

Вот кусок кода:

signal val : std_logic_vector(255 downto 0) := (others => '1'); 

process (clk) 
begin 
    while (val > 0) loop 
     val <= (val and (val-1)); 
    end loop; 
end process; 

val является сигналом, а не переменная. Это означает, что он будет обновлен, когда вы закончите дельта-цикл. Который в этом случае никогда не будет. Таким образом, у вас есть бесконечный цикл.


Если вы просто пытаетесь подсчитать количество экземпляров числа, то почему бы вам просто не сделать это. Хотя я сомневаюсь, что это тоже будет соответствовать срокам (возможно, нужно разбить его на несколько тактов).

process (clk) 
    variable count : std_logic_vector(8 downto 0) := "0" & x"00"; 
begin 
    if rising_edge(clk) then 
     for i in dataIn'range loop 
      if dataIn(i) = '1' then 
       count := count + 1; 
      end if; 
     end loop; 

     dataOut <= count_i; 
    end if; 
end process; 

И, наконец, большинство людей утверждают, что алгоритмы, разработанные для кода C часто плохо работают в аппаратных средствах, поскольку аппаратное обеспечение имеет различные возможности, чем фиксированный процессор.

+0

Не значит «конец цикла»; вместо «end for»,? –

+0

@ LuísMarques: Ты прав. Благодарю. –

3

Вам нужно узнать о разнице между signal и variable.

При назначении на signal вы планируете только изменение для следующей точки, в которую время перемещается (в так называемом часовом процессе, как ваш, это когда ваш процесс завершается, и все остальные процессы, которые в настоящее время запланированные к исполнению тоже).

Так что, когда вы пишете val <= something в цикле процесса, val только когда-либо планируется обновить. Когда процесс проверяет значение val, он видит текущее значение, а не запланированное. Вы должны использовать переменную, чтобы отслеживать вещи таким образом.

Однако, как уже отмечалось, если вы просто хотите, чтобы рассчитывать те, что гораздо проще:

count:=0; 
for i in dataIn'range loop 
    if dataIn(i) = '1' then 
     count:=count+1; 
    end if; 
end loop; 
Смежные вопросы