[an error occurred while processing this directive]
|
1) В Синпlify-е(синтезёр такой) есть FSM компилёр и FSM explorer. Они в log файле пишут сколько состояний синтезёр выцепил из FSM-а. Для сверки полезно его читать.
Может (должно быть) ещё что есть аналогичное, я не знаю.
2) И задержки скорее всего тоже сказываются. В свете борьбы с ними переписать автомат как Moore - чтоб выхода не зависели от входных сигналов, а зависели только от состояний.
Попробую на пальцах:
В исходном коде разграничить (для себя): Next state logic, Current state logic, Otput logic.
Next state logic зависит от текущего состояния и входов.
Current state logic просто регистр со сбросом.
Блок Current state logic (или скорее всего в комбинации с Next state logic) всегда sequential, т.е. стоит под:
process(Reset, Clk)
if (reset ...
...
elsif rising_edge(Clk) then
...
Под rising_edge(Clk) чёндь вроде:
case (CurrentState) is
when ResetState_st => CurrentState <= State1_st; --безусловный переход в другое состояние
when State1_st => if (donefrqdtctr = '1') then --условный переход в другое состояние
CurrentState <= State2_st;
end if;
when...
...
end case;
Здесь Next и Current state logic-и совмещены.
Декларации к нему:
type StatesType is (ResetState_st, State1_st, State2_st, ...);
signal CurrentState : StatesType;
В твоём случае перечислимого типа нет. Он и не нужен. Но может для отладки он бы помог?
Блок Otput logic - комбинационный. А оформлять его в виде Sequential "case" или Concurrent "output <= "1" when " или ещё как зависит от красоты.
Код получится длинным, но понятным.
E-mail: info@telesys.ru