第2节 VHDL状态机设计(2)
推荐给好友
打印
加入收藏
更新于2008-05-18 14:47:25

第2节 VHDL状态机设计(2)

One hot 编码

  • 当我们在强调状态机速度时,可以使用one hot编码,
    --由于状态向量中的状态位直接表示机器状态,所以状态译码很简单,不需要额外的逻辑,它的速度独立于状态数量,而仅与转移到特定状态的转移数量有关;
    --占用较多触发器资源(适合FPGA);
  • 与之相比,压缩状态编码在状态增加时速度会明显下降;当然带来的负面影响是控制逻辑的面积会有增大。

两进程描述

  • 有的设计者采用两个进程来描述状态机,
    --它就是将输出逻辑进程和状态转移逻辑合并起来,采用一个组合逻辑进程来描述。
  • 通常状况下,综合工具都可较好的识别出这两部分逻辑并进行优化,
    --但我们建议如果不是输出逻辑非常简单,还是采用两个不同的进程来描述,这样综合工具可以明确下状态转移逻辑,优化效果较好。

另外一种两进程描述

  • 将下状态转移逻辑和当前状态寄存器描述结合,省略中间变量:
    next_state:
    process(rst,clk)
    begin
    if rst=‘1’ then
    current_state<=…;
    elsif clk’event and clk=‘1’ then
    if cond=x then
    current_state<=…;
    elsif …….
    Current_state<=….;
    ……
    End process

单进程描述

  • 有的设计者采用一个进程来描述状态机, 它就是将状态机的三个逻辑单元合并起来,采用一个进程来描述。
  • 适用于简单的设计;
  • 对于复杂的状态机,可读性差,易出错,不利于EDA软件的优化。

Moore型的例子

实体和结构体中的变量定义

  • --Moore machine
    entity MOORE is
    port( RST: in std_logic;
    CLOCK: in std_logic;
    X: in std_logic;
    Z: out std_logic);
    end MOORE;

    architecture BEHAVIOR of MOORE is
    type STATE_TYPE is (S0,S1,S2,S3);
    signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
    begin

状态寄存器描述

  • 描述状态寄存器的进程
    SYNCH : process
    begin
    wait until CLOCK’event and CLOCK = ‘1’;
    if rst=‘1’ then
    CURRENT_STATE<=S1;
    else
    CURRENT_STATE <= NEXT_STATE;
    end if;
    end process;
  • 下状态转移逻辑进程
    STATE_TRANS : process (CURRENT_STATE, X)
    begin
    NEXT_STATE<=CURRENT_STATE; --default assignment
    case CURRENT_STATE is
    when S0 =>
    if X = ‘0’ then
    NEXT_STATE <= S0;
    else
    NEXT_STATE <= S2;
    end if;
    when S1 =>
    if X = ‘0’ then
    NEXT_STATE <= S0;
    else
    NEXT_STATE ,+ S2;
    end if;
    when S2 =>
    if X = ‘0’ then
    NEXT_STATE <= S2;
    else
    NEXT_STATE <= S3;
    end if;
    when S3 =>
    if X = ‘0’ then
    NEXT_STATE <= S3;
    else
    NEXT_STATE <=S1;
    end if;
    end case;
    end process;
  • 输出逻辑
    OUTPUT_GEN: process (CURRENT_STATE, X)
    begin
    Z<=’0’;--default assignment
    case CURRENT_STATE is
    when S0 =>
    Z <= ‘0’;
    when S1 =>
    Z <= ‘1’;
    when S2 =>
    Z <= ‘1’;
    when S3 =>
    Z <= ‘0’;
    end case;
    end process;
    end BEHAVIOR

使用状态机注意的地方

  • 在使用状态机时,尽量不要再使用其他控制信号来区分某个状态下要做的操作,也就是说:尽量使用状态机的输出信号直接控制数据通路,而不要使用输出信号再和其它信号运算后去控制数据通路。
  • 这样做使得控制相对明了,提高了程序的可读性,降低了调试的难度。相当于将其它控制逻辑也参与了状态机编码。
  • 大的状态机有较多输入和反馈;
  • 绝大多数FPGA基于4输入查找表;
  • 为了实现高速状态机:
  • One Hot编码,
  • 每状态输入不超过 4 个.
  • 复杂状态机的分割:

Xilinx的状态机设计工具-StateCAD

  • 用HDL简洁、完备、安全的描述状态机需要一定的功底和经验;
  • Xilinx的状态机设计工具-StateCAD
    --使状态机的设计、优化、测试变得简单快捷;
    --符合人们设计状态机的习惯;
        -表达状态机最自然的方式就是状态转移图,在StateCAD中只要画出状态转移图即可;
        -StateCAD自动转换为HDL语言并根据用户的设置进行优化,转换出来的代码规范、可读性好、可综合;
        -StateCAD自动检测状态机的完备性和正确性;
        -StateCAD自动生成测试激励

  • 状态机向导:
    --根据用户所选的状态机转移图类型(列状、双列状、行状、网状)、复位模式(同步、异步)、状态数目等条件生成一个基本的状态转移图模板;
    --减轻绘制状态转移图的工作量。
  • 逻辑向导:
    --对逻辑功能进行辅助设计,支持计数器、多路选择器、移位寄存器、加法器、乘法器等常用功能结构。
  • 优化向导:
    --对状态机进行优化,使整个设计在速度、面积等方面达到优化结果。
  • 代码生成:
    --首先对设计进行检查;
    --如果没有任何错误,则生成HDL代码,并打开代码窗口显示HDL代码。
  • 测试激励生成:
    --生成状态机的测试激励,并进行功能仿真或时序仿真,还可以对测试激励的覆盖率进行总结。 

    <<上一节  下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.