状态机基础及电路设计
状态机(STATE MACHINE)可以说是一个广义时序电路,触发器,
计数器,移位寄存器都算是它的特殊功能的一种.在电子设计自动化应用当中,状态机经常是担任CPU的功能,从某种意义上讲状态机的应用让系统具有了智能化的功能,业界为状态机和CPU的功能一直争论不休,不过事实是更多人倾向于状态机,认为状态机的功能比CPU强大.
下面将带领大家认识一下状态机的基本设计思想.
传统的逻辑电路设计在描述状态机的表示上,以状态图(STATE DIAGRAM)方式最为清晰且容易理解.根据输入,输出及状态关系,状态图可以分为:
1.输入&状态&输出(输出仅与状态有关)
以下面图形为例,若目前状态机处于状态S0时,输入为0则状态机将维持状态S0不变,若输入改为1则下个状态改成状态S1,但不论输入是什么,此时输出均为0.
这种输出与状态有关,而与输入无关的状态机类型,称为More状态机.
编程实现其功能如下:
--***********************状态机********************* 重点提示
整个状态机的电路描述分成两个PROCESS命令语句完成.
第一个PROCESS:负责感测时钟脉冲信号CP在上升沿变化之际,作目前状态(PresentState)切换至下个状态(NextState)的动作. 第二个PROCESS:负责感测输入(DIN)值,目前状态(PresentState)值,由CASE-WHEN语句决定输出(OP)和下个状态(NextState)值.
--********************************************************* LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--********************************************************* ENTITY CH6_5_1 IS PORT(CP :IN STD_LOGIC; --CLOCK DIN:IN STD_LOGIC; --I/P Signal OP :OUT STD_LOGIC --O/P Signal ); END CH6_5_1;
--********************************************************* ARCHITECTURE A OF CH6_5_1 IS TYPE STATE IS (S0,S1,S2,S3); --State Type Declare SIGNAL PRESENTSTATE :STATE; --Present State SIGNAL NEXTSTATE :STATE; --Next State BEGIN SWITCHTONEXTSTATE:PROCESS(CP) BEGIN IF CP'EVENT AND CP='1' THEN PRESENTSTATE<=NEXTSTATE; END IF;
END PROCESS SWITCHTONEXTSTATE;
CHANGESTATEMODE:PROCESS(DIN,PRESENTSTATE) BEGIN CASE PRESENTSTATE IS WHEN S0=> --STATE S0 IF DIN='0' THEN --INPUT=0 NEXTSTATE<=S0; ELSE NEXTSTATE<=S1; END IF; OP<='0'; --OUTPUT
WHEN S1=> --STATE S1 IF DIN='1' THEN --INPUT=1 NEXTSTATE<=S1; ELSE NEXTSTATE<=S2; END IF; OP<='0'; --OUTPUT WHEN S2=> --STATE S2 IF DIN='1' THEN --INPUT=1 NEXTSTATE<=S2; ELSE NEXTSTATE<=S3; END IF; OP<='0'; --OUTPUT WHEN S3=> --STATE S3 IF DIN='1' THEN --INPUT=1 NEXTSTATE<=S0; ELSE NEXTSTATE<=S1; END IF; OP<='0'; --OUTPUT WHEN OTHERS=> --Initial State NEXTSTATE<=S0; OP<='0'; --OUTPUT END CASE; END PROCESS CHANGESTATEMODE; END A;
--*********************************************************
程序说明:
(1)上述的状态编码方式,使用默认的Binary编码.
(2)在第二个PROCESS内的CASE-WHEN语句里,最后一个WHEN OTHERS作用在电路起始状态,亦即--将状态初始设定为S0.
2.输入&状态&输出(输出与状态,输入背景有关)
下面图形的动作和上图相似,但是输出是会随输入不同而有所改变,例如目前状态是S3,若输入是0则输出为0且下个状态更换成S1,而输入为1则输出为1且下个状态更换成S0.
这种输出与状态及输入皆有关系者,称为Mealy状态机.
程序实现功能如下:
--***************************************************************************** LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--***************************************************************************** ENTITY CH6_5_2 IS PORT(CP :IN STD_LOGIC; --CLOCK
DIN:IN STD_LOGIC; --I/P Signal OP :OUT STD_LOGIC ); END CH6_5_2;
--***************************************************************************** ARCHITECTURE A OF CH6_5_2 IS TYPE STATE IS (S0,S1,S2,S3); --State Type Declare SIGNAL PRESENTSTATE :STATE; --PRESENT STATE SIGNAL NEXTSTATE :STATE; --NEXT STATE BEGIN
SWITCHTONEXTSTATE:PROCESS(CP) --PRESENTSTATE->NEXTSTATE BEGIN IF CP'EVENT AND CP='1' THEN
PRESENTSTATE<=NEXTSTATE; END IF;
END PROCESS SWITCHTONEXTSTATE;
CHANGESTATEMODE:PROCESS(DIN,PRESENTSTATE) BEGIN CASE PRESENTSTATE IS WHEN S0=> --STATE S0 IF DIN='0' THEN --INPUT=0 NEXTSTATE<=S0; OP<='0'; --OUTPUT ELSE NEXTSTATE<=S1; OP<='1'; --OUTPUT END IF; WHEN S1=> --STATE S1 IF DIN='1' THEN --INPUT=1 NEXTSTATE<=S1; OP<='1'; --OUTPUT ELSE NEXTSTATE<=S2; OP<='0'; --OUTPUT END IF; WHEN S2=> --STATE S2 IF DIN='1' THEN --INPUT=1 NEXTSTATE<=S2; OP<='0'; --OUTPUT ELSE NEXTSTATE<=S3; OP<='1'; --OUTPUT END IF;
WHEN S3=> --STATE S3 IF DIN='1' THEN --INPUT=1 NEXTSTATE<=S0; OP<='1'; --OUTPUT ELSE NEXTSTATE<=S1; OP<='0'; --OUTPUT END IF; WHEN OTHERS=> --Initial State NEXTSTATE<=S0; OP<='0'; --OUTPUT END CASE; END PROCESS CHANGESTATEMODE; END A;
程序说明:
程序写法是与CH6_5_!相似,不过在处理输出OP部分,需按照输入
的信号情况,作判断输出,这部分可程序的注释部分看出.
因篇幅问题不能全部显示,请点此查看更多更全内容