第8章有限状态机设计有限状态机FSM(FiniteStateMachine)适于数字系统的控制模块常用case、if-else语句描述可编程逻辑器件第八章有限状态机设计教学重点MOORE状态机MEALY状态机有限状态机的几种描述方式有限状态机的状态编码8.1基于状态机的设计构成组合逻辑状态译码、产生输出时序逻辑存储状态分类Moore输出是现态的函数Mealy输出是现态和输入的函数摩尔型(Moore)状态机米里型(Mealy)状态机Moore型状态图现态次态输入/输出Mealy型状态图start=0State0out=001clr=1step3=0State2out=100State1out=010start=1step3=1State3out=111step2=1step2=0【例10.7】状态机设计举例moduleFSM(clk,clr,out,start,step2,step3);inputclk,clr,start,step2,step3;output[2:0]out;reg[2:0]out;reg[1:0]state,next_state;parameterstate0=2’b00,state1=2’b01,//状态编码state2=2’b11,state3=2’b10;//格雷码always@(posedgeclkorposedgeclr)beginif(clr)state=state0;//定义初态elsestate=next_state;endalways@(stateorstartorstep2orstep3)//状态转换begincase(state)state0:beginif(start)next_state=state1;elsenext_state=state0;endstate1:beginnext_state=state2;endstate2:beginif(step2)next_state=state3;elsenext_state=state0;endstate3:beginif(step3)next_state=state0;elsenext_state=state3;enddefault:next_state=state0;endcaseendalways@(state)//状态译码及输出begincase(state)state0:out=3'b001;state1:out=3'b010;state2:out=3'b100;state3:out=3'b111;default:out=3'b001;endcaseendendmodule(1)用三个过程描述:即现态(CS)、次态(NS)、输出逻辑(OL)各用一个always过程描述。(2)双过程描述(CS+NS、OL双过程描述):使用两个always过程来描述有限状态机,一个过程描述现态和次态时序逻辑(CS+NS);另一个过程描述输出逻辑(OL)。(3)双过程描述(CS、NS+OL双过程描述):一个过程用来描述现态(CS);另一个过程描述次态和输出逻辑(NS+OL)。(4)单过程描述:在单过程描述方式中,将状态机的现态、次态和输出逻辑(CS+NS+OL)放在一个always过程中进行描述。8.2有限状态机的几种描述方式“101”序列检测器的Verilog描述(三个过程)modulefsm1_seq101(clk,clr,x,z);inputclk,clr,x;outputregz;reg[1:0]state,next_state;parameterS0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;/*状态编码,采用格雷(Gray)编码方式*/always@(posedgeclkorposedgeclr)/*该过程定义当前状态*/beginif(clr)state=S0;//异步复位,s0为起始状态elsestate=next_state;endalways@(stateorx)/*该过程定义次态*/begincase(state)S0:beginif(x)next_state=S1;elsenext_state=S0;endS1:beginif(x)next_state=S1;elsenext_state=S2;endS2:beginif(x)next_state=S3;elsenext_state=S0;endS3:beginif(x)next_state=S1;elsenext_state=S2;enddefault:next_state=S0;/*default语句*/endcaseendalways@(state)/*该过程产生输出逻辑*/begincase(state)S3:z=1'b1;default:z=1'b0;endcaseendendmodule“101”序列检测器的Verilog描述(三个过程)“101”序列检测器(单过程描述)modulefsm4_seq101(clk,clr,x,z);inputclk,clr,x;outputregz;reg[1:0]state;parameterS0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;/*状态编码,采用格雷(Gray)编码方式*/always@(posedgeclkorposedgeclr)Beginif(clr)state=S0;//异步复位,s0为起始状态elsecase(state)S0:beginif(x)beginstate=S1;z=1'b0;endelsebeginstate=S0;z=1'b0;endendS1:beginif(x)beginstate=S1;z=1'b0;endelsebeginstate=S2;z=1'b0;endendS2:beginif(x)beginstate=S3;z=1'b0;endelsebeginstate=S0;z=1'b0;endendS3:beginif(x)beginstate=S1;z=1'b1;endelsebeginstate=S2;z=1'b1;endenddefault:beginstate=S0;z=1'b0;end/*default语句*/endcaseendendmodule8.3状态编码◆顺序编码◆格雷编码◆约翰逊编码◆一位热码常用的编码方式一位热码编码选择对话框(QuartusⅡ)状态编码的定义在Verilog语言中,有两种方式可用于定义状态编码,分别用parameter和'define语句实现,比如要为state0、state1、state2、state3四个状态定义码字为:00、01、11、10,可采用下面两种方式。方式1:用parameter参数定义parameterstate1=2'b00,state2=2'b01,state3=2'b11,state4=2'b10;……case(state)state1:…;//调用state2:…;……要注意两种方式定义与调用时的区别,一般情况下,更倾向于采用方式1来定义状态编码。一般使用case、casez和casex语句来描述状态之间的转换,用case语句表述比用if-else语句更清晰明了。状态编码的定义方式2:用'define语句定义'definestate12'b00//不要加分号“;”'definestate22'b01'definestate32'b11'definestate42'b10case(state)'state1:…;//调用,不要漏掉符号“'”'state2:…;……状态编码的定义8.4有限状态机设计要点1.起始状态的选择:起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁、高效。多数EDA软件会自动为基于状态机的设计选择一个最佳的起始状态。2.有限状态机的同步复位3.有限状态机的异步复位多余状态的处理一般有如下两种处理多余状态的方法:(1)在case语句中用default分支决定如果进入无效状态所采取的措施;(2)编写必要的Verilog源代码明确定义进入无效状态所采取的行为。8.6.2频率计控制器设计举例设计一个自动转换量程的频率计控制器,用Mealy状态机实现。进入100K量程(状态A)reset=1;std_f_sel=00100K量程测量(状态B)reset=0;std_f_sel=00进入100K量程(状态C)reset=1;std_f_sel=01100K量程测量(状态D)reset=0;std_f_sel=01进入100K量程(状态E)reset=1;std_f_sel=111K量程测量(状态D)reset=0;std_f_sel=11cntlow=1cntlow=1cntlow=1cntlow=1cntover=1cntover=1【例10.8】自动转换量程频率计控制器/*信号定义clk:时钟输入reset:系统复位信号half_dollar:投入5角硬币one_dollar:投入1元硬币half_out:找零信号dispense:机器售出饮料collect:提示取走饮料*/moduleFSM(clk,clr,out,start,step2,step3);inputclk,clr,start,step2,step3;output[2:0]out;reg[2:0]out;reg[1:0]state,next_state;parameterstate0=2’b00,state1=2’b01,//状态编码state2=2’b11,state3=2’b10;//格雷码always@(posedgeclkorposedgeclr)beginif(clr)state=state0;//定义初态elsestate=next_state;endalways@(stateorstartorstep2orstep3)//状态转换begincase(state)state0:beginif(start)next_state=state1;elsenext_state=state0;endstate1:beginnext_state=state2;endstate2:beginif(step2)next_state=state3;elsenext_state=state0;endstate3:beginif(step3)next_state=state0;elsenext_state=state3;enddefault:next_state=state0;endcaseendalways@(state)//状态译码及输出begincase(state)state0:out=3'b001;state1:out=3'b010;state2:out=3'b100;state3:out=3'b111;default:out=3'b001;endcaseendendmodule8.6.3基于状态机的设计要点1.起始状态的选择电路复位后所处的状态合理的起始状态使系统更加高效2.状态编码二进制编码(BinaryEncoding)容易产生毛刺,引起逻辑错误格雷编码(GrayEncoding)减少了产生毛刺和一些暂态的可能一位热码编码(One-HotEncoding)提高了电路速度、可靠性和资源利用率三种编码的对比010State2011State3100State4101State5110State6111State7001State10000010000001000000100000010000001000000100000000000001000000001011010110111101100001000000State0一位热码格雷编码二进制编码状态3.状态编码的定义parameter参数parameterstate1=2'b00,st