您的位置 首页 嵌入式

状态机和组合逻辑的冒险竞赛浅析

状态机和组合逻辑的冒险竞争浅析-有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机。Moore型状态机输出仅仅与现态有关和Mealy型状态机不仅与现态有关,也与输入有关,所以会受到输入的干扰,可能会产生毛刺(Glith)的现象,所以我们通常使用的是Moore型状态机。

作者:NingHeChuan(宁河川)

前语:状况机大法好,状况机简直能够完成全部时序逻辑电路。

有限状况机(Finite State Machine, FSM),依据状况机的输出是否与输入有关,可分为Moore型状况机和Mealy型状况机。Moore型状况机输出仅仅与现态有关和Mealy型状况机不只与现态有关,也与输入有关,所以会遭到输入的搅扰,或许会产生毛刺(Glith)的现象,所以咱们一般运用的是Moore型状况机。

状况机的编码,二进制编码(Binary),格雷码编码(Gray-code),独热码(One-hot)。不同的编码办法是防止在状况搬运中产生骤变,使得状况搬运更为安稳,体系愈加牢靠,可是一般状况下咱们直接选用的是二进制进行编码,除非体系对安稳性和状况编码有特殊要求。

状况机的描绘,一段式、二段式、三段式。

一段式状况机,将组合逻辑和时序逻辑混合在一起,这样的写法关于逻辑简略的状况机来说仍是能够运用的,可是关于杂乱的逻辑就不引荐了,假如状况杂乱也会简略犯错,并且一个always块中信号太多也不利于保护和修正。

状况机和组合逻辑的冒险竞赛浅析

//状况参数声明

parameter S0 = 4‘b0000,

S1 = 4’b0001,

s2 = 4‘b0010;

//FSM one segment

reg [3:0] state;

always @(posedge clk or negedge rst_n)begin

if(!rst_n)

state 《= S0;

else begin

case(state)

S0:

S1:

S2:

default:

endcase

end

end

两段式状况机也是一种常用的写法,它把组合逻辑和时序逻辑区别出来,榜首段担任状况的搬运,第二段是组合逻辑赋值,可是这种写法的缺陷是,组合逻辑较简略产生毛刺等常见问题,关于组合逻辑较简略产生毛刺原因,下文会说到。

//状况参数声明

parameter S0 = 4’b0000,

S1 = 4‘b0001,

s2 = 4’b0010;

//FSM two segment

reg [3:0] pre_state;

reg [3:0] next_state;

//————————————–

//FSM one

always @(posedge clk or negedge rst_n)begin

if(!rst_n)

pre_state 《= S0;

else

pre_state 《= next_state;

end

//FSM two

always @(*)begin

case(pre_state)

S0:

S1:

S2:

default:;

endcase

end

三段式状况机就能够较好的处理一段二段的缺乏,我也是比较引荐的写法,榜首段选用时序逻辑担任状况搬运,第二段组合逻辑担任数据赋值,第三段时序逻辑担任输出,代码层次明晰,简略保护,时序逻辑的输出处理了两段式写法中组合逻辑的毛刺问题。可是资源耗费会多一些,此外,三段式从输入到输出会比一段式和二段式推迟一个时钟周期。在书写状况机的时分,必定要事前规划好状况搬运图,将一切的状况都考虑到,防止状况进入死循环,或许跳到违背态。

//状况参数声明

parameter S0 = 4‘b0000,

S1 = 4’b0001,

s2 = 4‘b0010;

//FSM three segment

//————————————–

//FSM one

always @(posedge clk or negedge rst_n)begin

if(!rst_n)

pre_state 《= S0;

else

pre_state 《= next_state;

end

//FSM two

always @(*)begin

case(pre_state)

S0:

S1:

S2:

default:;

endcase

end

//FSM three

always @(posedge clk or negedge rst_n)begin

if(!rst_n)

dout 《= ’b0;

else begin

case(pre_state)

S0:

S1:

S2:

default:;

endcase

end

end

如下图,我通过一个实例来阐明一下状况机的运用。下面是一个序列检测状况搬运图,检测是的使1101这个序列,咱们给这个序列的检测序列是11101 1101这一串数据。在这个序列检测器中,咱们答应运用重复位。也便是说,前一个“1101”终究一位的1能够作为后一个“1101”序列的开端位。假如不答应重复为位,只需求将S4到S2的搬运替换成S4到S1即可。

状况机和组合逻辑的冒险竞赛浅析

首要,从输出状况S0开端检测,当S0检测到1时跳到S1,不然跳回S0,S1检测到1状况跳到S2,不然跳回S0,S2检测到0状况跳到S3,不然还停留在S2状况,因为这儿咱们的检测序列答应重复位,所以S1检测到的1与S2检测到的1保存,不放弃作为一下组1101的前两位,所以只需求继续检测下一位数据即可。S3、S4的状况一次类推。这儿举着个比如是为了阐明状况机的状况跳转,在咱们实践的规划中这种状况也是会遇到的。

在运用状况机来描绘时序电路的时分,首要应该做的是画出状况搬运图,然后依据状况跳转来描绘代码,终究便会事半功倍。这段序列检测的代码我也贴出来。当然这仅仅序列检测的一个应用了,我前面也说了状况机时机能够完成全部的时序电路。假如你遇到真实欠好处理的规划,那么这个时分,你就能够考虑一下运用状况机了。

module state(

input mclk,

input rst_n,

input din,

output reg dout;

);

parameter s0 = 3‘b000,

s1 = 3’b001,

s2 = 3‘b010,

s3 = 3’b011,

s4 = 3‘b100;//状况

//此为三段式状况机,还有一段式状况机,二段式状况机

reg [2:0] present_state, next_state;

//用摩尔状况机规划1011序列检测器

//状况寄存器

always @(posedge mclk or negedge rst_n)

begin

if(!rst_n)

present_state 《= s0;

else

present_state 《= next_state;

end

//状况转化模块

always @(*)

begin

case(present_state)

s0: if(din==1)

next_state = s1;

else

next_state = s0;

s1: if(din==0)

next_state = s2;

else

next_state = s1;

s2: if(din==1)

next_state = s3;

else

next_state = s0;

s3: if(din==1)

next_state = s4;

else

next_state = s2;

s4: if(din==0)

next_state = s2;

else

next_state = s1;

default: next_state = s0;

endcase

end

always @(posedge clk or negedge rst_n)begin

if(!rst_n)

dout 《= 1’b0;

else if(present_state ==s4)

dout 《= 1‘b1;

else

dout 《= 1’b0;

end

63 endmodule

在状况机的规划中,一段式状况机用时序逻辑,二段式状况机榜首段用时序逻辑,第二段用组合逻辑,三段式状况机榜首段用时序逻辑,第二段用组合逻辑,第三段用时序逻辑。我在规划的时分,测验把第二段写成时序逻辑,终究成果并没有影响,时序逻辑随时钟改变,组合逻辑是直接赋值,所以在第三段状况机进行输出时,输出成果肯定是安稳的,可是这样会约束fmax。假如用时序逻辑的主频率过高的话,或许不如第二段组合逻辑赋值来的安稳,这儿就还需求考虑到时序剖析了,暂时不谈。这儿还需求提的是运用三段式状况机相较于一段二段式,会推迟一个时钟周期输出,便是因为第三段运用了时序逻辑的原因。

已然谈状况机的时分,说到了组合逻辑会产生毛刺的现象,那么这儿就趁便收拾一下,为什么组合逻辑会产生毛刺,组合逻辑的冒险与竞赛剖析。

竞赛(CompeTITIon)在组合逻辑电路中,某个输入变量通过两条或两条以上的途径传到输出端,因为每条途径推迟时刻不同,抵达输出门的时刻就有先有后,这种现象称为竞赛。把不会产生过错输出的竞赛的现象称为非临界竞赛。把产生暂时性的或永久性过错输出的竞赛现象称为临界竞赛。

冒险(risk)信号在器材内部通过连线和逻辑单元时,都有必定的延时。延时的巨细与连线的长短和逻辑单元的数目有关,一起还受器材的制作工艺、作业电压、温度等条件的影响。信号的凹凸电平转化也需求必定的过渡时刻。因为存在这两方面要素,多路信号的电平值产生改变时,在信号改变的瞬间,组合逻辑的输出有先后顺序,并不是一起改变,往往会呈现一些不正确的尖峰信号,这些尖峰信号称为“毛刺”。假如一个组合逻辑电路中有“毛刺”呈现,就阐明该电路存在冒险

竞赛冒险(CompeTITIon risk)产生原因:因为推迟时刻的存在,当一个输入信号通过多条途径传送后又从头会合到某个门上,因为不同途径上门的级数不同,或许门电路推迟时刻的差异,导致抵达会合点的时刻有先有后,然后产生瞬间的过错输出。

首要看下面这个电路,运用了两个逻辑门,一个非门和一个与门,本来在抱负状况下F的输出应该是一向安稳的0输出,可是实践上每个门电路从输入到输出是必定会有时刻推迟的,这个时刻一般叫做电路的开关推迟。并且制作工艺、门的品种乃至制作时细小的工艺误差,都会引起这个开关推迟时刻的改变。

状况机和组合逻辑的冒险竞赛浅析

状况机和组合逻辑的冒险竞赛浅析

实践上假如算上非门的推迟的话,那么F终究就会产生毛刺。信号因为经由不同途径传输到达某一集合点的时刻有先有后的现象,就称之为竞赛,因为竞赛现象所引起的电路输出产生瞬间过错的现象,就称之为冒险,所以在规划中咱们要注意防止这个现象,最简略的防止办法是尽量运用时序逻辑同步输出。

这篇状况机和组合逻辑的冒险竞赛就聊到这儿,下次咱们接着说时序逻辑的冒险竞赛。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/337138.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部