Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   VHDL (http://www.velocityreviews.com/forums/f18-vhdl.html)
-   -   problem in ISE with mealy FSM (http://www.velocityreviews.com/forums/t666369-problem-in-ise-with-mealy-fsm.html)

nicx82 01-20-2009 02:50 PM

problem in ISE with mealy FSM
 
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 01-20-2009 10:02 PM

Hi

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

Check the button of this page to get my point.
http://www.jjmk.dk/MMMI/Exercises/04...lemtations.htm

Jeppe

nicx82 01-21-2009 03:56 PM

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 01-21-2009 07:30 PM

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


All times are GMT. The time now is 08:06 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.