1、第七章第七章 有限状态机有限状态机设计设计LOREM IPSUM DOLOR目 录CONCENT7.1 有限状态机的基本概念7.2 有限状态机的算法描述7.3 有限状态机描述的基本语法7.4 状态初始化7.5 状态编码7.6 Full Case 与 Parallel Case7.7 实例7.1 有限状态机的基本概念GRADUATION THESIS7.1 有限状态机的基本概念 数字世界主要由组合逻辑电路和时序逻辑电路组成。而时序逻辑电路区别于组合逻辑电路关键在于时序性以及电路的记忆功能。通常,时序逻辑电路的基本单元都是 D 触发器。有限状态机则是在时钟信号的控制下,结合组合逻辑电路和时序逻辑电
2、路而形成的一种的电路描述行为。在时钟信号有效边沿的作用下,有限状态机电路会进行顺序的跳动时序中的每一步就称之为状态。有限状态机不仅仅只是一个时序逻辑系统,而且还包含有组合逻辑电路。其行为是在时钟边沿的作用下按照时钟间隔顺序发生。其行为的跳转可能是有条件的,也可能是无条件的。比如在交通灯系统设计中,由黄变红是无条件的,而由红变绿则是有条件的。7.1 有限状态机的基本概念7.1 有限状态机的基本概念通过 Synplify Pro 综合后生成的逻辑电路图如下:7.1 有限状态机的基本概念7.1.1 Mearly 型状态机型状态机1951 年,G.H.Mearly 提出了一种并以他名字命名的新型状态机
3、Mearly 型状态机。其状态跳转图如图 7-1 所示。它的输出不仅与当前状态有关,而且与输入信号相关,因而在状态跳转图中的每条转移边需要包含输入和输出的信息。由于 Mearly 型状态机的输出与输入信号有关,而输入信号可能在一个时钟周期内任何时刻发生变化,所以 Mearly 型状态机对输入的响应会比 Moore 型状态机早一个周期,并且输入信号的噪声会直接影响到输出信号的质量。7.1.2 Moore 型状态机型状态机Moore 型状态机由 Edward F.Moore 提出,和 Mearly 型状态机最大的不同在于,其输出只与当前状态有关,与输入信号无关。在状态跳转图中,每条转移边只包含输入
4、信息,而在每个状态内,不仅会包含当前状态信息,而且还会包含输出信息。Mearly 型状态机都可以转化为一个等价的 Moore 型状态机7.1 有限状态机的基本概念Moore 型状态机把当前状态存储在触发器中,并把当前状态解码成输出。Moore 型状态机的输出会在时钟脉冲的有效边沿后的有限个门延后达到稳定值。7.2 有限状态机的算法描述GRADUATION THESIS7.2 有限状态机的算法描述有限状态机就可以抽象为关于关于图 中的变量的函数:FSM=f(X,Z,S,C,R)X有限状态机的输入信号集合;有限状态机的输入信号集合;Z有限状态机的输出信号集合;有限状态机的输出信号集合;S包含初始状
5、态的状态集合,包含初始状态的状态集合,S0S。如图。如图 7-1 中,中,S=00,01,10,11,初始状初始状S0=00;状态跳转函数:状态跳转函数:X x SS。如卡诺图中。如卡诺图中 N_State1:0和和 State1:0之间的关系之间的关系输出函数:输出函数:Mearly:X x SZ,Moore:SZ。C时钟信号时钟信号R复位信号。一旦该信号有效,有限状态机立即进入初始状态。复位信号。一旦该信号有效,有限状态机立即进入初始状态。7.3 有限状态机描述的基本语法GRADUATION THESIS7.3 有限状态机描述的基本语法【例 7-1】采用 SystemVerilog 实现图
6、 7-1 的有限状态机逻辑7.3 有限状态机描述的基本语法module FSM(input logic clk,input logic rst_l,input logic x,output logic z);enum logic 1:0S0,S1,S2,S3 state;always _ff(posedge clk,negedge rst_l)if(!rst_l)state=S0;else case(state)S0:state=(x)?S1:S0;S1:state=(x)?S2:S1;S2:state=(x)?S3:S2;S3:state=(x)?S0:S1;default:state=S0
7、;endcasealways_comb begin z=1b0;if(state=S2)z=x;else z=x;endmodule7.3 有限状态机描述的基本语法7.3 有限状态机描述的基本语法例 7-1 采用 SystemVerilog 所设计的一个可综合的有限状态机。从该例可以看出,对于有限状态机的描述,其基本语法会涉及到如下几部分:(1)变量声明(2)状态编码(3)状态跳转语句(4)组合逻辑语句(5)条件判断语句(6)多分支语句在复杂的有限状态机设计中,状态输出数量较多或者组合逻辑输出较多时,会影响在复杂的有限状态机设计中,状态输出数量较多或者组合逻辑输出较多时,会影响到代码的可读性,
8、一般可以采用任务和函数来进行封装,从而提高代码的可读性。到代码的可读性,一般可以采用任务和函数来进行封装,从而提高代码的可读性。(1)任务 task当状态跳转频繁时,可以采用 task 来进行封装;(2)函数 function当状态机内有大量重复使用的组合逻辑输出或者功能时,可以采用 function 来进行封装,这样整个代码会显得更为简洁;如例如例7.2所示所示7.3 有限状态机描述的基本语法【例 7-2】采用 function 进行有限状态机设计示例/IDLE STATE functionsIDLE,4b0_0_?_0:next_state=IDLE,1b0,1b0,1b0;IDLE,4b
9、1_0_?_0:next_state=WAIT,1b0,1b1,1b1;IDLE,4b0_1_?_0:next_state=WAIT,1b0,1b1,1b0;IDLE,4b1_1_?_0:next_state=WAIT,1b0,1b1,1b1;/WAIT STATE functions WAIT,4b0_0_?_0:next_state=WAIT,1b0,1b0,1b0;WAIT,4b0_?_0_0:next_state=WAIT,1b0,1b0,1b0;WAIT,4b0_1_1_0:next_state=DONE,1b0,1b1,1b0;WAIT,4b1_0_?_0:next_state=W
10、AIT,1b0,1b0,1b1;WAIT,4b1_?_0_0:next_state=WAIT,1b0,1b0,1b1;WAIT,4b1_?_0_0:next_state=WAIT,1b0,1b0,1b1;WAIT,4b1_1_1_0:next_state=DONE,1b0,1b1,1b1;/DONE STATE functions DONE,4b?_?_0_0:next_state=DONE,1b0,1b0,1b1;DONE,4b?_?_0_0:next_state=DONE,1b0,1b0,1b1;DONE,4b?_?_1_0:next_state=IDLE,1b1,1b0,1b1;7.4
11、状态机初始化GRADUATION THESIS7.4 状态机初始化1.初始化的必要初始化的必要 有限状态机在执行时必须初始化,否则将无法正确执行有限状态机在执行时必须初始化,否则将无法正确执行有限状态机的跳转动作,或者初始化不完整时会导致死锁有限状态机的跳转动作,或者初始化不完整时会导致死锁的现象。的现象。2.初始化方法初始化方法 在 SystemVerilog 或者 Verilog HDL 语言中,通常采用异步复位电路来实现状态机的初始化也就是说,当异步复位信号有效时,不管时钟信号的边沿是否有效,有限状态机将无条件进入其初始状态。3.初始化的关键初始化的关键 在状态初始化过程中,需要防止出现
12、伪初始化或者不完整初始化的情况,特别是针对采用一段式状态机把状态跳转和组合逻辑写在一起的状态机来说,这个尤为重要。7.4 状态机初始化【例【例 7-2】不完整初始化的有限状态机示例】不完整初始化的有限状态机示例module ex_FSM(input logic clk,input logic cs,input logic frame,input logic rst_,input logic rw,output logic ad_decode,output logic reg_type_dir,output logic rst_timer,output logic trdy);enum logi
13、c1:0 CY_TYPE=2b00,IDLE=2b01,START=2b10 state;always_ff(posedge clk,negedge rst_)if(!rst_)state=IDLE;/异步状态复位 else case(state)CY_TYPE:begin ad_decode=1b0;rst_timer=1b0;reg_type_dir=1b1;if(!frame)begin state=IDLE;trdy=1b1;end else begin state=CY_TYPE;trdy=1b0;end end 7.4 状态机初始化【例【例 7-2】不完整初始化的有限状态机示例(续
14、)】不完整初始化的有限状态机示例(续)IDLE:begin rst_timer=1b0;reg_type_dir=1b0;if(frame&cs)state=START;else state=IDLE;end START:beginad_decode=1b1;rst_timer=1b1;reg_type_dir=1b0;if(!frame)state=IDLE;else if(rw)begin state=CY_TYPE;reg_type_dir=1b1;end else state=START;end endcaseendmodule7.4 状态机初始化【例【例 7-2】不完整初始化的有限状
15、态机示例(续)】不完整初始化的有限状态机示例(续)例 7-2 为典型的一段式状态机,在该程序中,既有状态跳转,也有状态的逻辑输出,很容易生产死锁。程序主体一开始就针对状态机进行异步复位,状态机马上跳转至IDLE状态,但没有对所有的输出信号进行初始化,因此,当状态机跳转至 IDLE 状态时,ad_decode 和trdy 两信号没有被初始化,因而是未定状态。解决此问题的最好方式,就是针对状态机内的所有状态和输出信号进行初始化。同时,需要注意的是,本例没有采用 default 关键字,因此,如果出现状态为 2b11 时,状态机无法正常跳转,因此出现死锁的情况。正确的解决方式是增加一个 defaul
16、t 状态,或者才用 unique 和 priority 关键词来对 case 进行限定。7.4 状态机初始化always_ff(posedge clk,negedge rst_)if(!rst_)begin/状态异步复位和输出复位state=IDLE;ad_decode=1b0;rst_timer=1b0;reg_type_dir=1b1;trdy=1b0;end else unique case(state)CY_TYPE:begin ad_decode=1b0;rst_timer=1b0;reg_type_dir=1b1;if(!frame)begin state=IDLE;trdy=1b
17、1;end else begin state=CY_TYPE;trdy=1b0;end end 在 if 语句中针对所有的输出信号和状态进行初始化,同时在 case 语句前增加 unique 关键字,这样就可以避免死锁或者未完全初始化的情况。当然,本例还有更多更好的方式进行有限状态机设计,后续章节将陆续讲述。7.5 状态编码GRADUATION THESIS7.5 状态编码状态编码状态编码:有限状态机最重要的特征之一是状态编码。所谓的状态编码,就是对有限状态机的所有状态进行数字标识,并采用文本助记符与数字标识意义对应。不同的状态编码会导致不同的面积与速度。状态编码种类:状态编码种类:在数字逻辑
18、系统设计中,一般常见的数字编码方式有:二进制码(Binary 码)格雷码(Gray 码)独热码(One-hot 码)独冷码(One-cold 码)二-十进制码(BCD 码)等。7.5 状态编码定义方式:定义方式:Verilog HDL 一般采用参数进行状态编码,也可以采用define 宏定义的方式进行编码但一般不推荐此方式。参数编码的方式如下:parameter/these parameters represent state names IDLE=3b000,DECISION=3b001,READ1=3b010,READ2=3b011,READ3=3b100,READ4=3b101,WRIT
19、E=3b110;7.5 状态编码 SystemVerilog 也可以采用参数和宏定义的方式进行状态编码。但一般推荐采用枚举类型进行状态编码,如把上述的参数编码修改为枚举类型枚举类型的编码方式,如下:enum IDLE,DECISION,READ1,READ2,READ3,READ4,WRITE state;枚举类型不仅列出了每一种状态,同时也列出了枚举变量名称,状态编码可以显式声明,也可以省略,因此更加容易对应。但需要注意的是,枚举变量默认为但需要注意的是,枚举变量默认为 int 类型类型32 位,如果没有显式进行位,如果没有显式进行位宽限制,则在综合时会出现面积浪费的现象,从而出现告警。位宽
20、限制,则在综合时会出现面积浪费的现象,从而出现告警。因此,在采用枚举类型进行状态编码时,需要限定枚举变量位宽,如:enum logic2:0 IDLE=3b000,DECISION=3b001,READ1=3b010,READ2=3b011,READ3=3b100,READ4=3b101,WRITE=3b110 state;7.5 状态编码7.5.1 二进制码(二进制码(Binary 码)码)二进制码也叫顺序码(Sequential 码),是最简单也是最常用的状态编码方式。它的编码是顺序的,相邻两个状态之间相差为 1。状态数量和编码所需的位之间的关系是:其中,N 代表编码所需要的比特位,M 表
21、示状态数量。在该状态中,总计有 7 种状态,因此只需要三个比特位就可以实现状态编码。优点:优点:所占的 FPGA/CPLD 面积最小缺点:缺点:由于相邻状态进行转换时的状态位翻转的数量不确定7.5 状态编码7.5.2 格雷码(格雷码(Gray 码)码)格雷码,也称之为循环码,也是一种压缩编码,格雷码也是一种二-十进制编码,但它是一种无权码,采用绝对编码的方式。由于格雷码只改变一位,因而可以降低数字电路的尖峰电流脉冲格雷码一般由于格雷码只改变一位,因而可以降低数字电路的尖峰电流脉冲格雷码一般应用于对面积和速度都有一定要求的数字系统设计中应用于对面积和速度都有一定要求的数字系统设计中。7.5 状态
22、编码格雷码的声明:格雷码的声明:采用 SystemVerilog 进行格雷码编码声明如下:enum logic2:0 IDLE=3b000,DECISION=3b001,READ1=3b011,READ2=3b010,READ3=3b110,READ4=3b111,WRITE=3b101 state;二进制码和格雷码之间可以相互转换:二进制码和格雷码之间可以相互转换:(1)二进制码转换为格雷码)二进制码转换为格雷码:其中,其中,G 表示格雷码,表示格雷码,B 表示二进制码,表示二进制码,i 表示位号。表示位号。7.5 状态编码(2)格雷码转换为二进制码:)格雷码转换为二进制码:其中,其中,G
23、表示格雷码,表示格雷码,B 表示二进制码,表示二进制码,i 表示位号。表示位号。7.5 状态编码7.5.3 独热码(独热码(one-hot 码)和独冷码(码)和独冷码(one-cold 码)码)独热码和独冷码是相对的编码方式,也是一种特殊的二进制编码方式,属于非压缩编码。独热码是每个状态有且仅有一个 1,而独冷码是每个状态有且仅有一个 0。因此采用独热码或者独冷码进行状态编码所需要的比特位和有限状态机的状态数量一一对应。这种方式最大的缺点是这种方式最大的缺点是:占用的 FPGA/CPLD 面积最大。优点为:优点为:采用这种方式进行编码,其译码简单,状态机的运行速度会很快。因此,特别适合含有丰富
24、触发器的 FPGA 设计。7.5 状态编码采用采用 SystemVerilog 进行独热码和独冷码编码声明如下:进行独热码和独冷码编码声明如下:独热码:独热码:enum logic6:0 IDLE=7b000_0001,DECISION=7b000_0010,READ1=7b000_0100,READ2=7b000_1000,READ3=7b001_0000,READ4=7b010_0000,WRITE=7b100_0000 state;独冷码:独冷码:enum logic6:0 IDLE=7b111_1110,DECISION=7b111_1101,READ1=7b111_1011,READ
25、2=7b111_0111,READ3=7b110_1111,READ4=7b101_1111,WRITE=7b011_1111 state;7.5 状态编码7.5.4 状态编码原则和编译指导状态编码原则和编译指导 通常来说,状态编码基本原则状态编码基本原则是:(1)有足够的触发器逻辑,但需要满足速度要求,则优先采用独热码、独)有足够的触发器逻辑,但需要满足速度要求,则优先采用独热码、独冷码或者格雷码进行编码冷码或者格雷码进行编码(2)对面积和速度都有要求,则优先考虑格雷码进行编码)对面积和速度都有要求,则优先考虑格雷码进行编码(3)对速度没有要求,但逻辑资源紧张,则优先考虑格雷码和二进制码进)
26、对速度没有要求,但逻辑资源紧张,则优先考虑格雷码和二进制码进行编码行编码7.6 Full Case 与 Parallel CaseGRADUATION THESIS7.6 Full Case 与 Parallel Case【例 7-4】状态跳转图如图所示,采用 Verilog HDL 语言设计此有限状态机,并使用 full case 指导 Synplify Pro 综合软件进行综合。本例中有三个状态,分别是 A、B 和 C,对其采用格雷码编码:parameter A=2b00,B=2b01,C=2b11;而 2b10 状态为未定态。7.6 Full Case 与 Parallel Case部分
27、代码如下:module FSM_full_case(input clk,input RESET,input x,output reg 1:0 z);parameter A=2b00,B=2b01,C=2b11;reg 1:0 state always(posedge clk,posedge RESET)if(RESET)begin state=A;z=2b01;endelse case(state)/*synthesis full_case*/A:beginz=2b01;if(x)state=C;else state=B;end B:begin z=2b10;state=x?C:B;end C
28、:begin z=2b10;state=x?C:A;end endcaseendmodule7.6 Full Case 与 Parallel Case例例 7-4 并没有并没有 default 语句来表示其他状态如何执行状态跳转,换句话说,语句来表示其他状态如何执行状态跳转,换句话说,当状态跳转至当状态跳转至 2b10 时,状态机就出现了死锁的状态,这是设计不能出时,状态机就出现了死锁的状态,这是设计不能出现的状况。但在本例中采用了现的状况。但在本例中采用了 full case 的注释,指导的注释,指导 Synplify Pro 软件软件忽略掉忽略掉 2b10 状态,因而不会生成锁存器,具体可
29、以从状态,因而不会生成锁存器,具体可以从图图 7-9 综合后生成的逻辑电路看出综合后生成的逻辑电路看出7.6 Full Case 与 Parallel Case【例 7-5】针对例 7-4 所采用的状态跳转图,采用 Verilog HDL 语言设计此有限状态机,并使用 parallel case 指导 Synplify Pro 综合软件进行综合。else casez(state)/*synthesis parallel_case*/A:begin z=2b01;if(x)state=C;else state=B;endB:begin z=2b10;state=x?C:B;end C:begin
30、 z=2b10;state=x?C:A;end endcase7.6 Full Case 与 Parallel Caseparallel case 指导 Synplify Pro 生成的逻辑电路图会根据具体的硬件功能进行优化,其具体的逻辑电路如下7.7 状态机的描述GRADUATION THESIS7.7 状态机的描述 状态机由各种描述方式,可以深入到门级逻辑设计,也可以采用行为级描述。通常最常用的有三种描述方式:(1)一段式状态机一段式状态机(2)两段式状态机两段式状态机(3)三段式状态机。三段式状态机。这三种方式各有特点,在不同的场合有不同的应用。7.7 状态机的描述7.7.1 一段式状态
31、机一段式状态机概念:概念:一段式状态机是最原始的状态机,在该状态机内,仅仅只有一个一段式状态机是最原始的状态机,在该状态机内,仅仅只有一个 always 或者或者 always_ff语句块,该语句块内不仅含有状态跳转,还包含有组合逻语句块,该语句块内不仅含有状态跳转,还包含有组合逻辑的输入输出。辑的输入输出。特点:特点:一段式状态机混合了时序逻辑和组合逻辑,代码冗长,不利于代码的维护和修改,也不利于时序约束,因此不推荐采用一段式状态机进行有限状态机设计。7.7 状态机的描述【例 7-6】采用一段式状态机对图 7-11 的状态跳转图进行有限状态机设计7.7 状态机的描述代码采用 unique c
32、ase,表示忽略没有枚举的状态。代码中的每一个状态,既有状态跳转,也有逻辑输出。程序很容易产生锁存器。经过 Synplify Pro 软件综合后生成的逻辑电路如下7.7 状态机的描述7.7.2 两段式状态机两段式状态机概念:概念:两段式状态机把时序逻辑和组合逻辑分开设计,其中时序逻辑采用 always_ff 负责状态初始化和状态跳转,而组合逻辑则采用 always_comb 负责输出信号的初始化和输出逻辑设计。特点:特点:这样的设计不仅符合代码的风格,同时也提高了代码的可读性,容易维护。7.7 状态机的描述【例 7-7】采用两段式状态机对图 7-11 的状态跳转图进行有限状态机设计 程序含有两
33、个 always 语句块,其中 always_ff 语句用于有限状态机的异步复位和状态跳转,不涉及任何的输出信号逻辑。7.7 状态机的描述 两段式状态机还有两种额外的设计方式。一种方式是把状态机分为三部分进行:状态更新、下一个状态逻辑以及输出逻辑。因此,与例 7-7 不同在于,该状态机设计中需要定义两个枚举类型:现态和次态。具体设计如例 7-8 所示。【例 7-8】采用两段式状态机对图 7-11 的状态跳转图进行有限状态机设计/状态更新逻辑 always_ff(posedge clk,posedge R)if(R)state=SA;/状态初始化elsestate=next_state;alwa
34、ys_comb begin unique case(state)/次态更新逻辑SA:next_state=Start?SB:SA;SB:next_state=Read?SC:SD;SC:next_state=memDataAvail?SA:SC;SD:next_state=dataValid?SA:SD;endcaseendalways_comb begin/输出信号逻辑 ld_AddrUp=1b0;ld_AddrLo=1b0;dv=1b0;en_Data=1b0;ld_Data=1b0;/输出信号初始化 if(state=SA)ld_AddrUp=Start?1b1:ld_AddrUp;if
35、(state=SB)ld_AddrLo=1b1;if(state=SC)begin dv=1b1;en_Data=1b1;endif(state=SD)ld_Data=1b1;end7.7 状态机的描述另外的一类变体是采用一个 always_comb 语句把次态更新逻辑和输出逻辑放在一起,这样所有的基于状态的组合逻辑都集中在一起,在代码设计中经常会用到此种方式。【例 7-9】采用两段式状态机对图 7-11 的状态跳转图进行有限状态机设计/状态更新逻辑 always_ff(posedge clk,posedge R)if(R)state=SA;/状态初始化elsestate=next_state
36、;always_comb begin/基于状态的组合逻辑输出 ld_AddrUp=1b0;ld_AddrLo=1b0;dv=1b0;en_Data=1b0;ld_Data=1b0;/输出信号初始化unique case(state)SA:begin next_state=Start?SB:SA;ld_AddrUp=Start?1b1:ld_AddrUp;endSB:begin next_state=Read?SC:SD;ld_AddrLo=1b1;endSC:begin next_state=memDataAvail?SA:SC;dv=1b1;en_Data=1b1;endSD:begin n
37、ext_state=dataValid?SA:SD;ld_Data=1b1;endendcase7.7 状态机的描述7.7.3 三段式状态机三段式状态机 三段式状态机主要是为了解决两段式三段式状态机主要是为了解决两段式状态机采用组合逻辑输出所产生的毛刺问题,同时增加一级寄存器也可以有效地进状态机采用组合逻辑输出所产生的毛刺问题,同时增加一级寄存器也可以有效地进行时序计算和约束。行时序计算和约束。对于总线来说,容易使得总线数据对其,从而减小总线数据之间的偏斜,减小接收对于总线来说,容易使得总线数据对其,从而减小总线数据之间的偏斜,减小接收端数据采样出错的频率。端数据采样出错的频率。描述方式描述方
38、式;三段式状态机采用三个三段式状态机采用三个 always 语句块,分别是采用语句块,分别是采用 always_ff 语句块实现状态更语句块实现状态更新逻辑、采用新逻辑、采用 always_comb 语句块实现组合逻辑,以及采用语句块实现组合逻辑,以及采用 always_ff 语句块实语句块实现同步输出。现同步输出。7.7 状态机的描述【例 7-10】采用三段式状态机对图 7-11 的状态跳转图进行有限状态机设计/状态更新逻辑 always_ff(posedge clk,posedge R)if(R)state=SA;/状态初始化elsestate=next_state;always_comb
39、 begin unique case(state)/次态更新逻辑SA:next_state=Start?SB:SA;SB:next_state=Read?SC:SD;SC:next_state=memDataAvail?SA:SC;SD:next_state=dataValid?SA:SD;endcaseend always_ff(posedge clk,posedge R)if(R)begin/输出信号逻辑 ld_AddrUp=1b0;ld_AddrLo=1b0;dv=1b0;en_Data=1b0;ld_Data=1b0;/输出信号初始化endelseunique case(state)S
40、A:ld_AddrUp=Start?1b1:ld_AddrUp;SB:ld_AddrLo=1b1;SC:begin dv=1b1;en_Data=1b1;endSD:ld_Data=1b1;endcase7.7 状态机的描述 本例和两段式状态机的唯一区别在于两段式状态机采用组合逻辑输出,而三段式状态机采用 always_ff 语句输出,采用 Synplify Pro 生成的逻辑电路如下7.8 实例:交通信号灯控制系统的 SystemVerilog 程序设计GRADUATION THESIS7.8 实例:交通信号灯控制系统的 SystemVerilog 程序设计要求:假设 X 和 Y 分别表示两
41、个垂直相交的两条道路。在 X 和 Y 相交处需设计一个交通信号灯控制系统,以确保车辆和行人的有序通过。其基本要求是:1)X 车道的绿灯亮,Y 车道的红灯亮。表示 X 车道的车辆允许通行,Y 车道的车辆禁止通行。2)X 车道的黄灯亮,Y 车道的红灯亮。表示 X 车道上未过停车线的车辆停止通行,已过停车线的车辆继续通行,Y 车道的车辆禁止通行。3)X 车道的红灯亮,Y 车道的绿灯亮。表示 X 车道的车辆禁止通行,Y 车道的车辆允许通行。4)X 车道的红灯亮,Y 车道的黄灯亮。表示 X 车道的车辆禁止通行,Y 车道上未过停车线的车辆停止通行,已过停车线的车辆继续通行。5)为简化系统,绿灯亮的时间为
42、30 秒,在黄灯亮起的状态(2 和 4),黄灯每隔 1 秒闪烁一次,共 3 次6)整个交通灯控制系统从状态 1 到 4 循环进行。7.8 实例:交通信号灯控制系统的 SystemVerilog 程序设计从以上要求可知,交通信号灯的工作状态为 4 种状态,采用格雷码可以设 4 种状态编码如表所示:同时,输出信号分别为红、黄、绿三色。为了节省管脚,黄色可以采用红色和绿色共同作用来实现。因此,共有输出信号 4 个,分别如表所示7.9 本章小结状态机作为时序逻辑电路最基本、也是最重要的一个环节,是每一位 FPGA/CPLD 工程师必须掌握的知识。本章着重讲述了状态机的基本概念、算法描述、基本语言以及设计需要注意的各类事项。并通过交通信号灯控制系统的实例来具体说明如何应用 SystemVerilog 语言进行有限状态机的设计。作为 CPLD/FPGA 工程师,不要拘泥于状态机的实现形式是否是门级电路,还是行为级描述,是一段式还是两段式,或者三段式状态机,需根据具体的设计需求进行代码设计。谢谢您的观看THANK YOU