第1节 VHDL状态机设计(1)
第1节 VHDL状态机设计(1)
有限状态机设计方法
- 分析控制器设计指标, 建立系统算法模型图,即状态转移图;
- 分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入、输出条件;
- 应用VHDL 语言完成状态机的描述。
Mealy和Moore型有限状态机
- Mealy型状态机的输出由状态机的输入和状态机的状态共同决定;
- 而Moore型状态机的输出仅与状态机的状态有关,与状态机的输入无关

有限状态机的构成
- 从上图中可以看到,有限状态机由三部分构成:
--状态寄存器,
--下状态转移逻辑,
--输出逻辑,
- Mealy和Moore状态机描述的区别就在输出逻辑进程
- 在使用VHDL描述有限状态机时,就从这三个方面入手
例子:0101序列监测器





采用有限状态机描述的优点
- 可以采用不同的编码风格,在描述状态机时,设计者常采用的编码有二进制、格雷码、one hot编码,用户可以根据自己的需要在综合时确定,而不需要修改源文件或修改源文件中的编码格式以及状态机的描述。
- 可以实现状态的最小化,(如果one hot编码,控制信号数量庞大)。
- 设计灵活,将控制单元与数据单元分离开。
二进制状态机编码
- 状态机的每一个状态用二进制位来编码
- 例:实现4状态的状态机,其二进制编码可为 状态1=“00” 状态2=“01” 状态3=“10” 状态4=“11”
- 特点: 触发器使用较少,速度较慢,可能产生两位同时翻转的情况。如:“01” “10”
格雷码状态机编码
- 格雷码编码每次仅一个状态位的值发生变化
- 例:实现4状态的状态机,其格雷码编码可为 状态1=“00” 状态2=“01” 状态3=“11” 状态4=“10”
- 特点: 触发器使用较少,速度较慢,不会产生两位同时翻转的情况。当状态位的输出被异步应用时,格雷码编码是有益的
ONE HOT状态机编码
- ONE HOT的编码方案对每一个状态采用一个触发器,即4个状态的状态机需4个触发器。同一时间仅1个状态位处于有效电平(如逻辑“l”)
- 例:实现4状态的状态机,其ONE HOT编码可为 状态1=“0001” 状态2=“0010” 状态3=“0100” 状态4=“1000”
- 特点: 触发器使用较多,但逻辑简单,速度快
编码方式的选择
- 根据状态机复杂程度: 状态特别多的系统采用2进制编码或格雷码编码
- 根据器件类型: FPGA一般采用ONE HOT编码,CPLD一般采用2进制编码或格雷码编码
- 从非法状态中退出: 在选择编码方案时,必须考虑状态机可能进入的潜在的非法状态数目。如果违反了状态位触发器的建立或保持时间,又没有定义所有可能出现的状态,则设计会终止在非法状态上。
也可以在程序中指明状态编码方式
- architecture behav of binary is
type state_type is (s1,s2,s3,s4,s5,s6,s7);
attribute enum_encoding:string;
attribute enum_encoding of state_type:type is "001 010 011 100 101 110 111";
architecture behav of one_hot is
type state_type is (s1,s2,s3,s4,s5,s6,s7);
attribute enum_encoding:string;
attribute enum_encoding of state_type:type is "0000001 0000010 0000100 0001000 0010000 0100000 1000000";
定义状态机的状态
- 设计者可以在使用状态机之前应该定义状态变量的枚举类型,定义可以在状态机描述的源文件中,也可以在专门的程序包中。
- 例子:
TYPE main_con_state IS (state1,state2)
定义状态变量
- 用户还需要定义两个状态机变量:当前状态和下状态,其中当前状态描述的是一组寄存器,而下状态描述的是组合逻辑。
- 比如:
signal current_state :main_con_state;
signal next_state: main_con_state;
描述状态机的三个进程
- 一般我们可以采用三个进程来描述状态机:
--描述状态寄存器的时序进程;
--描述下状态产生逻辑的组合逻辑进程;
--定义输出的组合逻辑进程。
- 状态机描述方式:
--三进程、两进程、单进程描述方式。
描述状态寄存器的进程
- 这个进程一般描述为:
process(reset,clk)
begin
if reset=‘1’ then
current_state<=初始状态;
elsif clk’event and clk=‘1’ then
current_state<=next_state;
end if;
end process;
一定要有复位信号,否则状态机处在随机状态,无法
开始正常工作。当然,可以采用同步复位信号,描
述如下所示:
process
begin
wait until clk’event and clk=‘1’;
if reset=‘1’ then
current_state<=初始状态;
else
current_state<=next_state;
end if;
end process;
下状态转移逻辑进程
- 下状态转移逻辑一般用case语句来描述,基本结构如下:
process(current_state,其他输入信号)
begin
next_state<=current_state;
case current_state is
when state1=>
….
Next_state<=某个状态
…
when state2=>
…..
End case;
end process;
- 在case语句之前,可给next_state赋一个缺省值: next_state<=current_state;
这样当在case语句中决定下状态的逻辑比较复杂时,就不用给所有的情况赋值,不关心的情况就保持原状态。
输出逻辑
- 输出逻辑进程一般描述如下:
process(current_state,其他输入信号)
begin
output<=缺省值
case current_state is
when state1=>
output<=xxx;
………
end case;
end process
- 如果是Mealy型状态机就 需要其他输入信号,这些 信号和当前状态共同决定 输出信号,如果是Moore 型状态机,输出只和当前 状态有关。
<<上一节 下一节>>