原文地址 http://www.cnblogs.com/yuphone/archive/2010/05/12/1733867.html#

感谢亚锋前辈的精彩文章.

本文借一小例,来示范在FSM中如何延时。

案例

(1)fsm_with_delay_demo.v

001 module fsm_with_delay_demo(
002   input      CLOCK_50,
003   input      RST_N,
004    
005   output reg LED
006 );
007  
008 //++++++++++++++++++++++++++++++++++++++
009 // 定时器1 开始
010 // 时长:1秒
011 //++++++++++++++++++++++++++++++++++++++
012 parameter TIMER1_VAL = 50_000_000;      // 50M/50M = 1s
013  
014 reg        timer1_enable;
015 reg [25:0] timer1_cnt;
016 wire       timer1_done;
017  
018 always @(posedge CLOCK_50)
019   if (~timer1_enable)
020     timer1_cnt <= 0;
021   else if (~timer1_done)
022     timer1_cnt <= timer1_cnt + 1'b1;
023      
024 assign timer1_done = (timer1_cnt == TIMER1_VAL - 1);
025 //--------------------------------------
026 // 定时器1 结束
027 //--------------------------------------
028  
029  
030 //++++++++++++++++++++++++++++++++++++++
031 // 定时器2 开始
032 // 时长:4秒
033 //++++++++++++++++++++++++++++++++++++++
034 parameter TIMER2_VAL = 200_000_000;     // 200M/50M = 4s
035  
036 reg        timer2_enable;
037 reg [27:0] timer2_cnt;
038 wire       timer2_done;
039  
040 always @(posedge CLOCK_50)
041   if (~timer2_enable)
042     timer2_cnt <= 0;
043   else if (~timer2_done)
044     timer2_cnt <= timer2_cnt + 1'b1;
045      
046 assign timer2_done = (timer2_cnt == TIMER2_VAL - 1);
047 //--------------------------------------
048 // 定时器2 结束
049 //--------------------------------------
050  
051  
052 //++++++++++++++++++++++++++++++++++++++
053 // 状态机部分 开始
054 //++++++++++++++++++++++++++++++++++++++
055 parameter S0 = 0;
056 parameter S1 = 1;
057  
058  
059 reg [5:0] current_state, next_state;    // 现态、次态
060  
061 always @ (posedge CLOCK_50, negedge RST_N)
062 begin:fsm_always_block1
063   if (!RST_N)
064     current_state <= S1;
065   else
066     current_state <= next_state;
067 end
068  
069 // 根据条件转移状态,并给出相应逻辑
070 always @ *
071 begin:fsm_always_block2
072   /* 用户变量初始化  开始*/
073   LED           = 1'b0;
074   /* 用户变量初始化  结束*/
075    
076   /* 清定时器使能 开始 */
077   timer1_enable = 1'b0;
078   timer2_enable = 1'b0;
079   /* 清定时器使能 结束 */
080   case (current_state)
081     S0 :
082       begin
083         timer1_enable = 1;              // 使能定时器1
084          
085         /* 用户代码  开始*/
086         LED = 1'b0;
087         /* 用户代码  结束*/
088          
089         if (timer1_done /* && 用户条件 */)
090           next_state = S1;
091         else
092           next_state = S0;
093       end
094     S1 :
095       begin
096         timer2_enable = 1;              // 使能定时器1
097          
098         /* 用户代码  开始*/
099         LED = 1'b1;
100         /* 用户代码  结束*/
101          
102         if (timer2_done /* && 用户条件 */)
103           next_state = S0;
104         else
105           next_state = S1;
106       end 
107   endcase
108 end
109 //--------------------------------------
110 // 状态机部分 结束
111 //--------------------------------------
112  
113 endmodule

(2)QII综合的FSM

图1 QII综合的FSM

(3)实验现象

该例中,FSM有两个状态,S0持续1s,S1持续4s,然后循环交替。

假设案例中的LED是送1亮,送0灭,那么LED灭1秒亮4秒,如此循环交替。

分析

众所周知,FSM有三种写法:1个always块;两个always块;三个always块。其中1个always块的fsm,由于各种弊端,为大家所不齿。然而加入定时器这一动作在3个always块又不能很好地实现,于是退而求其次,使用2个always块的fsm。

这样一来,我们只需在第一个always块内实现现次态交替转变即可。在第二个always块内,根据状态迁移,来写各状态的逻辑。由于定时器的加入,而其使能又是reg变量,所以在初始化时,必须将使能清零,以免无法实现定时效果。在各状态中,如果只需持续一个clock,则无需使能定时器。倘若需要持续一段时间,使能定时器即可,然后等定时完毕,再转移状态;未定时完毕,则保持当前状态。至于其他的用户条件,可与定时完毕标志逻辑与在一起,以实现所需功能。

转载于:https://www.cnblogs.com/whut-xxxy/archive/2011/05/21/2052652.html

[转载].怎样在有限状态机中延时相关推荐

  1. 【转载】VMware vSphere中三种磁盘规格的解释说明

    在VMware vSphere中,不管是以前的5.1版本,或者是现在的6.5版本,创建虚拟机时,在创建磁盘时,都会让选择磁盘的置备类型,如下图所示,分为: 厚置备延迟置零 厚置备置零 Thin Pro ...

  2. Web服务中延时对QoE(体验质量)的影响

    S. Egger等人在论文<WAITING TIMES IN QUALITY OF EXPERIENCE FOR WEB BASED SERVICES>中,研究了Web服务中延时对主观感受 ...

  3. [转载]在Vmware ESXI中安装群晖Synology DSM 5.0 (4528)

    转载 在Vmware ESXI中安装群晖Synology DSM 5.0 (4528) 文件准备 Vmware ESXi用户安装需要的文件 NB_x64_5032_DSM_50-4528_Xpenol ...

  4. c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)

    能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...

  5. Linux中延时/暂停函数(sleep/usleep/nanosleep/select)的比较、底层实现说明

    本来只是要搞清楚Linux下如何实现延时和暂停,但无意中看到一篇文章介绍了其实现,帮自己窥得一点底层原理. 知其然还要知其所以然,但自己没有这个储备和能力来研究Linux内核实现,特地转载留存. 1. ...

  6. python中延时函数_详解python中实现延时回调普通函数

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...

  7. 艾伟_转载:探索.Net中的委托

    废话 我本来以为委托很简单,本来只想简简单单的说说委托背后的东西,委托的使用方法.原本只想解释一下那句:委托是面向对象的.类型安全的函数指针.可没想到最后惹出一堆的事情来,越惹越多,罪过,罪过.本文后 ...

  8. [转载]在Eclipse CDT中编译含有多个main函数的项目

    在Eclipse CDT中编译含有多个main函数的项目 在C/C++项目中有时候会需要在一个项目中包含多个main函数.在Visual Studio中,这种情况可以由一个解决方案下带多个项目来解决, ...

  9. 【转载】在对话框中加入属性页

    原文地址:http://www.vckbase.com/document/viewdoc/?id=398 在对话框中加入属性页 作者:黄晨量 下载本文全部源代码 当一个基于对话框的程序中有相当多的控件 ...

最新文章

  1. 记在两周Android实训之后
  2. java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)
  3. pat根据中序遍历和先序遍历_算法题399:从前序与中序遍历序列构造二叉树
  4. zabbix邮件发不出去
  5. 修炼一名软件工程师的职业水准
  6. ios pull代码不提示成功_pullRefresh ios版问题 跪求大神帮助啊
  7. 依赖反转原理,IoC容器和依赖注入:第4部分
  8. 8运行不了_民航局暂停运行737max8,分析可能因为“它”导致飞机俯冲坠落
  9. python-学生管理系统--8-排序功能模块
  10. atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
  11. Adobe 软件清理工具AdobeCreativeCloudCleanerTool.exe
  12. 助焊剂各成分作用浅析
  13. Web Api Token验证
  14. 全国地理信息资源目录服务系统
  15. cpp(c++)基础
  16. java菱形_Java 之 菱形
  17. 对于CRM之于现代化企业的影响以及作用的分析
  18. 锐捷密码忘了!-锐捷密码查看器
  19. 软件工程使用的编程语言
  20. Project:解决问题:在Microsoft project2016中如何编辑一周七天工作日

热门文章

  1. 久谦咨询python笔试题目_【久谦咨询面试|面试题】-看准网
  2. java中的char可以存储汉字吗?
  3. @Async注解配合@EnableAsync注解使用
  4. springMVC详解以及注解说明
  5. java.util.concurrent.locks.Lock 接口 源码
  6. elasticsearch中文分词器ik-analyzer安装
  7. Linux下安装scikit-learn
  8. 用vue做项目的一些总结
  9. [译][Tkinter 教程02] Message 控件
  10. 135、JS和Android交互范例