Diseñar máquina de estados finitos: el resultado no se parece a lo que quiero -vhdl

3

todos. Diseño una máquina de estados finitos e intento implementarla usando VHDL, pero el resultado me confunde. Me tomo demasiado tiempo en esto pero todavía no puedo resolverlo. ¿Podrías darme algún consejo?

La lógica de State Machine como se muestra a continuación:

siflag='0',entoncescnt<=cnt+'1';Sicntesiguala12,elprocesoserestablecerá.EscriboelcódigoVHDLparaesto,comosemuestraacontinuación:

libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.all;--Uncommentthefollowinglibrarydeclarationifusing--arithmeticfunctionswithSignedorUnsignedvalues--useIEEE.NUMERIC_STD.ALL;--Uncommentthefollowinglibrarydeclarationifinstantiating--anyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitygetCANIDisgeneric(IDNUM:natural:=11);port(clk_sample,rst:instd_logic;start:instd_logic;flag:instd_logic;cnt_dis:outstd_logic_vector(3downto0));endgetCANID;architectureBehavioralofgetCANIDistypeStateis(s0,s1,s2,s3);signalpresent_state,next_state:State;signalcnt:std_logic_vector(3downto0);beginstate_clocked:process(clk_sample,rst)beginifrst='1'thenpresent_state<=s0;elsifclk_sample'eventandclk_sample='1'thenpresent_state<=next_state;endif;endprocess;state_comb:process(present_state,start,flag)begincasepresent_stateiswhens0=>cnt<=(others=>'0');ifstart='1'thennext_state<=s1;endif;whens1=>cnt<=(others=>'0');ifflag='0'thencnt<=cnt+'1';next_state<=s2;elsenext_state<=s3;endif;whens2=>ifcnt=(IDNUM+1)thennext_state<=s0;elseifflag='0'thencnt<=cnt+'1';next_state<=s2;elsenext_state<=s3;endif;endif;whens3=>ifcnt=(IDNUM+1)thennext_state<=s0;elseifflag='0'thencnt<=cnt+'1';next_state<=s2;elsenext_state<=s3;endif;endif;endcase;endprocess;cnt_dis<=cnt;endBehavioral;

Escribounbancodepruebasparasimularesteproyectosimple.Peroelresultadoesloquequiero.

Creo que el cnt debería seguir aumentando cuando la bandera es igual a '0' en cada flanco ascendente del reloj. El resultado parece confuso. ¿Podrías ayudarme?

La herramienta de desarrollo es: Xilinx ISE 14.7

    
pregunta Joe

1 respuesta

1

El problema está en s2. Después de alcanzar el estado s2, el "estado siguiente" se asigna nuevamente a s2 según su lógica de bandera. Luego se asigna al "estado presente" en el siguiente ciclo mediante el primer proceso. La consecuencia es que su segundo proceso nunca se ejecuta en el siguiente ciclo de reloj. Porque nada en su lista de sensibilidad está cambiando. Indicador, estado actual, inicio, todos siguen siendo los mismos valores antes. Cambiar el diseño a un solo proceso con solo un reloj en la lista de sensibilidad es la mejor opción.

    
respondido por el MITU RAJ

Lea otras preguntas en las etiquetas