2016-07-02 3 views
0

간단한 FSM에서 "반복 제한 도달"오류가 발생했습니다. 이것은 클래스 할당을 위해 수행해야하는 더 큰 FSM의 일부이며이 특정 부분에 대한 문제를 추적했습니다. FSM은 카운터를 제어 할 것입니다. IDLE은 입력을 기다리고, ZERO는 카운터를 0으로 설정하고, INCREMENT는 카운터를 1 씩 증가시킵니다.반복 제한에 도달 - VHDL FSM의 간단한 카운터

시뮬레이션 할 때 처음 "inc"입력이 높고 클럭이 상승 할 때 오류가 발생합니다. "temp : = temp + 1;"문을 변경하면 "temp : = anything"이면 오류가 중지됩니다. 프로세스 자체 내에서 프로세스 감도 목록의 신호를 변경할 때이 오류가 발생한 것을 발견 한 경우 무엇이 잘못 될 수 있는지 모릅니다.

시뮬레이션을 위해 Quartus II를 사용하고 있습니다.

영어 실수는 죄송합니다.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use IEEE.NUMERIC_STD.all; 

entity fsm is 
    port 
    (
     clock:  in std_logic; 
     reset:  in std_logic; 

     inc:   in std_logic; 

     count:  out std_logic_vector (13 downto 0); 
     cur_state: out std_logic_vector (1 downto 0) 
    ); 
end fsm; 

architecture behaviour of fsm is 
    type state_type is (IDLE, INCREMENT, ZERO); 
    signal PS, NS: state_type; 

begin  
    sync_proc: process (clock, reset) 
    begin 
     if (reset = '1') then 
      PS <= ZERO; 
     elsif (rising_edge(clock)) then 
      PS <= NS;   
     end if; 
    end process sync_proc; 

    comb_proc: process (PS, inc) 
     variable temp: unsigned (13 downto 0); 
    begin 
     case PS is 
      when IDLE => 
       if (inc = '1') then 
        NS <= INCREMENT; 
       else 
        NS <= IDLE; 
       end if;    
      when INCREMENT => 
       temp := temp + 1; 
       NS <= IDLE; 
      when ZERO => 
       temp := "00000000000000"; 
       NS <= IDLE; 
      when others => 
       NS <= IDLE; 
     end case; 

     count <= std_logic_vector(temp); 
    end process comb_proc; 

    with PS select 
     cur_state <= "00" when IDLE, 
          "01" when INCREMENT, 
          "10" when ZERO, 
          "11" when others; 
end behaviour; 
+0

코드는 추가 된 테스트 벤치 [fsm_tb.png] (http://i.stack.imgur.com/uPgib.png)를 사용하여 성공적으로 시뮬레이션합니다. 리셋은 온도를 초기화하는 PS = ZERO를 발생시킨다. 실제 오류 메시지를 보여주고 시뮬레이션을 보여주십시오. [MCVE] (http://stackoverflow.com/help/mcve) 도움이 될 것입니다. – user1155120

+0

사용 조항'use ieee.std_logic_unsigned.all;'은 필요하지 않습니다. – user1155120

+0

포스트 합성 시뮬레이션은 순차 회로 추론의 부재에 기반한 임시 루프를 가진 조합 루프를 만날 수 있습니다. (클럭 에지는 임시 증가에 사용되지 않습니다.) 'PS'가 하나의 고온 상태 인 경우, 래치 인 에이블로서 '증가'를 사용하기위한 조합 적 글리치의 가능성은 없다. 하지만 항상 'INCREMENT'가 참일 때마다 임시 래치가 업데이트되고 반복 한계를 만날 수있는 피드백 루프가 제공됩니다. 이것은 설명 된 동작과 일치하지만 사용자가 제공 한 동작 코드에는 적용 할 수 없습니다. – user1155120

답변

1

사례 설명에 매우 심각한 개념 오류가 있습니다. 조합 회로 (FSM의 조합 부분)를 생성하기 때문에 메모리가 없으므로 "temp : = temp + 1"방정식을 구현할 수 없습니다 (메모리가 없기 때문에 temp 값은).

MIT에서 출판 한 V.Pedroni의 "하드웨어의 유한 상태 기계 ..."의 11 장에서 이에 대해 더 자세히 알 수 있습니다.