2013-02-09 2 views
1

256 비트 벡터의 해밍 웨이트 계산을 위해 K & R 알고리즘을 구현하고 싶습니다. 나뿐만 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; 

그러나, 자일링스를 사용하여 합성하는 동안 오류가

라인으로 온다 53 : 비 정적 루프 제한

모든 단서하시기 바랍니다 초과?

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는 신호가 아닌 변수입니다. 이는 델타주기를 마칠 때 업데이트된다는 것을 의미합니다. 이 경우에는 절대로 없을 것입니다. 그래서 무한 루프가 있습니다.


숫자의 popcount를 계산하려는 경우이 작업을 수행하십시오. 비록 이것이 타이밍을 만날 지에 대해서는 의심의 여지가 있지만 (아마 여러 클럭주기에 걸쳐이를 해체해야 할 것입니다).

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

당신은 의미하지 않는다 "최종 루프;" 대신에 "끝"; –

+0

@ LuísMarques : 네 말이 맞아. 감사. –

3

signalvariable의 차이점에 대해 알아야합니다.

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; 
관련 문제