|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 ?( x6 @* z/ A1 ?$ q; r) ^: n1 r% b( Y
状态机是一种十分重要的时序电路,常用于描述数字系统的控制单元,在数字系统有着广泛的应用,如步进电机、数据存储器的读写、总线控制器等。本文结合具体课题;采用ALTERA的CPLD器件EPM7032实现了一种容错的状态机;采用VHDL语言编程,实际使用效果良好,不仅调试方便,而且增加了系统配置的灵活性,大大缩短了系统开发周期。 * P6 u3 _/ S# [6 S) m
1 状态机的真值表及状态转移$ n, d5 ~7 A* |( D/ U `; W
&nBSP; 该状态机是一种Moore型的,其真值表如表1。
5 t! y* D- p, S; W: B; }* R+ d" }1 }" t
该状态机编码方式采用顺序方式,共采用4位编码。这样就存在两个非法的状态(即在状态机中,未定义的状态);采用该编码方式与一位有效编码方式相比,大大减少了非法状态的存在。
9 e$ } I) L. P5 ?, D! k 状态转移图如图1所示。
# O- b, y1 h; d+ T% E/ J' G9 K
s6 C4 H L# X
- G" V+ B2 r7 d7 n6 J/ @+ ^2 VHDL的描述
6 S% H9 S) y/ W2 F% F$ S 采用VHDL语言描述时、主要应包括:状态变量、时钟、状态转移指定、输出指定、复位信号等几个方面。4 L8 F1 ~+ l. \3 m9 v7 Q
(1)状态机的状态变量定义如下:) L- W6 S) L3 b2 p/ Z n
TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4 ,out1,out2,out3,out4,out5,out6,out7,out8);
1 E. O$ J! o6 Z s+ [ ]signal present_state,next_state:statetype;
3 l- X' Z! n. v. esignal codin:std_logic_vector(3 downto 0);7 B0 u1 A$ ~1 L
(2)状态机的部分状态转移指定:
; p K. M7 ]" P/ U: Gstatedesc: process (reset, data, present_state, burst,ou_rec,ready)% o v& u) _& ~# k
begin
3 y0 |3 \) s9 H3 W- b5 N.........................
) o- e5 A( c) l W+ B, { Case present_state is
8 E6 q8 m1 L% a( k. q4 {When idle=>codin<="0000";
: K# ~' k, M7 `8 Q! B( H- }5 qIf(data="11111111")then next_state<=deci;
- H2 q5 X8 }( `Else4 H5 h7 H& S5 J* o# T5 E0 d
Next_state<=idle;& u4 B# H- X/ Q& T( d6 j
end if;
. f% |( b% | H& `% J..............7 ^8 R; r/ I, E' S9 S- v$ T" a' x3 N
When out1=>codin<="0110";1 d$ d8 R' V/ C( ]# B3 Z A' Y
If(ready=' 0' )then
2 E! i1 d6 ^- C$ h* v* ^1 ?2 lNext_state<=out1;! \7 y* f; {6 {& j* S" W4 [
Elsif (burst=' 0' )then next_state<=idle;, V9 K- n7 {+ B
Else next_state<=out2; " |$ v8 E/ L: q. z* n
end if;
1 \8 N7 r, `0 l! \- J: m% O...............
- E1 m" Y$ A4 i$ C, { s) S/ `; @0 Q(3)状态机的输出指定
8 K1 l' N$ A5 h/ p9 a3 g 状态机的输出需要对codin进行译码才能输出,输出指定放在另一个进程(在该进程中同时还实现次态到现态的转化)中, VHDL的描述为:+ H% N+ [( X3 H/ ?" J; a7 u4 T4 |' y
state-change:process(clk)
& k6 v+ m5 D. o) p" ubegin
( _/ ~- T. s9 M+ T0 u. lcase codin is- y: c, C. B* \2 o% J
when "0000"=> get<=' 0' ;we<=' 0' ;addr<="000"; 4 Z% Q3 N% N1 e& r8 C& g& E% n" w T
...............................................% [" R1 L+ l4 A$ M" w$ _% o+ y) X
when"1101"=>get<=' 1' ;we<=' 0' ;addr< ="111";3 q+ V2 p( O# D- m1 S
when others= >get< = ' 0' ;we< = ' 0' ;addr< ="000";
6 ?9 z, o8 u0 ^5 V" H- pend case;
2 ?3 J2 |) q) f3 K/ Qend process state-change;
! I! z4 D% F1 F( ^) @: Y
- K' m+ J7 k* f8 `% H }! i3 纠错功能的实现! e* O! Y C$ o2 l! s4 o
在实际的工作当中,由于硬件电路中,干扰、钟摆、噪声、电源的变化等都可能使触发器翻转,从而使状态机误入非法状态。一旦出现这种情况将无法预见系统的反应,可能会出现状态锁死、系统非法输出;信号冲突,过大的拉电流和灌电流,毁坏系统。
3 [" |+ B( d; h- q/ U 在进行容错设计时,首先在枚举类型的状态定义中定义所有的非法状态。因此状态定义改为:
/ Z3 \* A; Y) a; j) u7 eTYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4, out1,out2,out3, out4,out5,out6,out7,out8,undefine1,undefine2);
7 N E8 u2 A5 d" q$ O7 \9 a* F/ G7 }# P 最后,需要定义转移出非法状态的代码。程序片段如下:9 x% B9 c& h3 ?0 v; Q
..................% p0 N+ |& _% H
case present_state is
- F& \2 ?7 T/ s R, [.................
- m* I; _, B: O& N# twhen others =>next_state <=idle,err<=' 1' ;& |: N2 L, P9 N x
end case;( Q0 Q; u; R' a W B# w: \6 l
另外在进程的设计时,还需要充分注意信号的同步问题,这样才能避免竞争冒险的问题。进行容错设计,虽然牺牲了资源,但却可获得了高可靠的系统。& H2 ^+ j) i, _. N, ]7 {
0 r+ |+ \# {; G5 N4 结束语+ o% \& @1 J/ n4 F' t! E
实践证明使用可编程逻辑器件可以非常方便地实现状态机。而采用VHDL语言设计,不仅描述方便,而且具有良好的可移植性,可以非常方便地应用于其它公司的CPLD,FPGA芯片中。实际使用中该芯片运行良好,同时可以随时对芯片内部逻辑进行在线更改,体现了可编程逻辑器件的优越性。
/ G4 `) }1 h4 N6 h: t. R# W7 l- v/ G0 I* k7 ~1 N
|
|