如何使用STATECAD进行多状态机设计实例分析

最新更新时间:2012-03-26来源: 互联网关键字:STATECAD  多状态机  实例分析 手机看文章 扫描二维码
随时随地手机看文章

随着微电子技术的迅速发展,人们对数字系统的需求也在提高。不仅要有完善的功能,而且对速度也提出了很高的要求。对于大部分数字系统,都可以划分为控制单元和数据单元两个组成部分。通常,控制单元的主体是一个有限状态机 ,它接收外部信号以及数据单元产生的状态信息,产生控制信号序列。有限状态机设计的关键是如何把一个实际的时序逻辑关系抽象成一个时序逻辑函数,传统的电路图输入法通过直接设计寄存器组来实现各个状态之间的转换, 而用硬件描述语言来描述有限状态机, 往往是通过充分发挥硬件描述语言的抽象建模能力,通过对系统在系统级或寄存器传输级进行描述来建立有限状态机。EDA 工具的快速发展,使通过CAD快速设计有限状态机自动化成为可能。

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

  (1) 分析控制器设计指标, 建立系统算法模型图;

  (2) 分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入.输出条件;

  (3) 应用VHDL 语言完成描述。

  使用XILINX的ISE6.1软件包的辅助工具STATECAD能加速有限状态机设计,大大简化状态机的设计过程,实现状态机设计的自动化。使用STATECAD进行状态机设计的流程如下:

  (1) 分析控制器设计指标, 建立系统算法模型图;

  (2) 分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入.输出条件;

  (3) 在STATECAD中输入有限状态机状态图,自动产生VHDL模型描述,使用STATEBENCH进行状态转移分析,分析无误后使用导出VHDL模型块到ISE中进行仿真后综合,实现到CPLD或FPGA的映射。

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

  在需要并行处理的场合,往往需要采用多状态机来完成系统的控制任务,这时状态机之间的同步问题往往是设计者需要仔细考虑的问题。如果采用完全人工输入代码的方法来设计,往往力不从心。采用STATECAD完成整个控制逻辑的设计并对设计结果进行验证更能体现CAD设计方法的优势,加速产品开发进度,提高设计生产率。

  下面以一个双状态机设计过程来介绍如何使用STATECAD进行多状态机的协同设计。

  有二个状态机,一个负责对M0写,一个负责对M0读操作,为了简单起见,系统已经尽量简化了。

  负责对M0写的状态机包括四个状态:

  STATE0:写状态机复位后初始化;

  Write0:对M0写,写满4个转到M0full;

  M0full:M0满状态;

  M0writewait:等待。M0满时转入Write0状态。

  负责对M0读的状态机包括四个状态:

  STATE1:读状态机复位后初始化

  Read0:对M0读,读4个转到M0empty

  M0empty:M0空状态

  M0readwait:等待。M0空时转入Read0状态

  负责对M0写的状态机必须知道M0是空的,而负责对M0读的状态机必须知道M0是满的才能读。读完了通知负责对M0写的状态机M0是空的,可以写了。二个状态机同时并行工作。M0写的状态机在写操作完了,就等待M0空。M0读的状态机在读操作完了,就等待M0满。在STATECAD中,状态本身可以作为其他状态机的转移条件。这也正是在进行多状态机的协同设计中最需要的功能,能大大方便多状态机的设计。

  

 

  输入完状态图,就基本完成了状态机的设计过程。进行逻辑优化(工具自动进行逻辑优化)后,使用STATEBENCH进行状态转移分析。以下是自动状态转移模拟波形。

  

由以上的波形看到状态机的工作过程符合设计逻辑。对单独的器件操作也许不需要采用多状态机的设计方法,但在多器件需要并行工作时,多状态机的协同设计就显得必要了。导出VHDL模型块到ISE中进行仿真后综合,这里就不多讲了,以下是产生的代码:

  -- D:XILINXTUTORIALDUOZTJI.Vhd

  LIBRARY Ieee;

  USE Ieee.Std_logic_1164.All;

  LIBRARY Ieee;

  USE Ieee.Std_logic_unsigned.All;

  ENTITY SHELL_DUOZTJI IS

  PORT (CLK,RESET: IN Std_logic;

  Dcounter0,Dcounter1 : OUT Std_logic);

  SIGNAL BP_dcounter0,BP_dcounter1,Readcounter0,Readcounter1: Std_logic;

  END;

  ARCHITECTURE BEHAVIOR OF SHELL_DUOZTJI IS

  SIGNAL Sreg : Std_logic_vector (1 DOWNTO 0);

  SIGNAL Next_sreg : Std_logic_vector (1 DOWNTO 0);

  CONSTANT M0full : Std_logic_vector (1 DOWNTO 0) :="00";

  CONSTANT M0writewait : Std_logic_vector (1 DOWNTO 0) :="01";

  CONSTANT STATE0 : Std_logic_vector (1 DOWNTO 0) :="10";

  CONSTANT Write0 : Std_logic_vector (1 DOWNTO 0) :="11";

  SIGNAL Sreg1 : Std_logic_vector (1 DOWNTO 0);

  SIGNAL Next_sreg1 : Std_logic_vector (1 DOWNTO 0);

  CONSTANT M0empty : Std_logic_vector (1 DOWNTO 0) :="00";

  CONSTANT M0readwait : Std_logic_vector (1 DOWNTO 0) :="01";

  CONSTANT Read0 : Std_logic_vector (1 DOWNTO 0) :="10";

  CONSTANT STATE1 : Std_logic_vector (1 DOWNTO 0) :="11";

  SIGNAL Next_BP_dcounter0,Next_BP_dcounter1,Next_readcounter0,

  Next_readcounter1 : Std_logic;

  SIGNAL BP_dcounter : Std_logic_vector (1 DOWNTO 0);

  SIGNAL Dcounter : Std_logic_vector (1 DOWNTO 0);

  SIGNAL Readcounter : Std_logic_vector (1 DOWNTO 0);

  BEGIN

  PROCESS (CLK, Next_sreg, Next_BP_dcounter1, Next_BP_dcounter0)

  BEGIN

  IF CLK=''1'' AND CLK''Event THEN

  Sreg <= Next_sreg;

  BP_dcounter1 <= Next_BP_dcounter1;

  BP_dcounter0 <= Next_BP_dcounter0;

  END IF;

  END PROCESS;

  PROCESS (CLK, Next_sreg1, Next_readcounter1, Next_readcounter0)

  BEGIN

  IF CLK=''1'' AND CLK''Event THEN

  Sreg1 <= Next_sreg1;

  Readcounter1 <= Next_readcounter1;

  Readcounter0 <= Next_readcounter0;

  END IF;

  END PROCESS;

  PROCESS (Sreg,Sreg1,BP_dcounter0,BP_dcounter1,Readcounter0,Readcounter1,

  RESET,BP_dcounter,Readcounter)

  BEGIN

  Next_BP_dcounter0 <= BP_dcounter0;Next_BP_dcounter1 <= BP_dcounter1;

  Next_readcounter0 <= Readcounter0;Next_readcounter1 <= Readcounter1;

  BP_dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)));

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)));

  Next_sreg<=M0full;

  Next_sreg1<=M0empty;

  IF ( RESET=''1'' ) THEN

  Next_sreg<=STATE0;

  BP_dcounter <= (Std_logic_vector''("00"));

  ELSE

  CASE Sreg IS

  WHEN M0full =>

  Next_sreg<=M0writewait;

  BP_dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)));

  WHEN M0writewait =>

  IF ( (Sreg1=M0empty)) THEN

  Next_sreg<=Write0;

  BP_dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)) + Std_logic_vector''("01"));

  ELSE

  Next_sreg<=M0writewait;

  BP_dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)));

  END IF;

  WHEN STATE0 =>

  Next_sreg<=Write0;

  BP_dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)) +

  Std_logic_vector''("01"));

  WHEN Write0 =>

  IF ( BP_dcounter0=''1'' AND BP_dcounter1=''1'' ) THEN

  Next_sreg<=M0full;

  BP_dcounter <= (Std_logic_vector''("00"));

  ELSE

  Next_sreg<=Write0;

  BP_dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)) +

  Std_logic_vector''("01"));

  END IF;

  WHEN OTHERS =>

  END CASE;

  END IF;

  IF ( RESET=''1'' ) THEN

  Next_sreg1<=STATE1;

  Readcounter <= (Std_logic_vector''("00"));

  ELSE

  CASE Sreg1 IS

  WHEN M0empty =>

  Next_sreg1<=M0readwait;

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)));

  WHEN M0readwait =>

  IF ( (Sreg=M0full)) THEN

  Next_sreg1<=Read0;

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)) +

  Std_logic_vector''("01"));

  ELSE

  Next_sreg1<=M0readwait;

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)));

  END IF;

  WHEN Read0 =>

  IF ( Readcounter0=''1'' AND Readcounter1=''1'' ) THEN

  Next_sreg1<=M0empty;

  Readcounter <= (Std_logic_vector''("00"));

  ELSE

  Next_sreg1<=Read0;

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)) +

  Std_logic_vector''("01"));

  END IF;

  WHEN STATE1 =>

  IF ( (Sreg=M0full)) THEN

  Next_sreg1<=Read0;

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)) + Std_logic_vector''("01"));

  ELSE

  Next_sreg1<=STATE1;

  Readcounter <= (( Std_logic_vector''(Readcounter1, Readcounter0)));

  END IF;

  WHEN OTHERS =>

  END CASE;

  END IF;

  Next_BP_dcounter1 <= BP_dcounter(1);

  Next_BP_dcounter0 <= BP_dcounter(0);

  Next_readcounter1 <= Readcounter(1);

  Next_readcounter0 <= Readcounter(0);

  END PROCESS;

  PROCESS (BP_dcounter0,BP_dcounter1,Dcounter)

  BEGIN

  Dcounter <= (( Std_logic_vector''(BP_dcounter1, BP_dcounter0)));

  Dcounter0 <= Dcounter(0);

  Dcounter1 <= Dcounter(1);

  END PROCESS;

  END BEHAVIOR;

  LIBRARY Ieee;

  USE Ieee.Std_logic_1164.All;

  LIBRARY Ieee;

  USE Ieee.Std_logic_unsigned.All;

  ENTITY DUOZTJI IS

  PORT (Dcounter : OUT Std_logic_vector (1 DOWNTO 0);

  CLK,RESET: IN Std_logic);

  END;

  ARCHITECTURE BEHAVIOR OF DUOZTJI IS

  COMPONENT SHELL_DUOZTJI

  PORT (CLK,RESET: IN Std_logic;

  Dcounter0,Dcounter1 : OUT Std_logic);

  END COMPONENT;

  BEGIN

  SHELL1_DUOZTJI : SHELL_DUOZTJI PORT MAP (CLK=>CLK,RESET=>RESET,Dcounter0=>

  Dcounter(0),Dcounter1=>Dcounter(1));

  END BEHAVIOR;

关键字:STATECAD  多状态机  实例分析 编辑:神话 引用地址:如何使用STATECAD进行多状态机设计实例分析

上一篇:ModelSim功能及使用入门
下一篇:常用EDA设计与仿真软件介绍

推荐阅读最新更新时间:2023-10-12 20:38

用HT46X23设计微波炉控制器实例分析
  微波炉控制器的工作环境相对比较恶劣。首先是炉腔温度比较高,控制器附近温度也会比较高,达到60℃~70℃;另一方面,微波辐射对单片机抗干扰的要求也很高,在做多次快速开关门试验中,当少量微波泄露时,对控制器有一定的辐射,以及反复开通和关断大功率负载会产生较强的干扰。所以选择合适的单片机十分重要,在多年的家电产品设计中,经常用盛群半导体(Holtek)的48系列及46系列8bit单片机设计微波炉控制器,无论在适应工作环境还是抗干扰等方面都完全满足要求,在成本及供货等方面比国外芯片也有更明显的优势。   本文通过实际产品为例,以产品功能要求、方案确定和芯片选型、硬件设计、软件规划及编写等几部分介绍如何用单片机设计微波炉控制器。
[手机便携]
OK6410A 开发板 (八) 54 linux-5.11 OK6410A 缺页异常实例分析
abort 异常解读(Prefetch Abort & Data Abort) instruction fetch memory abort data access memory abort 中止 在 内存访问流程中 ,ARM处理器可能会发生异常 异常的原因是中止(异常的访问),中止分为三种: MMU faults(4种) MMU检测到限制并向处理器发送信号。 Debug abort 监视器调试模式已启用,并且检测到断点或监视点。 External abort(三种) 外部内存系统发出非法或错误的内存访问信号。 中止产生了什么异常 MMU faults 如果中止的内存请
[单片机]
西门子S7 1214C PLC的ModbusRTU通讯实例分析
PLC程序猿Modbus是PLC应用中常用的通讯手段,轮询是在进行一个控制器连接多个从站的通讯时常用的编程手段,由于ST语言在数据处理上的优势,此方法变得更为简单。下面以西门子S7 1214C PLC的ModbusRTU通讯为例,展现ST语言下的modbus通讯和轮询。 硬件连接 要准备的硬件和软件: 1.西门子PLC 1214C; 2.通讯板CB1241; 3.USB转RS485转换器; 4.Modscan2/Modsim32电脑模拟软件模拟主/从站, 5.SPU(serial port Utility),监视通讯报文。 PLC作为主站,使用软件Modsim32模拟从站,使用两芯线(最好是带屏蔽双绞线)进行连接: 硬件连接
[嵌入式]
西门子S7 1214C PLC的ModbusRTU通讯<font color='red'>实例分析</font>
现场总线iCAN网络在工程机械中的应用实例分析
  CAN总线是国际上应用最广泛的现场总线之一,最初被设计用作汽车电子控制单元(ECU)的串行数据传输网络,现已被广泛应用于欧洲的中高档汽车中。近几年来,由于CAN总线极高的可靠性、实时性,CAN总线开始进入中国各个行业的数据通讯应用,并在2002年被确定为电力通讯产品领域的国家标准。   CAN网络使用普通双绞线做为传输介质,采用直线拓扑结构,单条网络线路可以连接到110个节点。当通讯距离不大于40米时,传输速率可达到1Mbps;当使用5Kbps传输速率(收发器PCA82C250/251支持)时,同一物理网络可达10公里的通讯距离。CAN总线的适用范围包括:可适用于节点数目比较多、传输距离在10公里以内、安全性和可靠性要求高的
[嵌入式]
STATECAD快速设计有限状态机
作者Email: zlyadvocate@163.com 数字系统通常划分为信息处理单元和控制单元。信息单元主要进行信息的传输和运算, 而控制单元的主要任务是控制信息处理单元的微操作的顺序。控制单元的实现方式有: 有限状态机、控制寄存器和微代码控制器等。有限状态机在时间尺度上对其控制信号进行离散化控制, 利用状态转移使控制信号在有限状态机的状态节拍控制下变化, 以实现对被控对象的控制。有限状态机设计的关键是如何把一个实际的时序逻辑关系抽象成一个时序逻辑函数,传统的电路图输入法通过直接设计寄存器组来实现各个状态之间的转换, 而用硬件描述语言来描述有限状态机, 往往是通过充分发挥硬件描述语言的抽象建模能力,通过对系统在系统级或寄
[半导体设计/制造]
如何使用STATECAD进行状态机设计实例分析
随着微电子技术的迅速发展,人们对数字系统的需求也在提高。不仅要有完善的功能,而且对速度也提出了很高的要求。对于大部分数字系统,都可以划分为控制单元和数据单元两个组成部分。通常,控制单元的主体是一个有限状态机 ,它接收外部信号以及数据单元产生的状态信息,产生控制信号序列。有限状态机设计的关键是如何把一个实际的时序逻辑关系抽象成一个时序逻辑函数,传统的电路图输入法通过直接设计寄存器组来实现各个状态之间的转换, 而用硬件描述语言来描述有限状态机, 往往是通过充分发挥硬件描述语言的抽象建模能力,通过对系统在系统级或寄存器传输级进行描述来建立有限状态机。EDA 工具的快速发展,使通过CAD快速设计有限状态机自动化成为可能。   传统上
[模拟电子]
如何使用<font color='red'>STATECAD</font>进行<font color='red'>多</font><font color='red'>状态机</font>设计<font color='red'>实例分析</font>
使用ADS移植uC/OS-II实例分析
选择开发工具在嵌入式系统设计中,开发工具的选取是一个重要的考虑因素,通常这是与开发项目的需求和应用背景相关。一般嵌入式开发工具包含用于目标系统的交叉编译器、连接器、调试器以及辅助处理用的二进制文件分析工具等。 目前可以用来编译链接产生 ARM 处理器执行代码的开发工具主要有如下几类:1. ARM 公司提供的 ARM Developer Suite 集成开发环境主要工具有 armasm、armcc、armlink、fromelf 等。 2. GNU 组织提供的 tool chain for arm主要工具有 arm-elf-gcc、arm-elf-gdb、arm-elf-objcopy 等3. Microsoft公司提供的 eMbed
[单片机]
九 ARM9(2440)对nand flash的读写操作-程序实例分析
我相信上一篇文章已经对nand flash的操作有了一定的了解,下面一起看一下程序实例: #include include.h extern void Uart_Printf(char *fmt,...); extern void Uart_Init(int baud); //extern void Uart_Select(int ch); static void InitNandCfg(void) { rGPACON = (rGPACON &~(0x3f 17)) | (0x3f 17); //配置芯片引脚,因为GPACON复位后各位的值为1,所以此步也可没有
[单片机]
小广播
最新模拟电子文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved