간단한 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;
코드는 추가 된 테스트 벤치 [fsm_tb.png] (http://i.stack.imgur.com/uPgib.png)를 사용하여 성공적으로 시뮬레이션합니다. 리셋은 온도를 초기화하는 PS = ZERO를 발생시킨다. 실제 오류 메시지를 보여주고 시뮬레이션을 보여주십시오. [MCVE] (http://stackoverflow.com/help/mcve) 도움이 될 것입니다. – user1155120
사용 조항'use ieee.std_logic_unsigned.all;'은 필요하지 않습니다. – user1155120
포스트 합성 시뮬레이션은 순차 회로 추론의 부재에 기반한 임시 루프를 가진 조합 루프를 만날 수 있습니다. (클럭 에지는 임시 증가에 사용되지 않습니다.) 'PS'가 하나의 고온 상태 인 경우, 래치 인 에이블로서 '증가'를 사용하기위한 조합 적 글리치의 가능성은 없다. 하지만 항상 'INCREMENT'가 참일 때마다 임시 래치가 업데이트되고 반복 한계를 만날 수있는 피드백 루프가 제공됩니다. 이것은 설명 된 동작과 일치하지만 사용자가 제공 한 동작 코드에는 적용 할 수 없습니다. – user1155120