关于fpga:状态机设计举例
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。汽车尾灯控制电路设计重点介绍结构状态图的两种办法:一是试探法,二是基于算法状态机构造状态图的办法。 例 (试探法)汽车尾灯收回的信号次要是给前面行驶汽车的司机看的,通常汽车驾驶室有刹车开关(HAZ)、左转弯开关(LEFT)和右转弯开关(RIGHT),司机通过操作这3个开关给出车辆的行驶状态。假如在汽车尾部左、右两侧各有3个指示灯,别离用LA、LB、LC、RA、RB、RC示意,如图所示。这些灯的亮、灭法则如下: 汽车失常行驶时,尾部两侧的6个灯全副燃烧。刹车时,汽车尾灯工作在告警状态,所有6个灯按肯定频率闪动(或始终放弃常亮状态)。左转弯时,左侧3个灯轮流程序点亮(或按肯定频率闪动),其法则如图(a)所示,右侧灯全灭。右转弯时,右侧3个灯轮流程序点亮(或按肯定频率闪动),其法则如图(b)所示,左侧灯全灭。假如电路的输出时钟信号为CP,CP的频率对于汽车尾灯所要求的闪动频率。试根据上述要求设计出一个时钟同步的状态机来管制汽车的尾灯。 (1)画出原始状态图 抉择Moore机设计该电路,则尾灯的亮、灭间接由状态译码就能够失去。由设计要求可知:汽车左转弯时,左边的灯不亮而右边的灯顺次循环点亮,即0个、1个、2个或3个灯亮,别离用L0、L1、L2、L3示意,状态机在4个状态中循环。同理,汽车右转弯时,状态机也会在4个状态中循环,即右边灯不亮而左边的灯有0个、1个、2个或3个灯亮,别离用R0、R1、R2、R3示意。因为L0和R0都示意6个灯不亮,所以合起来用IDLE示意。将6个灯都亮的状态用LR3示意。可得原始的状态图就画进去了,如图所示。 剖析一下下图,就会发现一个没有思考到的理论问题,即如果多个输出同时无效,状态机如何工作呢?下图解决了多个输出同时无效的问题,并将LEFT和RIGHT同时无效的状况解决成告警状态。通过改良且具备这一个性的状态图如下所示。 (2)列出电路的输入 因为电路的输入信号较多,不便于写在状态图中,所以独自列出输入逻辑真值表,如表所示。 (3)抉择一种编码方案,对上述状态图进行状态调配,而后用Verilog HDL形容状态图和输入逻辑。 状态图实现后,必须进行齐备性和互斥性的查看。 ①齐备性的查看办法是:对于每一个状态,将所有脱离这一状态的条件表达式进行逻辑或运算,如果后果为1就是齐备的。否则不齐备,也就是说状态图进入某状态后,却不能跳出该状态。 ②互斥性的查看办法是:对于每一个状态,将所有脱离这一状态的条件表达式找进去,而后任意两个表达式进行逻辑与运算,如果后果为0就是互斥的。也就是要保障在任何时候不会同时激活两个脱离状态的转换,即从一个状态跳到两个状态。 利用算法状态机设计十字路口交通灯控制电路算法状态机ASM(Algorithmic State Machine)图是形容数字零碎控制算法的流程图。利用ASM图设计数字零碎,能够很容易将语言形容的设计问题变成时序流程图的形容,依据时序流程图就能够失去电路的状态图和输入函数,从而得出相应的硬件电路。 1.ASM图的状态框、判断框和输入框。ASM图中有三种根本的符号,即状态框、判断框和输入框。数字系统控制序列中的状态用状态框示意,如图(a)所示。图(b)为状态框实例。图中的箭头示意零碎状态的流向。 判断框示意状态变量对控制器工作的影响,如图所示: 条件输入框如下图所示,条件框的入口必然与判断框的输入相连。 2.ASM图中各种逻辑框之间的工夫关系从外表上来看ASM图与程序流程图很类似,但实际上有很大的差别。程序流程图只示意事件产生的先后顺序,没有工夫概念,而ASM图则不同,它示意事件的准确工夫距离程序。在ASM图中每一个状态框示意一个时钟周期内的零碎状态,状态框和与之相连的判断框,条件输入框所规定的操作,都是在一个独特的时钟周期实现的,同时零碎的控制器从当初状态(现态)转移到下一个状态(次态)。因而,能够很容易将图(a)所示的ASM图转换成状态图,如图(b)所示,其中E和F为状态转换条件。与ASM图不同,状态图无奈示意寄存器操作。 图(c)给出了ASM图的各种操作及状态转换的工夫图。 3.十字路口交通灯控制电路设计举例例(基于算法状态机构造状态图的办法)图4.4.10示意位于主干道和支干道的十字路口交通灯零碎,支干道两边装置有传感器S(Sensor),试设计一个主干道和支干道十字路口的交通灯控制电路,其技术要求如下: 个别状况下,放弃主干道畅通,主干道绿灯亮、支干道红灯亮,并且主干道绿灯亮的工夫不得少于60秒。主干道车辆通行工夫曾经达到60秒,且支干道有车时,则主干道红灯亮、支干道绿灯亮,但支干道绿灯亮的工夫不得超过30秒。每次主干道或支干道绿灯变红灯时,黄灯先亮5秒钟。 设计步骤: 明确零碎的性能,进行逻辑形象确定零碎计划并画出ASM图 交通灯管制单元的管制过程分为四个阶段,对应的输入有四种状态,别离用S0, S1, S2和S3示意: S0状态:主干道绿灯亮支干道红灯亮,此时若支干道有车期待通过,而且主干道绿灯已亮足规定的工夫距离TL(60s),控制器收回状态转换信号ST,控制器从状态S0转换到S1。 S1状态:主干道黄灯亮,支干道红灯亮,进入此状态,黄灯亮足规定的工夫距离TY(5s)时,控制器收回状态转换信号ST,控制器从状态S1转换到S2。 S2状态:支干道绿灯亮,主干道红灯亮,若此时支干道持续有车,则持续放弃此状态,但支干道绿灯亮的工夫不得超过TS(30s)工夫距离,否则管制单元收回状态转换信号ST,控制器转换到S3状态。 S3状态:支干道黄灯亮,主干道红灯亮,此时状态与S1状态继续的工夫距离雷同,均为TY(5s) ,工夫到时,控制器收回ST信号,控制器从状态S3回到S0状态。 对上述S0、S1、S2和S3四种状态依照格雷码进行状态编码,别离为00,01,11和10,由此失去交通灯管制单元的ASM图如图所示。依此类推得出所示的状态图。 (3)交通灯控制器各功能模块电路的框架设计 通过剖析交通灯控制电路的要求可知,零碎次要由传感器S(Sensor)、时钟脉冲产生器(CLK )、定时器(TL, TS, TY)、控制器及译码器形成,传感器S在有车辆通过时收回一个高电平信号。 ①设计控制器 依据交通灯管制单元的ASM图,得出其状态图如图4.4.13所示。ASM图中的状态框与状态图中的状态绝对应,判断框中的条件是状态转换的输出条件,条件输入框与管制单元状态转换的输入绝对应。状态图是形容状态之间的转换。 ②设计定时器 定时器由与零碎秒脉冲同步的计数器形成,时钟脉冲回升沿到来时,在管制信号ST作用下,计数器从零开始计数,并向控制器提供模M5、M30和M60信号,即TY、TS和TL定时工夫信号。 ③设计译码器 当交通灯控制电路处于不同工作状态时,交通信号灯按肯定的法则与之对应。 (4)用Verilog HDL形容交通灯控制电路 依据以上设计思路,能够写出交通灯控制电路的Verilog HDL代码如下: //--------------- controller.v ---------------// Traffic Signal Controller//State definition HighWay Country`define S0 2'b00 //GREEN RED,采纳宏定义形式给出状态编码`define S1 2'b01 //YELLOW RED,不倡议采纳此办法`define S2 2'b11 //RED GREEN`define S3 2'b10 //RED YELLOWmodule controller (CLK, S, nRESET, HG, HY, HR, FG, FY, FR, TimerH, TimerL);//I/O portsinput CLK, S, nRESET; //if S=1, indicates that there is car on the country roadoutput HG, HY, HR, FG, FY, FR; //declared output signals are registersreg HG, HY, HR, FG, FY, FR;output [3:0] TimerH;output [3:0] TimerL;reg [3:0] TimerH, TimerL;//Internal state variableswire Tl, Ts, Ty; //timer output signalsreg St; //state translate signalreg [1:0] CurrentState, NextState; //FSM state register/*===== Description of the timer block =====*/always @(posedge CLK or negedge nRESET )begin: counter if (~nRESET) {TimerH, TimerL} <= 8'h00; else if (St) {TimerH, TimerL} <= 8'h00; else if ((TimerH == 5) & (TimerL == 9)) begin {TimerH, TimerL} <= {TimerH, TimerL}; end else if (TimerL == 9) begin TimerH <= TimerH + 1; TimerL <= 0; end else begin TimerH <= TimerH; TimerL <= TimerL + 1; endend // BCD counterassign Ty = (TimerH==0)&(TimerL==4);assign Ts = (TimerH==2)&(TimerL==9);assign Tl = (TimerH==5)&(TimerL==9);/*===== Description of the signal controller block =====*///FSM register:State change only at positive edge of clockalways @(posedge CLK or negedge nRESET ) begin: statereg if (~nRESET) //Signal controller starts in S0 state CurrentState <= `S0; else CurrentState <= NextState; end //statereg// FSM combinational block: state machine using case statementsalways @(S or CurrentState or Tl or Ts or Ty ) begin: fsm case(CurrentState) `S0: begin //S0是用define定义的,在援用时要加右撇号(反撇号) NextState = (Tl && S) ? `S1 :`S0; St = (Tl && S) ? 1:0; end `S1: begin NextState = (Ty) ? `S2 :`S1; St = (Ty) ? 1:0; end `S2: begin NextState = (Ts || ~S) ? `S3 :`S2; St = (Ts || ~S) ? 1:0; end `S3: begin NextState = (Ty) ? `S0 :`S3; St = (Ty) ? 1:0; end endcase end //fsm/*===== Description of the decoder block =====*///Compute values of main signal and country signalalways @(CurrentState) begin case (CurrentState) `S0: begin {HG, HY, HR} = 3'b100; //Highway signal is green {FG, FY, FR} = 3'b001; //Country signal is red end `S1: begin {HG, HY, HR} = 3'b010; //Highway signal is yellow {FG, FY, FR} = 3'b001; //Country signal is red end `S2: begin {HG, HY, HR} = 3'b001; //Highway signal is red {FG, FY, FR} = 3'b100; //Country signal is green end `S3: begin {HG, HY, HR} = 3'b001; //Highway signal is red {FG, FY, FR} = 3'b010; //Country signal is yellow end endcase endendmodule状态机设计准则状态机要平安,是指FSM不会进入死循环,特地是不会进入非预知的状态,而且因为某些扰动进入非设计状态,也能很快的复原到失常的状态循环中来。这外面有两层含意: ...