作者: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终究就会产生毛刺。信号因为经由不同途径传输到达某一集合点的时刻有先有后的现象,就称之为竞赛,因为竞赛现象所引起的电路输出产生瞬间过错的现象,就称之为冒险,所以在规划中咱们要注意防止这个现象,最简略的防止办法是尽量运用时序逻辑同步输出。
这篇状况机和组合逻辑的冒险竞赛就聊到这儿,下次咱们接着说时序逻辑的冒险竞赛。