找回密码
 注册
关于网站域名变更的通知
查看: 244|回复: 2
打印 上一主题 下一主题

一款基于CPLD的一种容错状态机的设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-11-23 07:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一款基于cpld的一种容错状态机的设计
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

该用户从未签到

3#
发表于 2022-8-10 15:32 | 只看该作者
一款基于CPLD的一种容错状态机的设计
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-6 09:20 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表