可分为摩尔(Moore)型状态机和Mealy型状态机,状态机的编码

  前言:状态机大法好,状态机几乎可以实现成套时序逻辑电路。

  前言:状态机大法好,状态机几乎可以兑现全方位时序逻辑电路。

少数状态机(Finite State Machine,
FSM),遵照状态机的出口是否与输入有关,可分为Moore型状态机和Mealy型状态机。穆尔(Moore)型状态机输出仅仅与现态有关和Mealy型状态机不仅与现态有关,也与输入有关,所以会遭逢输入的困扰,可能会暴发毛刺(Glith)的情形,所以大家平日接纳的是Moore型状态机。

个别状态机(Finite State Machine,
FSM),按照状态机的输出是否与输入有关,可分为穆尔(Moore)型状态机和Mealy型状态机。Moore型状态机输出仅仅与现态有关和Mealy型状态机不仅与现态有关,也与输入有关,所以会受到输入的困扰,可能会发生毛刺(Glith)的光景,所以大家普通使用的是摩尔(Moore)型状态机。

        
状态机的编码,二进制编码(Binary),格雷码编码(格雷(Gray)-code),独热码(One-hot)。不同的编码模式是防备在意况转移中生出突变,使得场地转移更为稳定,系统更加可靠,然则一般状态下大家一向拔取的是二进制举行编码,除非系统对稳定性和情景编码有特殊要求。

        
状态机的编码,二进制编码(Binary),格雷(格雷)码编码(格雷-code),独热码(One-hot)。不同的编码模式是提防在状态转移中发出剧变,使得场馆转移更为稳定,系统进一步可靠,不过普通意况下我们直接使用的是二进制举办编码,除非系统对稳定性和情况编码有特殊要求。

         状态机的叙述,一段式、二段式、三段式。

         状态机的描述,一段式、二段式、三段式。

一段式状态机,将整合逻辑和时序逻辑混合在协同,那样的写法对于逻辑简单的图景机来说还可以利用的,可是对于复杂的逻辑就不引进了,即便事态复杂也会容易失误,而且一个always块中信号太多也不便宜珍视和修改。

一段式状态机,将整合逻辑和时序逻辑混合在一道,这样的写法对于逻辑简单的气象机来说仍然得以动用的,不过对于复杂的逻辑就不引进了,倘若情状复杂也会容易失误,而且一个always块中信号太多也不便宜维护和改动。

 1 //状态参数声明
 2 parameter     S0    =    4'b0000,
 3             S1    =    4'b0001,
 4             s2    =    4'b0010;
 5 //FSM one segment
 6 reg     [3:0]    state;
 7 always @(posedge clk or negedge rst_n)begin
 8     if(!rst_n)
 9         state <= S0;
10     else begin
11         case(state)
12         S0:
13         S1:
14         S2:
15         .
16         .
17         .
18         default:
19         endcase 
20     end
21 end
 1 //状态参数声明
 2 parameter     S0    =    4'b0000,
 3             S1    =    4'b0001,
 4             s2    =    4'b0010;
 5 //FSM one segment
 6 reg     [3:0]    state;
 7 always @(posedge clk or negedge rst_n)begin
 8     if(!rst_n)
 9         state <= S0;
10     else begin
11         case(state)
12         S0:
13         S1:
14         S2:
15         .
16         .
17         .
18         default:
19         endcase 
20     end
21 end

两段式状态机也是一种常用的写法,它把组合逻辑和时序逻辑区分出来,第一段负责状态的转移,第二段是结合逻辑赋值,然而这种写法的症结是,组合逻辑较容易生出毛刺等常见问题,关于组合逻辑较容易爆发毛刺原因,下文会提到。

两段式状态机也是一种常用的写法,它把组合逻辑和时序逻辑区分出来,第一段负责状态的转换,第二段是整合逻辑赋值,但是这种写法的毛病是,组合逻辑较容易爆发毛刺等广泛问题,关于组合逻辑较容易生出毛刺原因,下文会提到。

 1 //状态参数声明
 2 parameter     S0    =    4'b0000,
 3             S1    =    4'b0001,
 4             s2    =    4'b0010;
 5 //FSM two segment
 6 reg     [3:0]    pre_state;
 7 reg     [3:0]    next_state;
 8 //--------------------------------------
 9 //FSM one
10 always @(posedge clk or negedge rst_n)begin
11     if(!rst_n)
12         pre_state <= S0;
13     else 
14         pre_state <= next_state;
15 end
16 
17 //FSM two
18 always    @(*)begin
19     case(pre_state)
20     S0:
21     S1:
22     S2:
23     .
24     .
25     .
26     default:;
27     endcase
28 
29 end
 1 //状态参数声明
 2 parameter     S0    =    4'b0000,
 3             S1    =    4'b0001,
 4             s2    =    4'b0010;
 5 //FSM two segment
 6 reg     [3:0]    pre_state;
 7 reg     [3:0]    next_state;
 8 //--------------------------------------
 9 //FSM one
10 always @(posedge clk or negedge rst_n)begin
11     if(!rst_n)
12         pre_state <= S0;
13     else 
14         pre_state <= next_state;
15 end
16 
17 //FSM two
18 always    @(*)begin
19     case(pre_state)
20     S0:
21     S1:
22     S2:
23     .
24     .
25     .
26     default:;
27     endcase
28 
29 end

三段式状态机就可以较好的化解一段二段的不足,我也是相比推荐的写法,第一段选用时序逻辑负责状态转移,第二段组合逻辑负责数据赋值,第三段时序逻辑负责输出,代码层次显然,容易保障,时序逻辑的出口解决了两段式写法中组成逻辑的毛刺问题。不过资源消耗会多一些,其余,三段式从输入到输出会比一段式和二段式延迟一个时钟周期。在挥洒状态机的时候,一定要先期计划好状态转移图,将享有的情事都考虑到,制止事态进入死循环,或者跳到偏离态。

三段式状态机就足以较好的缓解一段二段的阙如,我也是相比推荐的写法,第一段采纳时序逻辑负责状态转移,第二段组合逻辑负责数据赋值,第三段时序逻辑负责输出,代码层次显然,容易保障,时序逻辑的输出解决了两段式写法中组成逻辑的毛刺问题。不过资源消耗会多一些,此外,三段式从输入到输出会比一段式和二段式延迟一个时钟周期。在挥洒状态机的时候,一定要先期计划好状态转移图,将所有的动静都考虑到,防止事态进入死循环,或者跳到偏离态。

 1 //状态参数声明
 2 parameter     S0    =    4'b0000,
 3             S1    =    4'b0001,
 4             s2    =    4'b0010;
 5 //FSM three segment
 6 //--------------------------------------
 7 //FSM one
 8 always @(posedge clk or negedge rst_n)begin
 9     if(!rst_n)
10         pre_state <= S0;
11     else 
12         pre_state <= next_state;
13 end
14 
15 //FSM two
16 always    @(*)begin
17     case(pre_state)
18     S0:
19     S1:
20     S2:
21     .
22     .
23     .
24     default:;
25     endcase
26 end
27 
28 //FSM three
29 always    @(posedge clk or negedge rst_n)begin
30     if(!rst_n)
31         dout <= 'b0;
32     else begin
33         case(pre_state)
34         S0:    
35         S1:
36         S2:
37         .
38         .
39         .
40         default:;
41         endcase
42     end
43 end
 1 //状态参数声明
 2 parameter     S0    =    4'b0000,
 3             S1    =    4'b0001,
 4             s2    =    4'b0010;
 5 //FSM three segment
 6 //--------------------------------------
 7 //FSM one
 8 always @(posedge clk or negedge rst_n)begin
 9     if(!rst_n)
10         pre_state <= S0;
11     else 
12         pre_state <= next_state;
13 end
14 
15 //FSM two
16 always    @(*)begin
17     case(pre_state)
18     S0:
19     S1:
20     S2:
21     .
22     .
23     .
24     default:;
25     endcase
26 end
27 
28 //FSM three
29 always    @(posedge clk or negedge rst_n)begin
30     if(!rst_n)
31         dout <= 'b0;
32     else begin
33         case(pre_state)
34         S0:    
35         S1:
36         S2:
37         .
38         .
39         .
40         default:;
41         endcase
42     end
43 end

        
如下图,我经过一个实例来表明一下状态机的施用。下边是一个系列检测情状转移图,检测是的使1101这么些行列,我们给这一个行列的检测序列是11101
1101这一串数据。在这么些行列检测器中,大家允许使用重复位。也就是说,前一个“1101”最后一位的1足以作为后一个“1101”系列的先河位。倘若不允许再次为位,只需要将S4到S2的更换替换成S4到S1即可。

        
如下图,我通过一个实例来注解一下状态机的运用。上面是一个队列检测状况转移图,检测是的使1101这些队列,我们给这些队列的检测连串是11101
1101这一串数据。在这些队列检测器中,我们允许利用重复位。也就是说,前一个“1101”最后一位的1方可看成后一个“1101”系列的开始位。假设不同意再次为位,只需要将S4到S2的变换替换成S4到S1即可。

图片 1

图片 2

        
首先,从输出状态S0先河检测,当S0检测到1时跳到S1,否则跳回S0,S1检测到1场馆跳到S2,否则跳回S0,S2检测到0状态跳到S3,否则还停留在S2状态,因为此处我们的检测连串允许重复位,所以S1检测到的1与S2检测到的1保存,不丢弃作为一下组1101的前两位,所以只需要持续检测下一位数据即可。S3、S4的境况一次类推。这里举着个例子是为着求证状态机的场所跳转,在我们实际的统筹中这种情形也是会赶上的。

        
首先,从出口状态S0最先检测,当S0检测到1时跳到S1,否则跳回S0,S1检测到1情景跳到S2,否则跳回S0,S2检测到0状态跳到S3,否则还停留在S2状态,因为这边我们的检测系列允许重复位,所以S1检测到的1与S2检测到的1保留,不丢弃作为一下组1101的前两位,所以只需要持续检测下一位数据即可。S3、S4的情状五遍类推。这里举着个例子是为着验证状态机的场合跳转,在大家实在的规划中这种气象也是会遇到的。

        
在运用情形机来描述时序电路的时候,首先应当做的是画出情形转移图,然后依据意况跳转来叙述代码,最终便会事半功倍。这段系列检测的代码我也贴出来。当然这只是系列检测的一个用到了,我面前也说了状态机机会可以兑现全部的时序电路。假如你遇上实在糟糕解决的规划,那么这些时候,你就足以考虑一下使用状态机了。

        
在采纳情形机来描述时序电路的时候,首先应当做的是画出情状转移图,然后依照意况跳转来叙述代码,最终便会事半功倍。这段系列检测的代码我也贴出来。当然这只是连串检测的一个运用了,我面前也说了状态机机会可以实现所有的时序电路。尽管您遇到实在不佳解决的统筹,那么这些时候,你就可以考虑一下使用状态机了。

 1 module state(
 2     input                 mclk, 
 3     input                rst_n,
 4     input                din,
 5     output     reg         dout;
 6     );
 7      
 8 parameter         s0 = 3'b000,
 9                 s1 = 3'b001,
10                 s2 = 3'b010,
11                 s3 = 3'b011,
12                 s4 = 3'b100;//状态
13 //此为三段式状态机,还有一段式状态机,二段式状态机            
14 reg [2:0] present_state, next_state;
15 //用摩尔状态机设计1011序列检测器
16 //状态寄存器
17 always @(posedge mclk or negedge rst_n)
18 begin
19     if(!rst_n)
20         present_state <= s0;
21     else 
22         present_state <= next_state;
23 end
24 
25 //状态转换模块
26 always @(*)
27 begin
28     case(present_state)
29     s0: if(din==1)
30             next_state = s1;
31          else 
32             next_state = s0;
33     s1: if(din==0)
34             next_state = s2;
35         else 
36             next_state = s1;
37     s2: if(din==1)
38             next_state = s3;
39         else 
40             next_state = s0;
41     s3: if(din==1)
42             next_state = s4;
43         else 
44             next_state = s2;
45     s4: if(din==0)
46             next_state = s2;
47         else 
48             next_state = s1;
49     default: next_state = s0;
50     endcase
51 end
52 
53 always @(posedge clk or negedge rst_n)begin
54     if(!rst_n)
55         dout <= 1'b0;
56     else if(present_state ==s4)
57         dout <= 1'b1;
58     else
59         dout <= 1'b0;
60 end
61      
62
63 endmodule
 1 module state(
 2     input                 mclk, 
 3     input                rst_n,
 4     input                din,
 5     output     reg         dout;
 6     );
 7      
 8 parameter         s0 = 3'b000,
 9                 s1 = 3'b001,
10                 s2 = 3'b010,
11                 s3 = 3'b011,
12                 s4 = 3'b100;//状态
13 //此为三段式状态机,还有一段式状态机,二段式状态机            
14 reg [2:0] present_state, next_state;
15 //用摩尔状态机设计1011序列检测器
16 //状态寄存器
17 always @(posedge mclk or negedge rst_n)
18 begin
19     if(!rst_n)
20         present_state <= s0;
21     else 
22         present_state <= next_state;
23 end
24 
25 //状态转换模块
26 always @(*)
27 begin
28     case(present_state)
29     s0: if(din==1)
30             next_state = s1;
31          else 
32             next_state = s0;
33     s1: if(din==0)
34             next_state = s2;
35         else 
36             next_state = s1;
37     s2: if(din==1)
38             next_state = s3;
39         else 
40             next_state = s0;
41     s3: if(din==1)
42             next_state = s4;
43         else 
44             next_state = s2;
45     s4: if(din==0)
46             next_state = s2;
47         else 
48             next_state = s1;
49     default: next_state = s0;
50     endcase
51 end
52 
53 always @(posedge clk or negedge rst_n)begin
54     if(!rst_n)
55         dout <= 1'b0;
56     else if(present_state ==s4)
57         dout <= 1'b1;
58     else
59         dout <= 1'b0;
60 end
61      
62
63 endmodule

        
在状态机的计划性中,一段式状态机用时序逻辑,二段式状态机第一段用时序逻辑,第二段用结合逻辑,三段式状态机第一段用时序逻辑,第二段用整合逻辑,第三段用时序逻辑。我在规划的时候,尝试把第二段写成时序逻辑,最终结出并从未影响,时序逻辑随时钟变化,组合逻辑是间接赋值,所以在第三段状态机举办输出时,输出结果一定是安静的,可是如此会限制fmax。假设用时序逻辑的主频率过高的话,可能不如第二段组合逻辑赋值来的安澜,这里就还索要考虑到时序分析了,暂且不谈。这里还需要提的是运用三段式状态机相较于一段二段式,会延迟一个时钟周期输出,就是因为第三段使用了时序逻辑的因由。

        
在状态机的规划中,一段式状态机用时序逻辑,二段式状态机第一段用时序逻辑,第二段用结合逻辑,三段式状态机第一段用时序逻辑,第二段用整合逻辑,第三段用时序逻辑。我在规划的时候,尝试把第二段写成时序逻辑,最终结出并从未影响,时序逻辑随时钟变化,组合逻辑是直接赋值,所以在第三段状态机举行输出时,输出结果一定是祥和的,不过如此会限制fmax。即使用时序逻辑的主频率过高的话,可能不如第二段组合逻辑赋值来的安定团结,这里就还索要考虑到时序分析了,暂且不谈。这里还需要提的是使用三段式状态机相较于一段二段式,会延迟一个时钟周期输出,就是因为第三段使用了时序逻辑的由来。

        
既然谈状态机的时候,说到了咬合逻辑会暴发毛刺的场地,那么这里就顺便整理一下,为何组合逻辑会爆发毛刺,组合逻辑的冒险与竞争分析。

        
既然谈状态机的时候,说到了整合逻辑会爆发毛刺的光景,那么这里就顺手整理一下,为何组合逻辑会发生毛刺,组合逻辑的孤注一掷与竞争分析。

        
竞争(Competition)在组成逻辑电路中,某个输入变量通过两条或两条以上的途径传到输出端,由于每条路径延迟时间不同,到达输出门的刻钟就有先有后,这种光景称为竞争。把不会发出错误输出的竞争的现象叫做非临界竞争。把暴发暂时性的或永久性错误输出的竞争情形叫做临界竞争。

        
竞争(Competition)在组合逻辑电路中,某个输入变量通过两条或两条以上的路子传到输出端,由于每条路子延迟时间不同,到达输出门的时刻就有先有后,这种光景叫做竞争。把不会暴发错误输出的竞争的光景称为非临界竞争。把暴发暂时性的或永久性错误输出的竞争意况称为临界竞争。

铤而走险(risk)信号在器件内部通过连线和逻辑单元时,都有肯定的延时。延时的大小与连线的长短和逻辑单元的多寡有关,同时还受器件的炮制工艺、工作电压、温度等标准的熏陶。信号的轻重电平转换也急需一定的联网时间。由于存在那两下面因素,多路信号的电平值发生变化时,在信号变化的弹指间,组合逻辑的出口有先后顺序,并不是同时变化,往往会见世有的不得法的终点信号,这一个极端信号称为”毛刺”。假诺一个结合逻辑电路中有”毛刺”出现,就认证该电路存在冒险

铤而走险(risk)信号在器件内部通过连线和逻辑单元时,都有早晚的延时。延时的深浅与连线的长短和逻辑单元的多寡有关,同时还受器件的制作工艺、工作电压、温度等规范的震慑。信号的轻重电平转换也急需一定的接入时间。由于存在这两下面因素,多路信号的电平值暴发变化时,在信号变化的一刹那,组合逻辑的出口有先后顺序,并不是还要变化,往往会见世局部不得法的极端信号,这多少个极端信号称为”毛刺”。倘若一个结合逻辑电路中有”毛刺”出现,就注解该电路存在冒险

竞争冒险(Competition
risk)暴发原因:由于延迟时间的存在,当一个输入信号通过多条路径传送后又再一次聚集到某个门上,由于不同途径上门的级数不同,或者门电路延迟时间的差别,导致到达会见点的光阴有先有后,从而发出须臾间的一无是处输出。

竞争冒险(Competition
risk)爆发原因:由于延迟时间的留存,当一个输入信号通过多条途径传送后又再次集结到某个门上,由于不同途径上门的级数不同,或者门电路延迟时间的反差,导致到达相会点的日子有先有后,从而爆发刹那间的荒唐输出。

      
首先看下面这一个电路,使用了六个逻辑门,一个非门和一个与门,本来在理想图景下F的出口应该是直接平稳的0输出,可是事实上每个门电路从输入到输出是必定会有时间推迟的,这些时间一般号称电路的开关延迟。而且制作工艺、门的项目甚至创设时轻微的工艺偏差,都会挑起那多少个开关延迟时间的扭转。

      
首先看上面这多少个电路,使用了多少个逻辑门,一个非门和一个与门,本来在大好图景下F的出口应该是直接平稳的0输出,可是事实上每个门电路从输入到输出是自然会有时间推迟的,这个时刻平常号称电路的开关延迟。而且制作工艺、门的类型甚至创立时轻微的工艺偏差,都会引起这些开关延迟时间的变型。

图片 3

图片 4

图片 5

图片 6

        
实际上即便算上非门的推移的话,那么F最后就会生出毛刺。信号由于经过不同途径传输达到某一相会点的时刻有先有后的面貌,就叫做竞争,由于竞争情形所引起的电路输出爆发刹那间不当的场景,就叫做冒险,所以在统筹中我们要留心制止那些场景,最简单易行的制止情势是尽量使用时序逻辑同步输出。

        
实际上尽管算上非门的推移的话,那么F最后就会生出毛刺。信号由于经过不同途径传输达到某一会晤点的年华有先有后的处境,就称为竞争,由于竞争情形所引起的电路输出暴发刹那间不当的光景,就称为冒险,所以在统筹中我们要专注避免这个场景,最简便易行的防止方法是竭尽采纳时序逻辑同步输出。

     
这篇状态机和组合逻辑的孤注一掷竞争就聊到这里,下次我们随后说时序逻辑的铤而走险竞争。

     
这篇状态机和重组逻辑的铤而走险竞争就聊到这里,下次大家随后说时序逻辑的孤注一掷竞争。

 

 

参考资料:百度百科,冒险竞争、《FPGA设计技术与案例开发详解》、《FPGA数字逻辑设计教程——Verilog》、《深远浅出玩转FPGA》等网络作品。

参考资料:百度百科,冒险竞争、《FPGA设计技术与案例开发详解》、《FPGA数字逻辑设计教程——Verilog》、《深刻浅出玩转FPGA》等网络小说。

图片 7

图片 8

 

 

转载请注解出处:NingHeChuan(宁河川)

转载请注解出处:NingHeChuan(宁河川)

个人微信订阅号:开源FPGANingHeChuan

村办微信订阅号:开源FPGANingHeChuan

假定你想立马接受个人创作的博文推送,可以扫描左侧二维码(或者长按识别二维码)关注个人微信订阅号

万一您想立马接受个人写作的博文推送,可以扫描右侧二维码(或者长按识别二维码)关注个人微信订阅号

知乎ID:NingHeChuan

知乎ID:NingHeChuan

微博ID:NingHeChuan

微博ID:NingHeChuan

初稿地址:http://www.cnblogs.com/ninghechuan/p/7898297.html

原文地址:http://www.cnblogs.com/ninghechuan/p/7898297.html

 

 

相关文章