当前位置:首页 > EDA > 电子设计自动化
[导读]用STATECAD快速设计有限状态机


作者Email:  zlyadvocate@163.com

    数字系统通常划分为信息处理单元和控制单元。信息单元主要进行信息的传输和运算, 而控制单元的主要任务是控制信息处理单元的微操作的顺序。控制单元的实现方式有: 有限状态机、控制寄存器和微代码控制器等。有限状态机在时间尺度上对其控制信号进行离散化控制, 利用状态转移使控制信号在有限状态机的状态节拍控制下变化, 以实现对被控对象的控制。有限状态机设计的关键是如何把一个实际的时序逻辑关系抽象成一个时序逻辑函数,传统的电路图输入法通过直接设计寄存器组来实现各个状态之间的转换, 而用硬件描述语言来描述有限状态机, 往往是通过充分发挥硬件描述语言的抽象建模能力,通过对系统在系统级或寄存器传输级进行描述来建立有限状态机。EDA 工具的快速发展,使通过CAD快速设计有限状态机自动化成为可能。

传统上在系统级和寄存器传输级完成VHDL 的描述主要分以下几步:

(1) 分析控制器设计指标, 建立系统算法模型图;
(2) 分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入.输出条件;
(3) 应用VHDL 语言完成描述。

使用XILINX的ISE6.1软件包能加速有限状态机设计,大大简化状态机的设计过程,实现状态机设计的自动化。下面分析二个简单的状态机设计实例来介绍使用ISE6.1软件包中STATECAD来介绍快速设计有限状态机的方法。使用STATECAD进行状态机设计的流程如下:

(1) 分析控制器设计指标, 建立系统算法模型图;
(2) 分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入.输出条件;
(3) 在STATECAD中输入有限状态机状态图,自动产生VHDL模型描述,使用STATEBENCH进行状态转移分析,分析无误后使用导出VHDL模型块到ISE中进行仿真后综合,实现到CPLD或FPGA的映射。

设计人员的主要工作在第一步。第二步,第三步基本上可以通过STATECAD完成有限状态机的自动生成和分析,还可以利用分析结果来对被控对象的逻辑进行分析,改进,完善系统控制逻辑。

下面以一个VCR控制机状态机设计过程来介绍如何使用STATECAD设计状态机。
VCR控制机描述:

外部输入:
1.POWERSWITCH---------电源开关
2.STOP----------------停按钮
3.PLAY――――――――播放按钮
4.RECORD―――――――录影按钮

输出状态:
1. 有电显示:电源指示灯亮,播放指示灯灭,录影指示灯灭;
2. 按播放按钮,进入播放状态,播放指示灯亮,电源指示灯亮,录影指示灯灭;按停按钮,退出播放状态回到有电状态,播放指示灯灭,电源指示灯亮,录影指示灯灭;
3. 按录影按钮,进入录影状态,录影指示灯亮;按停按钮,退出录影状态回到有电状态;电源指示灯亮,播放指示灯灭,录影指示灯灭;
4. 电源开关断开,电源指示灯灭,播放指示灯灭,录影指示灯灭;

打开STATECAD,输入如下的状态图:

进行逻辑优化(工具自动进行逻辑优化)后,使用STATEBENCH进行状态转移分析。以下是自动状态转移模拟波形。

也可以进行行为状态模拟:如以下动作的模拟波形,按电源开关上电,按播放按钮,按播放按钮,按停按钮,按录影按钮,按停按钮,电源开关断电。

综合以上的模拟波形结果,可以看到状态机安装指定的状态转移图工作。
导出VHDL模型块到ISE中进行仿真后综合后可以适配到XC9536-5-PC44芯片,适配结果如下:

宏模块使用 Pterms Used 寄存器使用情况 引脚使用情况 IOB使用情况
9/36  (25%) 37/180  (21%) 9/36  (25%) 13/34  (39%) 11/72  (16%)

进行引脚锁定后就可以进行编程。
代码如下:
--  D:XILINXTUTORIALVCRSTATE.vhd
--  VHDL code created by Xilinx's StateCAD 6.1i

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY VCRSTATE IS
 PORT (CLK,PLAYSWITCH,POWERSWITCH,RECORDSWITCH,RESET,STOPSWITCH: IN std_logic ;
  PLAYLED,POWERLED,RECORDLED : OUT std_logic);
END;

ARCHITECTURE BEHAVIOR OF VCRSTATE IS
 TYPE type_sreg IS (OFF,PLAY,POWERON,RECORDING);
 SIGNAL sreg, next_sreg : type_sreg;
 SIGNAL next_PLAYLED,next_POWERLED,next_RECORDLED : std_logic;
BEGIN
 PROCESS (CLK, RESET, next_sreg, next_PLAYLED, next_POWERLED, next_RECORDLED)
 BEGIN
  IF ( RESET='1' ) THEN
   sreg <= OFF;              PLAYLED <= '0';
   POWERLED <= '0';             RECORDLED <= '0';
  ELSIF CLK='1' AND CLK'event THEN
   sreg <= next_sreg;             PLAYLED <= next_PLAYLED;
   POWERLED <= next_POWERLED;  RECORDLED <= next_RECORDLED;
  END IF;
 END PROCESS;

 PROCESS (sreg,PLAYSWITCH,POWERSWITCH,RECORDSWITCH,STOPSWITCH)
 BEGIN
  next_PLAYLED <= '0'; next_POWERLED <= '0'; next_RECORDLED <= '0';
  next_sreg<=OFF;
  CASE sreg IS
   WHEN OFF =>
    IF ( POWERSWITCH='1' ) THEN
     next_sreg<=POWERON; next_POWERLED<='1';
     next_PLAYLED<='0'; next_RECORDLED<='0';
     ELSE
     next_sreg<=OFF;  next_POWERLED<='0';
     next_PLAYLED<='0'; next_RECORDLED<='0';
    END IF;
   WHEN PLAY =>
    IF ( POWERSWITCH='1' AND STOPSWITCH='0' ) THEN
     next_sreg<=PLAY;    next_POWERLED<='1';
     next_PLAYLED<='1'; next_RECORDLED<='0';
    END IF;
    IF ( POWERSWITCH='0' ) THEN
     next_sreg<=OFF;  next_POWERLED<='0';
     next_PLAYLED<='0'; next_RECORDLED<='0';
    END IF;
    IF ( STOPSWITCH='1' AND POWERSWITCH='1' ) THEN
     next_sreg<=POWERON; next_POWERLED<='1';
     next_PLAYLED<='0'; next_RECORDLED<='0';
    END IF;
   WHEN POWERON =>
    IF ( POWERSWITCH='0' ) THEN
     next_sreg<=OFF;  next_POWERLED<='0';
     next_PLAYLED<='0'; next_RECORDLED<='0';
    ELSIF ( RECORDSWITCH='1' ) THEN
     next_sreg<=RECORDING; next_POWERLED<='1';
     next_PLAYLED<='0';  next_RECORDLED<='1';
    ELSIF ( PLAYSWITCH='1' ) THEN
     next_sreg<=PLAY;     next_POWERLED<='1';
     next_PLAYLED<='1';  next_RECORDLED<='0';
     ELSE
     next_sreg<=POWERON;  next_POWERLED<='1';
     next_PLAYLED<='0';  next_RECORDLED<='0';
    END IF;
   WHEN RECORDING =>
    IF ( POWERSWITCH='1' AND STOPSWITCH='0' ) THEN
     next_sreg<=RECORDING; next_POWERLED<='1';
     next_PLAYLED<='0';  next_RECORDLED<='1';
    END IF;
    IF ( POWERSWITCH='0' ) THEN
     next_sreg<=OFF;   next_POWERLED<='0';
     next_PLAYLED<='0';  next_RECORDLED<='0';
    END IF;
    IF ( STOPSWITCH='1' AND POWERSWITCH='1' ) THEN
     next_sreg<=POWERON;  next_POWERLED<='1';
     next_PLAYLED<='0';  next_RECORDLED<='0';
    END IF;
   WHEN OTHERS =>
  END CASE;
 END PROCESS;
END BEHAVIOR;

整个状态机实现过程比相当简单。快捷。有效。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭