[转载].怎样在有限状态机中延时
原文地址 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
[转载].怎样在有限状态机中延时相关推荐
- 【转载】VMware vSphere中三种磁盘规格的解释说明
在VMware vSphere中,不管是以前的5.1版本,或者是现在的6.5版本,创建虚拟机时,在创建磁盘时,都会让选择磁盘的置备类型,如下图所示,分为: 厚置备延迟置零 厚置备置零 Thin Pro ...
- Web服务中延时对QoE(体验质量)的影响
S. Egger等人在论文<WAITING TIMES IN QUALITY OF EXPERIENCE FOR WEB BASED SERVICES>中,研究了Web服务中延时对主观感受 ...
- [转载]在Vmware ESXI中安装群晖Synology DSM 5.0 (4528)
转载 在Vmware ESXI中安装群晖Synology DSM 5.0 (4528) 文件准备 Vmware ESXi用户安装需要的文件 NB_x64_5032_DSM_50-4528_Xpenol ...
- c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)
能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...
- Linux中延时/暂停函数(sleep/usleep/nanosleep/select)的比较、底层实现说明
本来只是要搞清楚Linux下如何实现延时和暂停,但无意中看到一篇文章介绍了其实现,帮自己窥得一点底层原理. 知其然还要知其所以然,但自己没有这个储备和能力来研究Linux内核实现,特地转载留存. 1. ...
- python中延时函数_详解python中实现延时回调普通函数
这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...
- 艾伟_转载:探索.Net中的委托
废话 我本来以为委托很简单,本来只想简简单单的说说委托背后的东西,委托的使用方法.原本只想解释一下那句:委托是面向对象的.类型安全的函数指针.可没想到最后惹出一堆的事情来,越惹越多,罪过,罪过.本文后 ...
- [转载]在Eclipse CDT中编译含有多个main函数的项目
在Eclipse CDT中编译含有多个main函数的项目 在C/C++项目中有时候会需要在一个项目中包含多个main函数.在Visual Studio中,这种情况可以由一个解决方案下带多个项目来解决, ...
- 【转载】在对话框中加入属性页
原文地址:http://www.vckbase.com/document/viewdoc/?id=398 在对话框中加入属性页 作者:黄晨量 下载本文全部源代码 当一个基于对话框的程序中有相当多的控件 ...
最新文章
- 记在两周Android实训之后
- java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)
- pat根据中序遍历和先序遍历_算法题399:从前序与中序遍历序列构造二叉树
- zabbix邮件发不出去
- 修炼一名软件工程师的职业水准
- ios pull代码不提示成功_pullRefresh ios版问题 跪求大神帮助啊
- 依赖反转原理,IoC容器和依赖注入:第4部分
- 8运行不了_民航局暂停运行737max8,分析可能因为“它”导致飞机俯冲坠落
- python-学生管理系统--8-排序功能模块
- atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
- Adobe 软件清理工具AdobeCreativeCloudCleanerTool.exe
- 助焊剂各成分作用浅析
- Web Api Token验证
- 全国地理信息资源目录服务系统
- cpp(c++)基础
- java菱形_Java 之 菱形
- 对于CRM之于现代化企业的影响以及作用的分析
- 锐捷密码忘了!-锐捷密码查看器
- 软件工程使用的编程语言
- Project:解决问题:在Microsoft project2016中如何编辑一周七天工作日
热门文章
- 久谦咨询python笔试题目_【久谦咨询面试|面试题】-看准网
- java中的char可以存储汉字吗?
- @Async注解配合@EnableAsync注解使用
- springMVC详解以及注解说明
- java.util.concurrent.locks.Lock 接口 源码
- elasticsearch中文分词器ik-analyzer安装
- Linux下安装scikit-learn
- 用vue做项目的一些总结
- [译][Tkinter 教程02] Message 控件
- 135、JS和Android交互范例