原创 【博客大赛】走进“状态机”

2012-5-8 10:15 1767 13 14 分类: FPGA/CPLD

几个重要概念:

     构成状态机的要素:状态机的输入、输出和状态。输入就是一些引发状态变化的条件,输出就是状态变化后引起的变化,状态变化可能是由当前状态或输入条件有关。状态就是由一些逻辑值来表示。 

Mealy状态机: 时序逻辑的输出是由当前状态或输入条件有关

Moore状态机:  时序逻辑的输出只与当前状态有关

(在实际的电路设计中,两种状态机往往都会有的。)

状态机的典型设计:

1)单段式(时序控制较为简单时)---Gray编码

程序1

module fsm( 

input clk,

input rst,

input A,

output reg K1,

output reg K2,

output reg[1:0] state

);

parameter    Idle =2'b00,//Gray编码

Start=2'b01,

Stop=2'b10,

Clear=2'b11;

always @(posedge clk)

  if(!rst)

begin

state<=Idle;

K1<=0;

K2<=0;

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   begin

       state<=Stop;

    K1<=0;

    K2<=0;

       end

       Clear: if(!A) begin

                    state<=Idle;

                    K1<=1;

                    K2<=0;

                    end

           else begin 

                   state<=Clear;

                       K1<=0;

                       K2<=0;

                       end

    default: state <=2'bxx;//不定值

    endcase

endmodule               

程序2----独热编码 (在程序1上进行一下变动)

module fsm2( 

input clk,

input rst,

input A,

output reg K1,

output reg K2

);

reg[3:0] state;

parameter   Idle =4'b1000,//独热编码

Start=4'b0100,

Stop=4'b0010,

Clear=4'b0001;

always @(posedge clk)

  if(!rst)

     。。。。。 

  else

    case(state)

     Idle:。。。

     Start:。。。。

     Stop:。。。。

     Clear:。。。。

    default: state <=Idle;//确保回到Idle状态

    endcase

endmodule

 

 

分析:

程序1 RTL图

程序2 RTL图

程序1 Technology 图

程序2 Technology 图

             程序1报告

 

                  

           程序2报告

综合分析:

   程序2采用独热码,对于FPGA实现的有限状态机建议采用该种方式。其虽然多增加了触发器和一些单元数,但是组合电路省了一些,使得电路速度和可靠性增加。

 2)设计较为复杂的多输出状态机---多段式

   可以采用这样的设计思路:将状态变化与输出部分的控制分成两部分考虑。另外,如果为了调试方便和比较容易发现问题,还可以把输出部分根据输出变量数目,细分为一个个独立的always组合块。

  程序如下:

module fsm3( 

input clk,

input rst,

input A,

output reg K1,

output reg K2

);

reg[3:0] state,nextstate;

parameter   Idle =4'b1000,//独热编码

Start=4'b0100,

Stop=4'b0010,

Clear=4'b0001;

//*******在每一个时钟上升沿产生一次可能的状态变换*******//     

always@(posedge clk)

    if(!rst)

      state<=Idle;

    else

        state<=nextstate;

//*******根据当前的状态和输入的变换产生下一个状态*******//     

always@(state or A)

    case(state)

       Idle:  if(A)    

                     nextstate=Start;

 else  

         nextstate=Idle;

       Start:if(!A)  

 nextstate=Stop;

             else   

                     nextstate=Start;        

       Stop:if(A) 

 nextstate=Clear;

 else   

      nextstate=Stop;

       Clear: if(!A)  

                  nextstate=Idle;   

           else 

                 nextstate=Clear;

    default: nextstate=Idle;//确保回到Idle状态

    endcase

//*******产生输出K1的组合逻辑*******//     

always@(state or A or rst)

if(!rst)

    K1=0;

    else if (state==Clear&&!A)

         K1=1;

    else

         K1=0;

 

 

//*******产生输出K2的组合逻辑*******//   

 

always@(state or A or rst)

if(!rst)

    K2=0;

    else if (state==Stop&&A)

         K2=1;

    else

         K2=0;

 

endmodule

 1)资源使用报告

2)RTL图

 

 

 

 

 

3)Technology 图

           

 与程序2相比,程序2多了两个逻辑单元和两个K1,K2的寄存器输出!

 有限状态机的设计步骤:

i分析给定逻辑问题,确定输入、输出以及电路的状态数,得出状态转换图

ii 将等价状态尽可能的合并,得到最简的状态转换图

iiiFPGA有丰富的触发器资源,可以利用独热编码,进行状态分配

iiii用Verilog HDL中的always 块语句和case(if)等条件语句描述有限状态机。

最后,可综合状态机小总结一下:

1)使用独热码---每一个状态只有一个寄存器置位,译码逻辑较为简单。

2)采用CASE语句建立状态机模型,不要忘记在CASE语句最后面写default默认项,以便告诉综合器制定了所有状态,删除不需要的译码电路

3)有一个异步或者同步的复位端,便于通电时候进入有效状态

 

以上内容是源于对夏老的Verilog数字系统设计教程的第12章内容的一点总结和心得吧!相关例程我也同步上传,希望对大家有所帮助!一起加油努力学习吧!!!

文章评论1条评论)

登录后参与讨论

用户607435 2012-5-15 10:09

太好了
相关推荐阅读
用户421530 2013-12-01 13:16
基于Altera FPGA的千兆以太网实现方案
  1 引言   在系统设备不断向小型化、集成化、网络化发展的今天,嵌入式开发成为新技术发展的最前沿,改变着系统的整体结构。FPGA由于其自身特点,成为嵌入式开发的最佳平台。Altera公司结合其最新...
用户421530 2013-07-26 22:58
不在执迷于过去,只为不断突破,寻找奋斗的归宿&价值
    好久好久,没有来到自己的博客,一切是陌生的亲切,这里面呼喊自己的回归,是奋斗与自信 ,是价值与积淀的回归,今天不是起点,只是一个开始,从大学的校园走出来,面对工作,我的选择也许不是自己的想...
用户421530 2012-08-27 22:56
常用电平标准汇编版(1)
现在常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等,还有一些速度比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。...
用户421530 2012-07-17 00:26
于细微中见区别(1)---阻塞&非阻塞赋值(Verliog HDL)
阻塞赋值——“=” <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 非阻塞赋值——...
用户421530 2012-06-20 00:41
SOPC之软件编程学习--系统时钟API函数应用
利用sys/alt_alarm.h系统时钟服务头文件中的alt_alarm_start ()API 函数以及时钟回调函数进行精确定时。我的设计在现有源程序的基础上,添加三个时钟服务程序,分别利用不...
用户421530 2012-06-19 15:18
SOPC之软件编程学习---头文件(1)
在Altera FPGA里面的SOPC学习过程中,软件编程中遇到的第一个编程,往往是LED灯的控制,这几天断断续续的学习了些,总算了入了NIOS II 学习的门槛,开始我对FPG**上系统的探索。在软...
我要评论
1
13
关闭 站长推荐上一条 /2 下一条