第一个:状态机输出信号填写问题,下面是我转载的一些能百度的到的东西。好像都比较正常。这里我还要强调的是,每个状态机的输出信号都需要全面。 =+!l8o&o,
举例: :dSda,!z
always @ (posedge clk or negedge rst_n) 这里的状态机简单的描述,其实还有很多状态。 (h3L=
...//初始化 out3在s1 s2输出都是一样的,在状态跳转从s1跳到s2的
-BSdrP|
case(next_state) 时候out3会在s1处所存,所以就算在s2的地方不写一次out3 <= 1'b0 ;情况S1: 也是是输出0.对状态机要求高的话,需要这么写。 5.9<g>C
out1 <= 1'b1; 3T2]V?
out2 <= 1'b0; 3#>W\_FY*D
out3 <= 1'b0; //看这里 X/,)KTo7
S2: RRIh;HhX
out2 <= 1'b0; R c+olJ^5
out2 <= 1'b1; gc.Lh~
out3 <= 1'b0 ; //看这里 0X=F(,>9
default:... |58HPW9
endcase UTD_rQ
end m2j&0z
第二个:程序输出结构。看程序应该能懂,不需要太多解释吧。 kFn/dQ4|
举例: R~\R>\
always @ (posedge clk or negedge rst_n) dHc\M|HCC
case (next_state) l P F326e
S1: Y[{:?i~9,
out1 <= 1'b1; //看这里 所有的不受if控制的输出都要写到if的外面。 4)S99|1
out2 <= 1'b0; J}#gTG( '
if (x) `q?3ux
out3 <= 1'b0; vMT f^V
else Q^(CqQo!<
out3 <=1'b1; hNN>Pd~;
S2: _U s"
out2 <= 1'b0; //看这里 1q6)R/P
out2 <= 1'b1; \P<aK$g
if (y) M/N8bIC! Q
out3 <= 1'b0; %{u@{uG0'3
else |P
>"a`
out3 <=1'b1; 8q^}AT<C
Tagf7tw4
default:... mTZ/C#ir(
endcase y )QLR<wf
end 2"IV
第三个。三段式(多段式)。简单描述就是将第三段的输出,在分为多段。 d_9 Cm@
举例:(我不知道我这么写例子是否恰当,只能表达一个意思吧) OoB|Eh|),
always @ (posedge clk or negedge rst_n) ,lZ19B?WP
case (next_state) %7#<K\])
S1: ? i{?Q,
out1 <= 1'b1; A@A8xn%
out2 <= 1'b0; 6S`_L
S2: 5X{|*?>T
out2 <= 1'b0; KF%BX~80C
out2 <= 1'b1; ?;XO1cs
default:... z?byNd8
endcase H$`U]
=s|
end 7HPwlS
------------------------------------------------------------------- #(^<qr
always @ (posedge clk or negedge rst_n) v;,W ^#`
case (next_state) 'O<b'}-A
S1: b}!
cEJY
if (x) f_c\uN@f
out3 <= 1'b0; *!QmYH5r0
else hek+zloB+
out3 <=1'b1; \BHZRytQF
S2: v "l).G?
if (y) MJ}{Q1|*
out3 <= 1'b0; W@R7CQE@
else KL$.E!d
out3 <=1'b1; ;[y( 14g
fG\"p
default:... Gu$/rb?
endcase [ja^Bhu
end Xu-~j!
第四个。状态机的拆分,讲连续变化的状态机,从大的状态机里面拿出来。我只能这么说,没办法举例子了。这里涉及的编程思想也比较多了,没法描述但是要有这个思想。 P^te
第五个。独热码好像有时候也不够稳定。你可以使用fifo来做状态缓存。当然这里只是理论概念,因为我还没写过,三段式,独热码,程序拆分后,还是不稳定的程序。但是如果以上内容你都做了,速度和稳定性还不够,你可以考虑的。主要的想法是这样的,fifo在多时钟域都可以良好的切换,就说明它的亚稳态现象很低,为什么状态机不稳定,就是对状态采样的时候,出现的问题。所以,它应该能做到更好的效果。 =M1}HF,7>l