状态机是一种十分重要的时序电路,常用于描述数字系统的控制单元,在数字系统有着广泛的应用,如步进电机、数据存储器的读写、总线控制器等。本文结合具体课题;采用ALTERA的CPLD器件EPM7032实现了一种容错的状态机;采用VHDL语言编程,实际使用效果良好,不仅调试方便,而且增加了系统配置的灵活性,大大缩短了系统开发周期。
1 状态机的真值表及状态转移
该状态机是一种Moore型的,其真值表如表1。
该状态机编码方式采用顺序方式,共采用4位编码。这样就存在两个非法的状态(即在状态机中,未定义的状态);采用该编码方式与一位有效编码方式相比,大大减少了非法状态的存在。
状态转移图如图1所示。
2 VHDL的描述
采用VHDL语言描述时、主要应包括:状态变量、时钟、状态转移指定、输出指定、复位信号等几个方面。
(1)状态机的状态变量定义如下:
TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4 ,out1,out2,out3,out4,out5,out6,out7,out8);
signal present_state,next_state:statetype;
signal codin:std_logic_vector(3 downto 0);
(2)状态机的部分状态转移指定:
statedesc: process (reset, data, present_state, burst,ou_rec,ready)
begin
.........................
Case present_state is
When idle=>codin<="0000";
If(data="11111111")then next_state<=deci;
Else
Next_state<=idle;
end if;
..............
When out1=>codin<="0110";
If(ready=' 0' )then
Next_state<=out1;
Elsif (burst=' 0' )then next_state<=idle;
Else next_state<=out2;
end if;
...............
(3)状态机的输出指定
状态机的输出需要对codin进行译码才能输出,输出指定放在另一个进程(在该进程中同时还实现次态到现态的转化)中, VHDL的描述为:
state-change:process(clk)
begin
case codin is
when "0000"=> get<=' 0' ;we<=' 0' ;addr<="000";
...............................................
when"1101"=>get<=' 1' ;we<=' 0' ;addr< ="111";
when others= >get< = ' 0' ;we< = ' 0' ;addr< ="000";
end case;
end process state-change;
3 纠错功能的实现
在实际的工作当中,由于硬件电路中,干扰、钟摆、噪声、电源的变化等都可能使触发器翻转,从而使状态机误入非法状态。一旦出现这种情况将无法预见系统的反应,可能会出现状态锁死、系统非法输出;信号冲突,过大的拉电流和灌电流,毁坏系统。
在进行容错设计时,首先在枚举类型的状态定义中定义所有的非法状态。因此状态定义改为:
TYPE StateTYPE is (idle, deci, reci1, reci2, reci3,reci4, out1,out2,out3, out4,out5,out6,out7,out8,undefine1,undefine2);
最后,需要定义转移出非法状态的代码。程序片段如下:
..................
case present_state is
.................
when others =>next_state <=idle,err<=' 1' ;
end case;
另外在进程的设计时,还需要充分注意信号的同步问题,这样才能避免竞争冒险的问题。进行容错设计,虽然牺牲了资源,但却可获得了高可靠的系统。
4 结束语
实践证明使用可编程逻辑器件可以非常方便地实现状态机。而采用VHDL语言设计,不仅描述方便,而且具有良好的可移植性,可以非常方便地应用于其它公司的CPLD,FPGA芯片中。实际使用中该芯片运行良好,同时可以随时对芯片内部逻辑进行在线更改,体现了可编程逻辑器件的优越性。