1、第八章 有限状态机设计l MOORE状态机l MEALY状态机l 有限状态机的几种描述方式l 有限状态机的状态编码8.1 有限状态机n 构成l 组合逻辑 状态译码、产生输出l 时序逻辑 存储状态n 分类lMoore 输出是现态的函数lMealy 输出是现态和输入的函数摩尔型(摩尔型(Moore)状态机)状态机 米里型(米里型(Mealy)状态机)状态机 Moore型状态图现态次态输入/输出module fsm(clk,clr,z,qout);/模模5计数器计数器input clk,clr;output reg z;output reg2:0 qout;always(posedge clk or
2、 posedge clr)/此过程定义状态转换 begin if(clr)qout=0;/异步复位 else case(qout)3b000:qout=3b001;3b001:qout=3b010;3b010:qout=3b011;3b011:qout=3b100;3b100:qout=3b000;default:qout=3b000;/*default语句*/endcase endalways(qout)/*此过程产生输出逻辑*/begin case(qout)3b100:z=1b1;default:z=1b0;endcase endendmoduleMealy型状态图start=0Stat
3、e0out=001clr=1step3=0State2out=100State1out=010start=1step3=1State3out=111step2=1step2=0【例10.7】状态机设计举例module FSM(clk,clr,out,start,step2,step3);input clk,clr,start,step2,step3;output2:0 out;reg2:0 out;reg1:0 state,next_state;parameter state0=2b00,state1=2b01,/状态编码 state2=2b11,state3=2b10;/格雷码always(
4、posedge clk or posedge clr)beginif(clr)state=state0;/定义初态else state=next_state;endalways(state or start or step2 or step3)/状态转换begin case(state)state0:beginif(start)next_state=state1;else next_state=state0;endstate1:beginnext_state=state2;endstate2:beginif(step2)next_state=state3;else next_state=sta
5、te0;endstate3:beginif(step3)next_state=state0;else next_state=state3;enddefault:next_state=state0;endcaseendalways(state)/状态译码及输出begincase(state)state0:out=3b001;state1:out=3b010;state2:out=3b100;state3:out=3b111;default:out=3b001;endcaseendendmodule(1)用三个过程描述:即现态(CS)、次态(NS)、输出逻辑(OL)各用一个always过程描述。(
6、2)双过程描述(CS+NS、OL双过程描述):使用两个always过程来描述有限状态机,一个过程描述现态和次态时序逻辑(CS+NS);另一个过程描述输出逻辑(OL)。(3)双过程描述(CS、NS+OL双过程描述):一个过程用来描述现态(CS);另一个过程描述次态和输出逻辑(NS+OL)。(4)单过程描述:在单过程描述方式中,将状态机的现态、次态和输出逻辑(CS+NS+OL)放在一个always过程中进行描述。8.2 有限状态机的Verilog描述“101”序列检测器的Verilog描述(三个过程)module fsm1_seq101(clk,clr,x,z);input clk,clr,x;o
7、utput reg z;reg1:0 state,next_state;parameter S0=2b00,S1=2b01,S2=2b11,S3=2b10;/*状态编码,采用格雷(Gray)编码方式*/always(posedge clk or posedge clr)/*该过程定义当前状态*/beginif(clr)state=S0;/异步复位,s0为起始状态else state=next_state;end“101”序列检测器的Verilog描述(三个过程)always(state or x)/*该过程定义次态*/begincase(state)S0:begin if(x)next_sta
8、te=S1;else next_state=S0;endS1:beginif(x)next_state=S1;else next_state=S2;endS2:beginif(x)next_state=S3;else next_state=S0;endS3:beginif(x)next_state=S1;else next_state=S2;enddefault:next_state=S0;/*default语句*/endcaseendalways(state)/*该过程产生输出逻辑*/begin case(state)S3:z=1b1;default:z=1b0;endcase endend
9、module“101”序列检测器的Verilog描述(三个过程)“101”序列检测器(单过程描述)module fsm4_seq101(clk,clr,x,z);input clk,clr,x;output reg z;reg1:0 state;parameter S0=2b00,S1=2b01,S2=2b11,S3=2b10;/*状态编码,采用格雷(Gray)编码方式*/“101”序列检测器(单过程描述)always(posedge clk or posedge clr)Begin if(clr)state=S0;/异步复位,s0为起始状态else case(state)S0:begin i
10、f(x)begin state=S1;z=1b0;endelse begin state=S0;z=1b0;end endS1:begin if(x)begin state=S1;z=1b0;endelse begin state=S2;z=1b0;end endS2:beginif(x)begin state=S3;z=1b0;endelse begin state=S0;z=1b0;end endS3:begin if(x)begin state=S1;z=1b1;endelse begin state=S2;z=1b1;end enddefault:begin state=S0;z=1b
11、0;end /*default语句*/endcaseendendmodule8.3 状 态 编 码 顺序编码 格雷编码 约翰逊编码一位热码常用的编码方式 一位热码编码选择对话框(Quartus)状态编码的定义在Verilog语言中,有两种方式可用于定义状态编码,分别用parameter和define语句实现,比如要为state0、state1、state2、state3四个状态定义码字为:00、01、11、10,可采用下面两种方式。方式1:用parameter参数定义 parameter state1=2b00,state2=2b01,state3=2b11,state4=2b10;case(
12、state)state1:;/调用 state2:;要注意两种方式定义与调用时的区别,一般情况下,更倾向于采用方式1来定义状态编码。一般使用case、casez和casex语句来描述状态之间的转换,用case语句表述比用if-else语句更清晰明了。状态编码的定义方式2:用define语句定义define state1 2b00 /不要加分号“;”define state2 2b01define state3 2b11define state4 2b10case(state)state1:;/调用,不要漏掉符号“”state2:;状态编码的定义8.4 有限状态机设计要点1起始状态的选择:起始状
13、态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁、高效。多数EDA软件会自动为基于状态机的设计选择一个最佳的起始状态。2有限状态机的同步复位 3有限状态机的异步复位多余状态的处理一般有如下两种处理多余状态的方法:(1)在case语句中用default分支决定如果进入无效状态所采取的措施;(2)编写必要的Verilog源代码明确定义进入无效状态所采取的行为。频率计控制器设计举例 设计一个自动转换量程的频率计控制器,用Mealy状态机实现。进入100K量程(状态A)reset=1;std_f_sel=00100K量程测量(状态B)reset=0;std_f_sel=00进入100
14、K量程(状态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:提示取走饮料*/m
15、odule FSM(clk,clr,out,start,step2,step3);input clk,clr,start,step2,step3;output2:0 out;reg2:0 out;reg1:0 state,next_state;parameter state0=2b00,state1=2b01,/状态编码 state2=2b11,state3=2b10;/格雷码always(posedge clk or posedge clr)beginif(clr)state=state0;/定义初态else state=next_state;endalways(state or start
16、 or step2 or step3)/状态转换begin case(state)state0:beginif(start)next_state=state1;else next_state=state0;endstate1:beginnext_state=state2;endstate2:beginif(step2)next_state=state3;else next_state=state0;endstate3:beginif(step3)next_state=state0;else next_state=state3;enddefault:next_state=state0;endca
17、seendalways(state)/状态译码及输出begincase(state)state0:out=3b001;state1:out=3b010;state2:out=3b100;state3:out=3b111;default:out=3b001;endcaseendendmodule 对A/D器件进行采样控制,用单片机完成编程简单,控制灵活,但控制周期长,速度慢。使用FPGA的状态机来控制A/D采样,可以充分发挥高速采样的特性。状态机设计举例:数字电压表1.ADC0809引脚2.ADC0809工作时序3.控制ADC0809采样状态图 将状态码直接输出作为控制信号,每一位的编码值都赋予了实际的控制功能。状态位直接输出型编码状态状态编码STARTALEOELOCK EOC功能说明ST000000初始态ST111000启动转换ST200001若EOC=1,转ST3ST300100输出转换好的数据ST400110锁存转换好的数据ADC0809采样控制信号状态编码表4.采样状态机结构祝您成功!