网站搜索:
第1节 VHDL状态机设计(1)
文章出处:与非网
更新于2008-05-18 06:45:46

第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 型状态机,输出只和当前 状态有关。

 

 <<上一节  下一节>>



关于OpenHW | OpenHW使用说明 | FAQ | 相关法律 | 版权声明 | 网站地图
联系邮件:xiaoquan@eefocus.com  联系电话: 010-58859035-8012
Powered by eefocus.com