|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& C/ p4 X5 V Z, ? M
; i0 G! D* t) x4 C; {状态机是一种十分重要的时序电路,常用于描述数字系统的控制单元,在数字系统有着广泛的应用,如步进电机、数据存储器的读写、总线控制器等。本文结合具体课题;采用ALTERA的CPLD器件EPM7032实现了一种容错的状态机;采用VHDL语言编程,实际使用效果良好,不仅调试方便,而且增加了系统配置的灵活性,大大缩短了系统开发周期。 : z0 I% h. c, p' K
1 状态机的真值表及状态转移
4 B5 n' z( f; R% g4 |&nBSP; 该状态机是一种Moore型的,其真值表如表1。
3 q3 {6 n* D- {3 Q, K8 d* R/ M4 X
5 F! ^$ {( n: N! F9 t' A! B3 z 该状态机编码方式采用顺序方式,共采用4位编码。这样就存在两个非法的状态(即在状态机中,未定义的状态);采用该编码方式与一位有效编码方式相比,大大减少了非法状态的存在。
' v! ]# z) E9 ^ 状态转移图如图1所示。
; F+ v: H' T. X: D7 Z
6 `4 t- \) _$ R. x, H' O- Z6 Z. l, @9 U
; V" }+ v b, @: F6 u2 VHDL的描述
/ p4 F$ R/ d8 ]/ F 采用VHDL语言描述时、主要应包括:状态变量、时钟、状态转移指定、输出指定、复位信号等几个方面。
; N7 T5 U1 ^$ y(1)状态机的状态变量定义如下:7 r/ \1 i4 ~- h. m
TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4 ,out1,out2,out3,out4,out5,out6,out7,out8);. h, w* {2 [3 n6 C
signal present_state,next_state:statetype;7 b; {2 v0 j" ^/ T
signal codin:std_logic_vector(3 downto 0);
, _3 e8 a+ R4 w5 A(2)状态机的部分状态转移指定:
& P" j5 E+ x2 {8 r1 L: ?9 o5 a) Istatedesc: process (reset, data, present_state, burst,ou_rec,ready)8 v2 _/ y" _5 `% o# r+ u% f
begin
+ v, d! }4 Z* w) k; O _.........................
! d! d$ G1 v4 ]5 }* {; r Case present_state is1 R4 e0 W2 e) @9 K
When idle=>codin<="0000";- e! z. u9 w) D3 M& H- s
If(data="11111111")then next_state<=deci; }7 v+ M: C) |4 y9 N+ ?
Else
& \. l6 Y S% uNext_state<=idle;
0 `1 ?; _7 |0 W: e( T! Eend if;6 i( k2 ?& e$ I3 @" P
..............
2 d' x) ]% T4 O# e* HWhen out1=>codin<="0110";
1 O2 C& @, c, V8 W If(ready=' 0' )then
) d4 Y! I$ M% _$ e9 xNext_state<=out1;8 Z/ M7 q# Q/ ?0 S
Elsif (burst=' 0' )then next_state<=idle;2 s) U& U! s* \5 c; Y) i
Else next_state<=out2;
: ^7 ^) M/ Q, U4 u/ [) uend if;5 j/ Z* E F3 @1 B0 Q/ { n4 h) n
...............
4 F" k2 o0 l" V1 N" X3 C(3)状态机的输出指定 P/ ]) o* G. Z) J
状态机的输出需要对codin进行译码才能输出,输出指定放在另一个进程(在该进程中同时还实现次态到现态的转化)中, VHDL的描述为:8 A5 T5 M5 a: x1 v& g6 d7 ^
state-change:process(clk)
6 V7 F( ?+ y n( Tbegin
" E, _6 ?* w# w" Tcase codin is
! b7 |! q! {6 k, H when "0000"=> get<=' 0' ;we<=' 0' ;addr<="000"; $ o8 [, K6 L' Y/ c7 P0 Q
...............................................* S$ u3 k$ E& b
when"1101"=>get<=' 1' ;we<=' 0' ;addr< ="111";' [8 k% H5 J/ f, M4 Y, e
when others= >get< = ' 0' ;we< = ' 0' ;addr< ="000";) d. M7 ~7 ?( w9 n) B8 L
end case;
6 W" c( V8 J5 t, _- ]' s1 u4 ^end process state-change;
- b' a0 s/ @" S# T' t
7 w0 ]; n7 T- U1 \3 纠错功能的实现
6 v* H/ J9 _) h( z S" x0 Z! I 在实际的工作当中,由于硬件电路中,干扰、钟摆、噪声、电源的变化等都可能使触发器翻转,从而使状态机误入非法状态。一旦出现这种情况将无法预见系统的反应,可能会出现状态锁死、系统非法输出;信号冲突,过大的拉电流和灌电流,毁坏系统。# t3 I5 O J/ |8 J( X3 U6 o
在进行容错设计时,首先在枚举类型的状态定义中定义所有的非法状态。因此状态定义改为:
8 |. W! R% D2 M' y( @: x6 k9 xTYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4, out1,out2,out3, out4,out5,out6,out7,out8,undefine1,undefine2);8 o( ^. s/ V; O8 h1 \
最后,需要定义转移出非法状态的代码。程序片段如下:8 e+ `! w) s8 E) ?
..................
; v7 a' Q5 x" ucase present_state is
% V( L! k j" E1 A................." \( v7 t! w( G, A/ k d3 m% U
when others =>next_state <=idle,err<=' 1' ;
8 {& |3 e3 m3 W. [0 Q% v7 a, Z- dend case;; u8 [$ t* A2 ?4 ]( ]
另外在进程的设计时,还需要充分注意信号的同步问题,这样才能避免竞争冒险的问题。进行容错设计,虽然牺牲了资源,但却可获得了高可靠的系统。* Q! W5 T3 A+ e. H- i
0 l. t% k6 [1 c
4 结束语
4 S: z8 o' b6 N 实践证明使用可编程逻辑器件可以非常方便地实现状态机。而采用VHDL语言设计,不仅描述方便,而且具有良好的可移植性,可以非常方便地应用于其它公司的CPLD,FPGA芯片中。实际使用中该芯片运行良好,同时可以随时对芯片内部逻辑进行在线更改,体现了可编程逻辑器件的优越性。9 K# y) T& B( h. j: B/ [' N3 y
, C' N9 \! T5 y/ j6 b5 n2 o0 s
|
|