Velocity Reviews > VHDL > problem in ISE with mealy FSM

# problem in ISE with mealy FSM

nicx82
Junior Member
Join Date: Nov 2008
Posts: 9

 01-20-2009
Hi,
i have a problem with an FSM mealy based.
The problem are the warning from ISE indicated a latches state.
In simulation this problems are continuos change of signal from a correct value to zero and again from correct value to zer and so on.
I know that i can correct this problem by rewrite in each state all the output values even if this don't change. This solution work if the output are know to me, but how can i do the same with output signals that depends on the input??(this is a Mealy machine)

jeppe
Senior Member
Join Date: Mar 2008
Location: Denmark
Posts: 348

 01-20-2009
Hi

Consider the way the statemachine implemented - normally must a melay output be driven by a combinatorial process or as concurrent code.

http://www.jjmk.dk/MMMI/Exercises/04...lemtations.htm

Jeppe

nicx82
Junior Member
Join Date: Nov 2008
Posts: 9

 01-21-2009
this is the code. tHIS CODE COMPARE 8 NUMBER, BUT THE CODE IS ONLY FOR THE FIRST 3 NUMBER. IN STATE A I COMPARE NUMER 1 AND 2 AND I PUT TO THE OUT THE MAX (MAX<=IN_A OR MAX<=IN_B). I ASSIGN TO THE MAX AN INDEX. IN THE STATE B I COMPARE THE MAX WITH NUMBER 3.IF THE MAX DON'T CHANGE, THE INDEX MUST REMAIN THE SAME, ELSE I UPDATE THE INDEX.

when
state_B =>
if (IN_A(16 downto 6) > IN_B(16 downto 6)) then
MAX<=IN_A;
index<="0001";
S_1<='1';
S_2<="000";
DONE<='0';
elsif (IN_A(16 downto 6) < IN_B(16 downto 6)) then
max<=IN_B;
index<="0010";
S_1<='1';
S_2<="000";
DONE<='0';
else---integer part are equals
if (IN_A(5 downto 0) > IN_B(5 downto 0)) then
max<=IN_A;
index<="0001";
S_1<='1';
S_2<="000";
DONE<='0';
elsif (IN_A(5 downto 0) < IN_B(5 downto 0)) then
max<=IN_B;
index<="0010";
S_1<='1';
S_2<="000";
DONE<='0';
else--also the fraction part are equals
max<=IN_A;
index<="0001";
S_1<='1';
S_2<="000";
DONE<='0';
end if;
end if;
nx_state<=state_C;

--NOW I COMPARE NEW NUMBER WITH THE MAX OF THE ABOVE STATE
when
state_C =>
if (IN_A(16 downto 6) > IN_B(16 downto 6)) then
MAX<=IN_A;
S_2<="001"; --HERE I CAN'T WRITE THE VALUE OF INDEX BECAUSE I DON'T KOW IF IT IS 0001 OR 0010.DEPENDS ON THE ABOVE STATE
DONE<='0';
elsif (IN_A(16 downto 6) < IN_B(16 downto 6)) then
max<=IN_B;
index<="0011";
S_2<="001";
DONE<='0';
else---parte intera uguale
if (IN_A(5 downto 0) > IN_B(5 downto 0)) then
max<=IN_A;
S_2<="001";
DONE<='0';
elsif (IN_A(5 downto 0) < IN_B(5 downto 0)) then
max<=IN_B;
index<="0011";
S_2<="001";
DONE<='0';
else--anche la parte frazionaria è uguale
max<=IN_A;
S_2<="001";
DONE<='0';
end if;
end if;
nx_state<=state_C_P;

jeppe
Senior Member
Join Date: Mar 2008
Location: Denmark
Posts: 348

 01-21-2009
Well - my best advice would be:

Implement two states instead of one - you could call them

when state_C0001 =>
....
when state_c0010 =>
....

you must select the correct state in state_B - but then it should be easy.

Jeppe