⭐本专栏针对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解读,项目源码,面经总结。