乐趣区

关于fpga:状态机设计举例

⭐本专栏针对 FPGA 进行入门学习,从数电中常见的逻辑代数讲起,联合 Verilog HDL 语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机 FSM 进行分析与建模。
🔥文章和代码已归档至【Github 仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。

汽车尾灯控制电路设计

重点介绍结构状态图的两种办法:一是试探法,二是基于算法状态机构造状态图的办法。

例 (试探法)汽车尾灯收回的信号次要是给前面行驶汽车的司机看的,通常汽车驾驶室有刹车开关(HAZ)、左转弯开关 (LEFT) 和右转弯开关(RIGHT),司机通过操作这 3 个开关给出车辆的行驶状态。假如在汽车尾部左、右两侧各有 3 个指示灯,别离用 LA、LB、LC、RA、RB、RC 示意,如图所示。这些灯的亮、灭法则如下:

  1. 汽车失常行驶时,尾部两侧的 6 个灯全副燃烧。
  2. 刹车时,汽车尾灯工作在告警状态,所有 6 个灯按肯定频率闪动(或始终放弃常亮状态)。
  3. 左转弯时,左侧 3 个灯轮流程序点亮(或按肯定频率闪动),其法则如图(a)所示,右侧灯全灭。
  4. 右转弯时,右侧 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),试设计一个主干道和支干道十字路口的交通灯控制电路,其技术要求如下:

  1. 个别状况下,放弃主干道畅通,主干道绿灯亮、支干道红灯亮,并且主干道绿灯亮的工夫不得少于 60 秒。
  2. 主干道车辆通行工夫曾经达到 60 秒,且支干道有车时,则主干道红灯亮、支干道绿灯亮,但支干道绿灯亮的工夫不得超过 30 秒。
  3. 每次主干道或支干道绿灯变红灯时,黄灯先亮 5 秒钟。

设计步骤:

  1. 明确零碎的性能,进行逻辑形象
  2. 确定零碎计划并画出 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        YELLOW
module controller (CLK, S, nRESET, HG, HY, HR, FG, FY, FR, TimerH, TimerL);
//I/O ports
input CLK, S, nRESET;  //if S=1, indicates that there is car on the country road
output HG, HY, HR, FG, FY, FR; 
//declared output signals are registers
reg    HG, HY, HR, FG, FY, FR;
output [3:0] TimerH;
output [3:0] TimerL;
reg    [3:0] TimerH, TimerL;
//Internal state variables
wire Tl, Ts, Ty; //timer output signals
reg St;           //state translate signal
reg [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; end
end  // BCD counter
assign  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 clock
always @(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 statements
always @(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 signal
always @(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
   end
endmodule

状态机设计准则

状态机要平安,是指 FSM 不会进入死循环,特地是不会进入非预知的状态,而且因为某些扰动进入非设计状态,也能很快的复原到失常的状态循环中来。这外面有两层含意:

其一要求该 FSM 的综合实现后果无毛刺等异样扰动;

其二要求 FSM 要齐备,即便受到异样扰动进入非设计状态,也能很快复原到失常状态。

状态机的设计要满足设计的面积和速度的要求;

状态机的设计要清晰易懂、易保护.

FSM 输入办法

ONE HOT 编码

应用 N 位状态寄存器表白具备 Ng 状态的 FSM,每个状态具备独立的寄存器位。任意时刻只有 1 位寄存器为 1,即 hot point。此为 one hot。

One hot 编码方程用简略的次态方程驱动,缩小了状态寄存器之间的组合逻辑级数,因而进步了运行速度。同时是以就义寄存器逻辑资源和进步老本为代价的。

指标器件具备较多寄存器资源,寄存器之间组合逻辑较少时比拟实用。

无限状态机 HDL 形容规定

独自用一个模块来形容一个无限状态机。这样易于简化状态的定义、调试和批改;同时,也可应用 EDA 工具来进行综合与优化。

应用代表状态名的参数(parameter)来给状态赋值,不应用宏定义(define)。宏定义产生全局定义,参数则仅仅定义一个模块内的部分定义常量。不宜产生抵触。

在 always 组合块中应用阻塞赋值,在 always 时序块中应用非阻塞赋值。

可靠性与容错性

状态机应该有一个默认(default)状态,当转移条件不满足,或者状态产生了渐变时,要能保障逻辑不会陷入“死循环”;

状态机残余状态的设置(3 个去向):

a) 转入闲暇状态,期待下一个工作工作的到来;

b) 转入指定的状态,去执行特定工作;

c) 转入预约义的专门处理错误的状态,如预警状态。

参考文献:

  1. Verilog HDL 与 FPGA 数字零碎设计,罗杰,机械工业出版社,2015 年 04 月
  2. Verilog HDL 与 CPLD/FPGA 我的项目开发教程(第 2 版), 聂章龙, 机械工业出版社, 2015 年 12 月
  3. Verilog HDL 数字设计与综合(第 2 版), Samir Palnitkar 著,夏宇闻等译, 电子工业出版社, 2015 年 08 月
  4. Verilog HDL 入门(第 3 版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019 年 03 月

欢送关注公众号【AIShareLab】,一起交换更多相干常识,前沿算法,Paper 解读,我的项目源码,面经总结。

退出移动版