|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 d. e7 t7 m6 g1 P/ v* V
, q/ L9 Y1 c* D" S状态机是一种十分重要的时序电路,常用于描述数字系统的控制单元,在数字系统有着广泛的应用,如步进电机、数据存储器的读写、总线控制器等。本文结合具体课题;采用ALTERA的CPLD器件EPM7032实现了一种容错的状态机;采用VHDL语言编程,实际使用效果良好,不仅调试方便,而且增加了系统配置的灵活性,大大缩短了系统开发周期。 + A* Q0 b0 T4 e# n: H+ L, F$ q$ B
1 状态机的真值表及状态转移
) c. R: Q* n5 J&nBSP; 该状态机是一种Moore型的,其真值表如表1。
- ]1 u6 U3 n" V0 m$ Y6 ?4 N! L1 ?: W/ R1 {* K4 {
该状态机编码方式采用顺序方式,共采用4位编码。这样就存在两个非法的状态(即在状态机中,未定义的状态);采用该编码方式与一位有效编码方式相比,大大减少了非法状态的存在。6 c' o7 x" d. \' M( N% b. a
状态转移图如图1所示。% T* W. l1 K$ F# f' ^
* R8 U1 ]) b5 v$ x. y$ ^, c' K
4 ?/ Y. ], S2 }5 c2 `, M
2 VHDL的描述
) d; A" I% D' u! p* |* g4 e2 c( | 采用VHDL语言描述时、主要应包括:状态变量、时钟、状态转移指定、输出指定、复位信号等几个方面。
* ^" a- p6 e8 t5 q: v8 |8 o$ f' |$ ?(1)状态机的状态变量定义如下:, H0 Z8 l! J# r& D7 {8 H2 V- L
TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4 ,out1,out2,out3,out4,out5,out6,out7,out8);5 L1 e: Y+ h. m$ S9 p& y) a1 Z6 y. h% q
signal present_state,next_state:statetype;
0 \ ?1 C8 x- \7 b# _3 Nsignal codin:std_logic_vector(3 downto 0);
2 v6 T' M3 }. C, E" L2 f(2)状态机的部分状态转移指定:! T6 z% V8 A/ |3 l1 d
statedesc: process (reset, data, present_state, burst,ou_rec,ready)
: d0 Z4 |& I I: J; qbegin
% ^+ t6 a1 V5 Z( E+ ]6 {# \- M.........................+ S' P9 z9 f8 b/ {
Case present_state is
4 ?) s0 I( D9 C+ }* b0 JWhen idle=>codin<="0000";6 V- @4 y" a3 s0 M5 L( t# ^
If(data="11111111")then next_state<=deci;1 `' g+ }/ p0 C/ a
Else5 |. a8 g5 K5 X3 f& y
Next_state<=idle;+ K/ S& A+ j5 m+ B9 O/ [, e- \# q
end if;5 m+ s, J" v; N+ b' T
..............
0 \$ s( r" {1 w7 b0 HWhen out1=>codin<="0110";3 O0 q' {: N4 w9 C6 l2 |, Y
If(ready=' 0' )then4 Q+ n( V1 ?, |. @
Next_state<=out1;0 Z* d- n: a' u/ |: H
Elsif (burst=' 0' )then next_state<=idle;
7 u# @0 m& V$ f# d) d( }Else next_state<=out2; $ t5 E3 j1 W z4 ~4 B$ l8 t
end if;' |9 \ F5 `% `. X
...............8 K& Q* B! E; b6 ?, M9 H( h: N5 Q
(3)状态机的输出指定
; X& v% K9 I8 O( A1 Z k- B 状态机的输出需要对codin进行译码才能输出,输出指定放在另一个进程(在该进程中同时还实现次态到现态的转化)中, VHDL的描述为:
$ Q. i1 s$ W& F6 fstate-change:process(clk)
" R: t* ?& J5 wbegin; [1 D$ v4 f( Y! S/ @- Q8 o
case codin is3 ]2 h; V! Z5 j( ~, c% Q5 H( `) ]; @& l
when "0000"=> get<=' 0' ;we<=' 0' ;addr<="000";
3 o4 w7 _; H- E! b" P( S...............................................: C) B$ A# ~' J3 X4 o
when"1101"=>get<=' 1' ;we<=' 0' ;addr< ="111";
; r- e' S& d( M( ?* fwhen others= >get< = ' 0' ;we< = ' 0' ;addr< ="000";
# V# s4 S8 ^ m* M) Tend case;, }( h' V/ V, z% _
end process state-change;
( u2 y- [2 X" @
, ?5 |7 e$ }) x+ {
3 纠错功能的实现
% k$ t, V+ \ J9 S 在实际的工作当中,由于硬件电路中,干扰、钟摆、噪声、电源的变化等都可能使触发器翻转,从而使状态机误入非法状态。一旦出现这种情况将无法预见系统的反应,可能会出现状态锁死、系统非法输出;信号冲突,过大的拉电流和灌电流,毁坏系统。3 I* w! ~* n4 T1 ~7 M9 Y/ [
在进行容错设计时,首先在枚举类型的状态定义中定义所有的非法状态。因此状态定义改为:
/ B. q- O. u, p) d$ c, o) {TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4, out1,out2,out3, out4,out5,out6,out7,out8,undefine1,undefine2);4 D1 }2 u5 O, }
最后,需要定义转移出非法状态的代码。程序片段如下:" k$ a, f6 i9 h& L( ]9 @
..................# @& A+ w z0 \: G% Q# _6 @
case present_state is8 v. j" b5 X: t1 j/ f# [3 q
.................+ e: `! V5 B0 e
when others =>next_state <=idle,err<=' 1' ;
1 B7 p6 \# J, \7 B! I& I* Kend case;
9 V$ R u1 a0 m) t 另外在进程的设计时,还需要充分注意信号的同步问题,这样才能避免竞争冒险的问题。进行容错设计,虽然牺牲了资源,但却可获得了高可靠的系统。6 r. d$ n: D$ l$ I6 ?
0 R$ U( P$ i- k9 P" I$ s) S8 V
4 结束语7 V) |2 z2 @) n" p5 ^
实践证明使用可编程逻辑器件可以非常方便地实现状态机。而采用VHDL语言设计,不仅描述方便,而且具有良好的可移植性,可以非常方便地应用于其它公司的CPLD,FPGA芯片中。实际使用中该芯片运行良好,同时可以随时对芯片内部逻辑进行在线更改,体现了可编程逻辑器件的优越性。% C1 C+ T6 @: j! \% \
! p. }9 z9 [( H/ P
|
|