|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 h6 j# D# r; T2 |$ N, X; S t0 a- ^
. p) H- P) |; P$ L
状态机是一种十分重要的时序电路,常用于描述数字系统的控制单元,在数字系统有着广泛的应用,如步进电机、数据存储器的读写、总线控制器等。本文结合具体课题;采用ALTERA的CPLD器件EPM7032实现了一种容错的状态机;采用VHDL语言编程,实际使用效果良好,不仅调试方便,而且增加了系统配置的灵活性,大大缩短了系统开发周期。 $ t( T6 K. G! T2 ]
1 状态机的真值表及状态转移
& h, M/ h8 Z( K&nBSP; 该状态机是一种Moore型的,其真值表如表1。
! N4 D3 }5 p% i8 C. B9 p z$ y) L3 P
该状态机编码方式采用顺序方式,共采用4位编码。这样就存在两个非法的状态(即在状态机中,未定义的状态);采用该编码方式与一位有效编码方式相比,大大减少了非法状态的存在。8 Q9 `$ @2 y# n& J1 c# n
状态转移图如图1所示。$ o( E8 m$ w" Y0 W- n$ I" N
& q: U3 t1 h* a& N
7 a; _+ {: Y$ ?# P
2 VHDL的描述
7 E# j6 n% u! ~6 k+ W& y1 i8 W 采用VHDL语言描述时、主要应包括:状态变量、时钟、状态转移指定、输出指定、复位信号等几个方面。
. h# g+ `* h2 \ A; \1 K(1)状态机的状态变量定义如下:
) Y+ i, q, @) fTYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4 ,out1,out2,out3,out4,out5,out6,out7,out8);
0 z0 l& L. y, h8 Ysignal present_state,next_state:statetype;+ L, d+ ]/ g0 F$ _0 v/ l w( \
signal codin:std_logic_vector(3 downto 0);/ `1 ?2 j1 M& i K
(2)状态机的部分状态转移指定:
' _% g( X5 a. v* ?3 S4 [statedesc: process (reset, data, present_state, burst,ou_rec,ready)
+ _6 d" w+ r i) J& abegin
( ~& q( B$ s- D3 z4 D `! {# l y.........................: G8 i( B8 m! J4 n. Z1 y; z
Case present_state is
; `% I$ t: r4 O ^$ ~ RWhen idle=>codin<="0000";. |1 M6 C0 ^+ b& d7 a6 F6 O, J2 V
If(data="11111111")then next_state<=deci;
+ l f, A* D1 k8 n5 S: M4 o6 K$ ]: Z' CElse
0 `& z5 o9 O3 h* ~9 L$ F4 i: t9 ?Next_state<=idle;
0 m! N: i9 ?: Vend if;1 G. t8 I l/ i. u! G2 b6 l
..............: F; R+ Q9 X7 S; z4 ^* E) I# a
When out1=>codin<="0110";3 B) ^. \. O' t. g; t2 y% T! r' l
If(ready=' 0' )then& f1 k. @% o6 h ^3 c: j
Next_state<=out1;* g1 C1 }. N2 G# K/ h3 E1 t$ I w
Elsif (burst=' 0' )then next_state<=idle;
O- d% m1 O# r5 o( A, z" A3 xElse next_state<=out2; - j9 ~3 d6 {) K% { I
end if;8 V: W/ k) W, v4 K# B/ O4 T# `; [
...............# o1 e/ r! D2 t/ x; w
(3)状态机的输出指定0 c' R+ _' q# f. m B! e2 a E5 J
状态机的输出需要对codin进行译码才能输出,输出指定放在另一个进程(在该进程中同时还实现次态到现态的转化)中, VHDL的描述为:
; Y, V) q* _* g. L' x9 _$ hstate-change:process(clk)
: B0 i3 K& F# x) o/ B( Z. x% Xbegin) F; U) d. T" |; s% T
case codin is
& X# L ?8 v( E- `. c- [1 X5 j when "0000"=> get<=' 0' ;we<=' 0' ;addr<="000";
. R3 ] Z) s& Z% Q..............................................." t9 r w* Q! v! M9 y
when"1101"=>get<=' 1' ;we<=' 0' ;addr< ="111"; d0 V! i I/ S, r
when others= >get< = ' 0' ;we< = ' 0' ;addr< ="000";2 q3 g+ b- y( T8 d& Z5 a! w
end case;
3 x! @2 n0 D4 t. lend process state-change;
4 J( \% n) R+ H
% n& W8 i4 ~8 e3 L0 i- v
3 纠错功能的实现
/ C3 w: E. c ~( { 在实际的工作当中,由于硬件电路中,干扰、钟摆、噪声、电源的变化等都可能使触发器翻转,从而使状态机误入非法状态。一旦出现这种情况将无法预见系统的反应,可能会出现状态锁死、系统非法输出;信号冲突,过大的拉电流和灌电流,毁坏系统。$ L- u+ e/ t4 g* t) E2 f3 b0 @
在进行容错设计时,首先在枚举类型的状态定义中定义所有的非法状态。因此状态定义改为:# {- Z ~8 v# o; J7 y/ r6 s
TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4, out1,out2,out3, out4,out5,out6,out7,out8,undefine1,undefine2);
/ T9 t$ i d4 e 最后,需要定义转移出非法状态的代码。程序片段如下:) w) |! e, V; p9 q% t% }8 P8 ^
..................' B% k" R: r) o3 m. _, P$ y" g! X
case present_state is
b0 G4 x% x" O* M.................
; P# {( D) H/ a9 ?) z7 Twhen others =>next_state <=idle,err<=' 1' ;" S$ P/ k% d7 x; C7 m
end case;
& N( c5 m2 d! \- ~( ^ 另外在进程的设计时,还需要充分注意信号的同步问题,这样才能避免竞争冒险的问题。进行容错设计,虽然牺牲了资源,但却可获得了高可靠的系统。7 K. L4 C; r: k `& R ^6 ]7 |/ D$ t! G
: [1 y$ a3 i9 G0 |! {8 U- r# b& l- o
4 结束语8 ? Q+ ]" ^! ?$ y) f
实践证明使用可编程逻辑器件可以非常方便地实现状态机。而采用VHDL语言设计,不仅描述方便,而且具有良好的可移植性,可以非常方便地应用于其它公司的CPLD,FPGA芯片中。实际使用中该芯片运行良好,同时可以随时对芯片内部逻辑进行在线更改,体现了可编程逻辑器件的优越性。* Y9 x7 E/ I' A4 M9 D
9 a' e3 G" ^9 q9 ~6 p0 ~7 ~- \ J |
|