1、第八章 有限状态机设计,EDA技术与应用,教学重点,MOORE状态机 MEALY状态机 有限状态机的几种描述方式 有限状态机的状态编码,8.1 有限状态机,构成 组合逻辑 状态译码、产生输出 时序逻辑 存储状态 分类 Moore 输出是现态的函数 Mealy 输出是现态和输入的函数,摩尔型(Moore)状态机,米里型(Mealy)状态机,Moore型状态图,现态,次态,module fsm(clk,clr,z,qout);/模5计数器 input clk,clr; output reg z; output reg2:0 qout; always (posedge clk or posedge
2、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 end always (qout) /*此过程产生输出逻辑*/ begin case(qout) 3b100: z=1b1; default:z=1b0; endcase end endmodule,Me
3、aly型状态图,【例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 ( posedge clk or posedge clr ) begin if( clr )
4、state = state0; / 定义初态 else state = next_state; end,always ( state or start or step2 or step3 ) / 状态转换 begin case (state) state0: begin if( start ) next_state = state1; else next_state = state0; end state1: begin next_state = state2; end,state2: begin if( step2 ) next_state = state3; else next_state
5、 = state0; end state3: begin if( step3 ) next_state = state0; else next_state = state3; end default: next_state = state0; endcase end,always ( state ) / 状态译码及输出 begin case( state ) state0: out = 3b001; state1: out = 3b010; state2: out = 3b100; state3: out = 3b111; default: out = 3b001; endcase end e
6、ndmodule,(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 有限状态机的Verilog描述,“101”序列检测器的
7、Verilog描述(三个过程),module fsm1_seq101(clk,clr,x,z); input clk,clr,x; output reg z; reg1:0 state,next_state; parameter S0=2b00,S1=2b01,S2=2b11,S3=2b10; /*状态编码,采用格雷(Gray)编码方式*/ always (posedge clk or posedge clr) /*该过程定义当前状态*/ begin if(clr) state=S0; /异步复位,s0为起始状态 else state=next_state; end,“101”序列检测器的Ve
8、rilog描述(三个过程),always (state or x) /*该过程定义次态*/ begin case (state) S0:begin if(x) next_state=S1; else next_state=S0; end S1:begin if(x) next_state=S1; else next_state=S2; end,S2:begin if(x) next_state=S3; else next_state=S0; end S3:begin if(x) next_state=S1; else next_state=S2; end default: next_state
9、=S0; /*default语句*/ endcase end,always (state) /*该过程产生输出逻辑*/ begin case(state) S3: z=1b1; default:z=1b0; endcase end endmodule,“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;/*状态编码
10、,采用格雷(Gray)编码方式*/,“101”序列检测器(单过程描述),always (posedge clk or posedge clr) Begin if(clr) state=S0; /异步复位,s0为起始状态 else case(state) S0:begin if(x) begin state=S1; z=1b0;end else begin state=S0; z=1b0;end end S1:begin if(x) begin state=S1; z=1b0;end else begin state=S2; z=1b0;end end S2:begin if(x) begin
11、state=S3; z=1b0;end else begin state=S0; z=1b0;end end S3:begin if(x) begin state=S1; z=1b1;end else begin state=S2; z=1b1;end end default:begin state=S0; z=1b0;end /*default语句*/ endcase end endmodule,8.3 状 态 编 码, 顺序编码 格雷编码 约翰逊编码 一位热码,常用的编码方式,一位热码编码选择对话框(Quartus ),状态编码的定义,在Verilog语言中,有两种方式可用于定义状态编码,
12、分别用parameter和define语句实现,比如要为state0、state1、state2、state3四个状态定义码字为:00、01、11、10,可采用下面两种方式。 方式1:用parameter参数定义 parameter state1=2b00,state2=2b01,state3=2b11,state4=2b10; case(state) state1: ; /调用 state2: ; ,要注意两种方式定义与调用时的区别,一般情况下,更倾向于采用方式1来定义状态编码。一般使用case、casez和casex语句来描述状态之间的转换,用case语句表述比用if-else语句更清晰明
13、了。,状态编码的定义方式2:用define语句定义 define state1 2b00 /不要加分号“;” define state2 2b01 define state3 2b11 define state4 2b10 case(state) state1: ; /调用,不要漏掉符号“” state2: ; ,状态编码的定义,8.4 有限状态机设计要点,1起始状态的选择 : 起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁、高效。多数EDA软件会自动为基于状态机的设计选择一个最佳的起始状态。 2有限状态机的同步复位 3有限状态机的异步复位,多余状态的处理,一般有如下
14、两种处理多余状态的方法: (1)在case语句中用default分支决定如果进入无效状态所采取的措施; (2)编写必要的Verilog源代码明确定义进入无效状态所采取的行为。,频率计控制器设计举例,设计一个自动转换量程的频率计控制器,用Mealy状态机实现。,进入100K量程(状态A) reset = 1; std_f_sel = 00,100K量程测量(状态B) reset = 0; std_f_sel = 00,进入100K量程(状态C) reset = 1; std_f_sel = 01,100K量程测量(状态D) reset = 0; std_f_sel = 01,进入100K量程(状
15、态E) reset = 1; std_f_sel = 11,1K量程测量(状态D) reset = 0; std_f_sel = 11,cntlow = 1,cntlow = 1,cntlow = 1,cntlow = 1,cntover = 1,cntover = 1,【例10.8】自动转换量程频率计控制器 /* 信号定义 clk: 时钟输入 reset: 系统复位信号 half_dollar: 投入5角硬币 one_dollar: 投入1元硬币 half_out: 找零信号 dispense: 机器售出饮料 collect: 提示取走饮料 */,module FSM( clk, clr,
16、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 ) begin if( clr ) state = state0; / 定义初态 else state = next_stat
17、e; end,always ( state or start or step2 or step3 ) / 状态转换 begin case (state) state0: begin if( start ) next_state = state1; else next_state = state0; end state1: begin next_state = state2; end,state2: begin if( step2 ) next_state = state3; else next_state = state0; end state3: begin if( step3 ) next
18、_state = state0; else next_state = state3; end default: next_state = state0; endcase end,always ( state ) / 状态译码及输出 begin case( state ) state0: out = 3b001; state1: out = 3b010; state2: out = 3b100; state3: out = 3b111; default: out = 3b001; endcase end endmodule,对A/D器件进行采样控制,用单片机完成编程简单,控制灵活,但控制周期长,速度慢。 使用FPGA的状态机来控制A/D采样,可以充分发挥高速采样的特性。,状态机设计举例:数字电压表,1. ADC0809引脚,2. ADC0809工作时序,3. 控制ADC0809采样状态图,将状态码直接输出作为控制信号,每一位的编码值都赋予了实际的控制功能。,状态位直接输出型编码,ADC0809采样控制信号状态编码表,4. 采样状态机结构,