Áã»ù´¡Ñ§FPGA£¨°Ë£©Ç³Ì¸×´Ì¬»ú

2015Äê01ÔÂ14ÈÕ 14:57    ·¢²¼Õߣºwp1981
×÷ÕߣºÐ¡Ä«Í¬Ñ§

¹ØÓÚ״̬»úÄØ£¬Ïë±Ø´ó¼ÒÓ¦¸Ã¶¼½Ó´¥¹ý£¬Í¨Ë׵Ľ²¾ÍÊÇÊýµçÀïÎÒÃÇѧµÄ״̬ת»»Í¼¡£×´Ì¬»ú·ÖΪÁ½ÖÐÀàÐÍ£¬Ò»ÖÖ½ÐMealyÐÍ£¬Ò»ÖÖ½ÐMooreÐÍ¡£Ç°Õß¾ÍÊÇ˵ʱÐòÂß¼­µÄÊä³ö²»½öÈ¡¾öÓÚµ±Ç°µÄ״̬£¬»¹È¡¾öÓÚÊäÈ룬¶øºóÕß¾ÍÊÇʱÐòÂß¼­µÄÊä³ö½ö½öÈ¡¾öÓÚµ±Ç°µÄ״̬¡£ÏÂÃæÁ½¸öͼ·Ö±ð±íʾÁ½ÖÖ²»Í¬µÄ״̬»ú¡£





ÏÂÃæÎÒÃǾÍͨ¹ý´úÂëÀ´Ð´Ò»ÏÂ״̬»ú£¬ÒÔÏÂÃæµÄ״̬ת»»Í¼ÎªÀý



Ê×ÏÈ£¬ÊÇÒ»ÖÖµäÐ͵Ä״̬»úд·¨£¬ÕâÖÖд·¨ÎÒÃdzÆΪһ¶Îʱ״̬»ú£¬ÓÃÓÚһЩ¼òµ¥µÄÉè¼ÆÊÇ¿ÉÒԵģ¬µ«Èç¹ûÊǸ´ÔÓµÄ״̬»ú£¬²»½¨Òé´ó¼ÒÓÃÕâÖÖд·¨¡£

//***********************************************************
//**********************Сī±Ê¼Ç*****************************
//¿É×ۺϵÄ״̬»úÉè¼ÆµÄµäÐÍ·½·¨

//СīͬѧÓÚ2014Äê5ÔÂ31ÈÕÔÚ½ðº²ÁÖËÞÉá×÷

//ʵÏÖµäÐ͵Ä״̬»úÉè¼Æ

//************************Сī±Ê¼Ç£¬Áô×÷»ØÒä**********************

module fsm (clk,rst_n,A,k1,k2,State);

input clk;
input rst_n;
input A;
output k1,k2;
output State;
reg k1;
reg k2;
reg State;   //µ±Ç°×´Ì¬¼Ä´æÆ÷

parameter     Idle = 2'b00,
                       Start = 2'b01,
                       Stop = 2'b10,
                       Clear = 2'b11;            //±àÂë £¬×¢Ò⣬ֻÓÐÔÚ×îºóÒ»¾äÓ÷ֺţ¬ÆäËûµØ·½ÓöººÅ

always @(posedge clk or negedge rst_n)
  if(!rst_n)  
  begin
     State <= Idle;
k1 <=1'b0;
k2 <=1'b0;
  end
  else case (State)                   //״̬ÅжÏÓë×éºÏÂß¼­¸³Öµ
  
       Idle :if(A) begin
      State <= Start;
k1 <= 0;
end
else begin
State <= Idle;
k1 <= 0;
k2 <= 0;
end
Start :if(!A) State <= Stop;
       else State  <=  Start;
Stop  :if(A) begin
       State <=Clear;
k2 <= 1;
end
else State <= Stop;
Clear :if(!A) begin
       State <= Clear;
k2 <= 0;
k1 <= 1;
end
else State <= Clear;
default : State <= 2'bxx;     //¸æËß×ÛºÏÆ÷ caseÓï¾äÒѾ­Ö¸¶¨ÁËËùÓÐ״̬£¬ÕâÑù×ÛºÏÆ÷¾Í»áɾ³ý²»ÐèÒªµÄÒëÂëµç·£¬Ê¹Éú³ÉµÄµç·¼òµ¥
endcase  
endmodule
//************************СīƷÅÆ£¬ÄãÖµµÃÓµÓÐ~**************************





ÏÂÃæÊÇÁíÒ»ÖÖд·¨£¬½Ð×öÊä³öÖ¸¶¨µÄÂë±íʾ״̬µÄ״̬»ú




//***********************************************************
//**********************Сī±Ê¼Ç*****************************
//ÓÉÊä³öÖ¸¶¨µÄÂë±íʾ״̬µÄ״̬»ú

//СīͬѧÓÚ2014Äê5ÔÂ21ÈÕÔÚ½ðº²ÁÖËÞÉá×÷

//ÓÃÓÚ¸ßËÙ״̬»úµÄÉè¼Æ

//************************Сī±Ê¼Ç£¬Áô×÷»ØÒä**********************

module fsm2(clk,rst_n,A,k1,k2,State);
input clk;
input rst_n;
input A;
output k1,k2;
output State;
reg State;   //µ±Ç°×´Ì¬¼Ä´æÆ÷
assign k1 =State;
assign k2 =State;

parameter    Idle = 5'b00000,            //²ÉÓö¾ÈȱàÂ루ÿ¸ö״ֻ̬ÓÐÒ»¸ö¼Ä´æÆ÷ÖÃλµÄ״̬»úÕâÑùÓõÄ×éºÏµç·ʡһЩ£¬¶øÇÒËÙ¶ÈÒ²¿ì£©
                      Start = 5'b00010,
                      Stop = 5'b00100,
                      StoptoClear = 5'b11000,
                      Clear = 5'b01010,
                     
  CleartoIdle  = 5'b00111;          //±àÂë £¬×¢Ò⣬ֻÓÐÔÚ×îºóÒ»¾äÓ÷ֺţ¬ÆäËûµØ·½ÓöººÅ

always @(posedge clk or negedge rst_n)
  if(!rst_n)  
  
     State <= Idle;

  else case (State)                   //״̬ÅжÏÓë×éºÏÂß¼­¸³Öµ
  
       Idle :if(A)  
      State <= Start;

else
State <= Idle;


Start :if(!A) State <= Stop;
       else State  <=  Start;
Stop  :if(A)
       State <=StoptoClear;


else State <= Stop;
StoptoClear :State <= Stop;

Clear :if(!A)
       State <= Clear;


else State <= Clear;
CleartoIdle :State <= Idle;
default : State <= Idle;//¸æËß×ÛºÏÆ÷ caseÓï¾äÒѾ­Ö¸¶¨ÁËËùÓÐ״̬£¬ÕâÑù×ÛºÏÆ÷¾Í»áɾ³ý²»ÐèÒªµÄÒëÂëµç·£¬Ê¹Éú³ÉµÄµç·¼òµ¥
endcase  

endmodule

//************************СīƷÅÆ£¬ÄãÖµµÃÓµÓÐ~**************************
ÕâÑùд¾ÍÊÇ°Ñ״̬ÂëµÄÖ¸¶¨Óë״̬»ú¿ØÖƵÄÊä³öÁªÏµÆðÀ´£¬°Ñ״̬µÄ±ä»¯Ö±½Ó×÷ÓÃÓÚÊä³ö£¬ÕâÑù×ö¿ÉÒÔÌá¸ßÊä³öÐźŵĿª¹ØËصIJ¢½ÚÊ¡µç·Æ÷¼þ¡£µ«ÕâÖÖ·½·¨Ò²ÓÐȱµã£¬¾ÍÊÇ¿ì¹ØµÄά³Öʱ¼ä±ØÐëÓë״̬ά³ÖµÄʱ¼äÒ»Ö£¬ÕâÖÖÉè¼Æ·½·¨³£ÓÃÔÚ¸æËß״̬»úÖС£


ÏÂÃæÕâÖÖд·¨Ó¦¸ÃÊÇÒÔºóÎÒÃǾ­³£ÒªÓõ½µÄ£¬¼´Èý¶Îʽ״̬»úд·¨£¬±È½ÏÊʺÏÓÚ¶àÊä³öµÄ״̬»úÉè¼Æ¡£


//***********************************************************
//**********************Сī±Ê¼Ç*****************************
//¶àÊä³ö״̬ʱµÄ״̬»ú

//СīͬѧÓÚ2014Äê5ÔÂ31ÈÕÔÚ½ðº²ÁÖËÞÉá×÷

//ÓÃÓÚ¶àÊä³öʱµÄ״̬»úÉè¼Æ£¬Ò²¼´Èý¶Îʽ״̬»úµÄ³£¼ûд·¨£¬ÍƼö£¡

//************************Сī±Ê¼Ç£¬Áô×÷»ØÒä**********************
module fsm3 (clk,rst_n,A,k1,k2,state);
input clk,rst_n,A;
output k1,k2;
output state;
reg k1,k2;
reg state;
reg xiaomo;
parameter Idle = 2'b00,
                    start = 2'b01,
                    stop = 2'b10,
                    clear = 2'b11;
always @ (posedge clk or negedge rst_n)   
       if(!rst_n) state <= Idle;
else state <= xiaomo;      //ÿһ¸öʱÖÓ²úÉúÒ»¸ö¿ÉÄܵı仯£¬¼´Ê±ÐòÂß¼­²¿·Ö



always @ (state or A)      //×éºÏÂß¼­²¿·Ö
       begin
case (state)
    Idle : if(A) xiaomo = start;
        else  iaomo = Idle;
start : if(!A)xiaomo = stop;
               else iaomo = start;
stop  : if(A)xiaomo = clear;
            else iaomo = stop;
clear : if(!A) xiaomo =Idle;
               else iaomo = clear;
default : xiaomo = 2'bxx;
     endcase
end
always @ (state or A or rst_n)    //²úÉúÊä³ök1µÄ×éºÏÂß¼­
      if(!rst_n) k1=0;
else if(state ==clear && !A)
   k1=1;
else k1=0;
always @(state or A or rst_n)      //²úÉúÊä³ök2µÄ×éºÏÂß¼­
      if(!rst_n) k2=0;
else if(state ==stop && A)
    k2=1;
else k2=0;


endmodule  
//************************СīƷÅÆ£¬ÄãÖµµÃÓµÓÐ~**************************