在写状态机时,经常会有检测输入信号波形的情况,这种情况下,如果采用三段式状态机书写,则需要通过穷举法把输入信号所有可能存在的情况书写出来,在检测一到两个周期的输入信号时工作量不会很大,但是在检测多于三个信号时,工作量将会几何倍数增长,空说的话会很抽象,不如参考下这个例子:

Consider a finite state machine with inputs s and w. Assume that the FSM begins in a reset state called A, as depicted below. The FSM remains in state A as long as s = 0, and it moves to state B when s = 1. Once in state B the FSM examines the value of the input w in the next three clock cycles. If w = 1 in exactly two of these clock cycles, then the FSM has to set an output z to 1 in the following clock cycle. Otherwise z has to be 0. The FSM continues checking w for the next three clock cycles, and so on. The timing diagram below illustrates the required values of z for different values of w.
Use as few states as possible. Note that the s input is used only in state A, so you need to consider just the w input.
翻译:考虑一个有输入s和w的有限状态机。假设FSM以一种称为a的复位状态开始,如下所示。当s = 0时,FSM一直处于状态A;当s = 1时,FSM进入状态B。一旦进入状态B, FSM在接下来的三个时钟周期内检查输入的w的值。如果在两个时钟周期中w = 1,那么FSM必须在接下来的时钟周期中设置输出z为1。否则z等于0。FSM继续检查w,以确定接下来的三个时钟周期,以此类推。下面的时序图说明了不同w值所需要的z值。
使用尽可能少的州。注意,s输入只在状态A中使用,所以你只需要考虑w输入。
图1.最终结果的波形
图2.状态机示意图

如果采用最广泛的三段式状态机,则需要穷举出所有的状态,如下所示:

我已经看的头大了,如果你说我就是要写三段式状态机,就是玩,那我也没辙了,当然还有更好的方法,就是借鉴fifo的思路,搭建一个建议的先进先出的小模块来装载这三个时钟周期的w信号,fifo的原理简单的说来就是下面这张图:

比较爽的是,这个fifo不需要读指针,写指针,只需要其中的两个数据为1即可输出为1,因此在这个小模块的基础上,加上一个计数变量,每三个时钟周期置零一次,从而完成检查波形,其完整的代码如下所示:

module top_module (input clk,input reset,   // Synchronous resetinput s,input w,output z
);localparam  A  = 1'b0,B  = 1'b1;  reg [1:0] state,next_state;reg [2:0] data;reg [1:0] cnt;always@(posedge clk)beginif(reset)state <= A;else state <= next_state; endalways@(*)begincase (state)A: next_state = s?B:A;B: next_state = B;endcaseendalways@(posedge clk)beginif(reset)data <= 3'b0;else case (next_state)      A: data <= 3'b0;B: begindata[0] <= w;data[1] <= data[0];data[2] <= data[1];        //  loop assignment end endcaseendalways@(posedge clk)beginif(reset)cnt <= 2'h0;else if(state == A)cnt <= 2'h0;else if(cnt==2'h3&&(state == B))cnt <= 2'h1;else cnt <= cnt+2'h1;endassign z = ((data==3'b011)|(data==3'b101)|(data==3'b110))&&(cnt==2'h3);  endmodule

【小罗的hdlbits刷题笔记5】基于fifo思想的fsm设计(Exams/2014 q3fsm)相关推荐

  1. 【小罗的hdlbits刷题笔记2】补码运算中溢出的问题(Exams/ece241 2014 q1c)

    关于补码运算中进位溢出的问题及延伸,hdlbits中Exams/ece241 2014 q1c给出了很好的解释,首先来看问题: Assume that you have two 8-bit 2's c ...

  2. 【小罗的hdlbits刷题笔记3】从Edgedetect对阻塞赋值和非阻塞赋值的思考

    今天题目刷到Edgedetect时,发现根本看不懂这个题目描述的是什么,先给大家放题来体会一下: For each bit in an 8-bit vector, detect when the in ...

  3. 【小罗的hdlbits刷题笔记4】从lemming4中的有限状态机debug过程中的一些感悟

    心累,debug过程就是很烦,先说一下结论:设置变量时一定要注意位宽,否则会出现截位导致输出结果出现bug 废话不多说,先上问题 *Although Lemmings can walk, fall, ...

  4. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  5. 师兄刷题笔记、算法小抄、面试突击版必备资源,帮你走上人生巅峰

    前言 最近有很多朋友问我刷题.面试有没有什么好的资源.今天就给大家找了三个棒的开源资源,内容非常硬核,很多人靠着它进了大厂. 不绕弯子,三个分别是谷歌师兄<谷歌大佬的刷题笔记>,东哥< ...

  6. leetcode刷题java、c++、go语言三合一版本 谷歌师兄的刷题笔记、东哥的算法小抄、 Guide哥的Java面试突击版

    不久前火爆 GitHub 的 LeetCode 中文刷题手册,分享给大家,让正在找工作的朋友能够快速找到心仪的offer! <LeetCode Cookbook>目前已经收录了 520 道 ...

  7. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  8. 赞!Google 资深软件工程师 LeetCode 刷题笔记首次公开

    有人说写代码就像我们平时开车,仅凭经验你就可以将车开走:但当有一天,这辆车出问题跑不起来的时候,你不懂汽车的运行机制,你要怎么排除和解决问题?所以拥有扎实的数据结构和算法,才能开好编程这辆车. 作为程 ...

  9. 《编程能力基础》刷题笔记(41 题)

    <编程能力基础>刷题笔记 1. 单调数列 题解:递归.模拟.API 2. 实现 strStr() 题解:API.暴力.滑动窗口 3. 平衡二叉树 题解:迭代 4. 重复的子字符串 题解:模 ...

最新文章

  1. 洛谷P1036选数(素数+组合数)
  2. 【Redis】Redis学习(三) Redis 主从模式详解
  3. 指数随机变量 泊松过程跳_《常见随机过程》(一)
  4. SSM综合练习功能介绍与项目演示
  5. Python--三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数...
  6. java 枚举工厂_在Java中使用枚举工厂,最佳做法?
  7. pytorch tensor 初始化_PyTorch简明笔记[1]-Tensor的初始化和基本操作
  8. iOS开发之通知中心(NSNotificationCenter)
  9. C++语言基础 —— 顺序结构
  10. python创建虚拟环境_Python学习笔记:创建Python开发Web程序的虚拟环境
  11. Java多线程学习总结(5)——乐观锁和悲观锁的基本概念、实现方式(含实例)、适用场景及常见面试题
  12. 苹果编程套餐更新,新增创意课程,十一拿起吃灰的iPad学起来!
  13. MASM32编程将TimeStamp/UTC转换为具体日期时间的几个有用函数代码
  14. h5后台登录模板_微信公众号模板消息群发工具如何操作?
  15. labview获取窗口句柄_API---如何获得窗口句柄(HWND)
  16. win7 计算器 android,强大的Win7计算器
  17. Datatable转为ListT / DataRow转为实体类对象
  18. centos恢复图形界面_centos7恢复图形界面_centos7没有图形界面
  19. Forexclub:澳元陷入美元漩涡
  20. 开发软件需要学习什么?

热门文章

  1. Docker启动报错:Job for docker.service failed because the control process exited with error code. See “sy
  2. 上海迪士尼度假区将推出一系列节庆活动和全新“萌聚达菲月”
  3. windows应用小技巧
  4. 大数据产业 能否带领内蒙古跨越资源陷阱?
  5. 2022年端午二三事小记
  6. CFRP加固工字钢梁ABAQUS建模与分析
  7. DCP打包中生成KDM所需要的CA证书
  8. 从0开始学git 第8节:git status 有什么用
  9. 对java中public、static的理解
  10. 隐藏服务器端信息X-Powered-By: Servlet/3.0