第一个:状态机输出信号填写问题,下面是我转载的一些能百度的到的东西。好像都比较正常。这里我还要强调的是,每个状态机的输出信号都需要全面。 ,_;+H*H>"
举例: "D0:Y(\
always @ (posedge clk or negedge rst_n) 这里的状态机简单的描述,其实还有很多状态。 3Z=OUhn9
...//初始化 out3在s1 s2输出都是一样的,在状态跳转从s1跳到s2的 vFz%#zk>
case(next_state) 时候out3会在s1处所存,所以就算在s2的地方不写一次out3 <= 1'b0 ;情况S1: 也是是输出0.对状态机要求高的话,需要这么写。 '{=dEEi
out1 <= 1'b1; jY>|>]4X
out2 <= 1'b0; 0!X;C!v;
out3 <= 1'b0; //看这里 pwo5Ij,~q
S2: zy\p,
out2 <= 1'b0; ;d$PQi
out2 <= 1'b1; 9l).L L
out3 <= 1'b0 ; //看这里 *#+e_)d
default:... \pI)tnu6'U
endcase > w:+nG/r
end k[lYdk
第二个:程序输出结构。看程序应该能懂,不需要太多解释吧。 %\6ns
举例: y,&.<Yc
always @ (posedge clk or negedge rst_n) qjcy{@ j
case (next_state) ]-h$CJSY
S1: }YUUCq&
out1 <= 1'b1; //看这里 所有的不受if控制的输出都要写到if的外面。 Zwy8SD'L
out2 <= 1'b0; [P,YW|:n
if (x) Hik8u!#P
out3 <= 1'b0; n+Ofbiz@
else l{oAqTN
out3 <=1'b1; /3|uU
S2: sVP[7&vr~
out2 <= 1'b0; //看这里 3=o^Vv
out2 <= 1'b1; i!8 o(!I
if (y) 7tWt3
out3 <= 1'b0; Fx#0
:p
else 0l-m:6
out3 <=1'b1; V_Z ~$
oFt]q
=EU
default:... ]jo^P5\h>
endcase Y4*ezt:;Q
end 9_Tk8L#
第三个。三段式(多段式)。简单描述就是将第三段的输出,在分为多段。 VsS.\1
举例:(我不知道我这么写例子是否恰当,只能表达一个意思吧) bz!9\D|h
always @ (posedge clk or negedge rst_n) Co6ghH7T
case (next_state) Mf0!-bu
S1: XVXiiQ^
out1 <= 1'b1; {SH+lX0]{
out2 <= 1'b0; Abr:UEG
S2: ,arFR'u>
out2 <= 1'b0; p x;X}Cd
out2 <= 1'b1; :%GxU;<E{
default:... yQ\K;
endcase WBTdQG
Q6
end z9mmZqhK\
------------------------------------------------------------------- Bi?.w5
always @ (posedge clk or negedge rst_n) ~d oOt
case (next_state) `P;fD/I
S1: $ijWwrh
if (x) !>XG$-$`Z
out3 <= 1'b0; I#(D.\P
else EoLF7j<W
out3 <=1'b1; I}oxwc
S2: ;u;Y fOr
if (y) |a@$KF$
out3 <= 1'b0; s=`1wkh0
else gE8=#%1<
out3 <=1'b1; > o{(f
12)~PIaF
default:... b~\gV_Z
endcase dtJaQ`
end w-Zb($_
第四个。状态机的拆分,讲连续变化的状态机,从大的状态机里面拿出来。我只能这么说,没办法举例子了。这里涉及的编程思想也比较多了,没法描述但是要有这个思想。 B.2F\ub g
第五个。独热码好像有时候也不够稳定。你可以使用fifo来做状态缓存。当然这里只是理论概念,因为我还没写过,三段式,独热码,程序拆分后,还是不稳定的程序。但是如果以上内容你都做了,速度和稳定性还不够,你可以考虑的。主要的想法是这样的,fifo在多时钟域都可以良好的切换,就说明它的亚稳态现象很低,为什么状态机不稳定,就是对状态采样的时候,出现的问题。所以,它应该能做到更好的效果。 r1:S8RT;H5