《Verilog HDL数字系统设计与应用》 课件 FPGA-第7章-基本时序逻辑电路的设计.pptx
第7章有限状态机的设计;有限状态机(Finite-StateMachine,FSM)简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机是一种实现高可靠控制模块的经典方法,具有速度快、可靠性高、结构简单等优点,是数字系统设计的重要组成部分。在VerilogHDL设计中,常用always和case来描述状态机。;有限状态机是由组合逻辑和寄存器逻辑构成的时序电路,组合逻辑主要用于状态的判断、译码和信号的产生输出,寄存器逻辑主要负责状态的存储和转移。有限状态机可分为两类:摩尔型(Moore)和米里型(Mealy)。;如图7.1所示,摩尔型状态机的输出仅由当前状态决定。状态机的输出会在一个完整的时钟周期后保持稳定,即当输入变化时,还需等下一个时钟的到来,输出才会发生变化(异步输出)。;如图7.2所示,米里型状态机的输出由当前状态和输入信号决定。状态机的输出在一个完整的时钟周期内就保持稳定,即当输入变化时,输出也立即发生变化(同步输出)。;有限状态机有三种表示方法:流程图(ASM图)、状态图(状态转移图)、状态表。三种表示方法是可以相互转换的,但状态图是最常用的表示方式(延用数字逻辑电路时序电路的表示方式)。在VerilogHDL设计中,常用一段式、两段式和三段式来描述状态机。;状态图的每个圆圈表示一个状态,每个箭头表示一次跳转。摩尔型状态机的输出写在圆圈内,如图7.3所示。米里型状态机的输入和输出写在箭头上,如图7.4所示。;有限状态机属于时序电路,设计的对象包括:状态寄存器(现态:CurrentState)、状态逻辑(次态:NextState)和输出逻辑(输出:OutputLogic)。次态的描述应该按照状态图、状态表或者流程图进行跳转,在描述风格上主要分为以下三种:
(1)一段式:在一个always中将现态、次态和输出逻辑写在一起。这种方法不容易维护,特别是状态复杂时容易出错。
(2)两段式:将现态和次态放在一个always中,将输出逻辑写在另一个always中;或者将现态放在一个always中,将次态和输出逻辑写在另一个always中。这种方法便于阅读、维护,有利于综合器优化代码。但是,在描述当前状态的输出采用组合逻辑实现,容易产生毛刺。
(3)三段式:将现态、次态和输出逻辑分别写在三个always中描述。与两段式相比,三段式是根据上一状态的输入条件决定当前的状态输出,在不插入时钟的前提下实现寄存器输出的,从而消除了组合逻辑输出带来的亚稳态和毛刺的隐患,而且更有利于综合和布局布线。;采用一段式、两段式和三段式分别设计模6计数器:系统带有同步复位端(低电平复位);计数器从0开始计数到5(101),输出端z等于1;计数器状态编码采用顺序编码。;模6计数器的状态跳转需6次,这里采用localparam对6种状态进行顺序编码。在同一个always语句中对现态、次态和输出逻辑统一描述。
【例7.1】采用一段式状态机描述模6计数器(方法一)。
`timescale1ns/1ps
modulefsm_counter6_1(Q,z,clk,Res);
outputreg[2:0]Q;
outputregz;
inputclk;
inputRes;
reg[2:0]state;
localparam[2:0]s0=3b000,s1=3b001,s2=3b010,//状态编码
s3=3b011,s4=3b100,s5=3b101;
always@(posedgeclk);begin
if(Res==0)
beginstate=s0;Q=0;z=0;end//同步复位
else
begin
case(state)
s0:beginstate=s1;Q=3b000;z=0;end
s1:beginstate=s2;Q=3b001;z=0;end
s2:beginstate=s3;Q=3b010;z=0;end
s3:beginstate=s4;Q=3b011;z=0;end
s4:beginstate=s5;Q=3b100;z=0;end
s5:beginstate=s0;Q=3b101;z=1;end
default:beginstate=s0;Q=3b000;z=0;end
//多余的状态处理
endcase
end
end
endmodule;例7.1设计了一个带同步复位端的模6计数器。在时钟上升沿的瞬间检测Res为低电平时复位,为高电平时机器正常工作;采用case语