依据FPGA的点滴状态机浅析。基于FPGA的鲜状态机浅析。

  前言:状态机大法好,状态机betway必威体育官网几乎可以兑现普时序逻辑电路。

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

简单状态机(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),格雷码编码(Gray-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即可。

betway必威体育官网 1

betway必威体育官网 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输出,但是实际上每个门电路从输入到输出是早晚会发日推移的,这个时一般号称电路的开关延迟。而且做工艺、门的种还打时轻的工艺偏差,都见面招这个开关延迟时间的浮动。

betway必威体育官网 3

betway必威体育官网 4

betway必威体育官网 5

betway必威体育官网 6

        
实际上只要算上非门的推的说话,那么F最后就会见时有发生毛刺。信号由于经过不同途径传输上某一样汇聚合点的年华有先有后的现象,就称为竞争,由于竞争状况所引起的电路输出发生瞬间错的情景,就叫冒险,所以当筹划中我们设留心避免这个场面,最简易的避免方法是硬着头皮采取时序逻辑同步输出。

        
实际上要算上非门的缓的说话,那么F最后便见面生毛刺。信号由于经过不同途径传输上某一样集结合点的流年有先有后的面貌,就称竞争,由于竞争状况所引的电路输出发生瞬间不当的景,就叫冒险,所以在规划中我们若留意避免这状况,最简易的避免方法是尽可能利用时序逻辑同步输出。

     
这篇状态机和烧结逻辑的冒险竞争就是聊至此,下次咱们跟着说经常先后逻辑的铤而走险竞争。

     
这首状态机和组成逻辑的铤而走险竞争就是聊到此,下次咱们跟着说时先后逻辑的铤而走险竞争。

 

 

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

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

betway必威体育官网 7

betway必威体育官网 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

 

 

相关文章