以前我写状态机都是一段式状态机,虽然目前因为项目都很小,所以一段式没觉得有什么不对劲的,但是为了以后的需要,还是转向三段式状态机吧。

三段式是哪三段呢?

1.将“新状态”赋给“当前状态”,非阻塞赋值

2.产生下一个“新状态”(可能包含组合逻辑),阻塞赋值,激励条件为当前状态

3.根据“当前状态”产生输出(可能包含组合逻辑),非阻塞赋值

以一个只有两个状态的路口红绿灯为例写一个三段式状态机:

要用到的重要寄存器:

parameter s1 = 1'b0, s2 = 1'b1;  //第一个状态red1和blue2亮,第二个状态red2和blue1亮
output reg state_cur;  //现在状态
output reg state_next;  //下一个状态output reg [3:0] cnt;  //计数器到10
reg cnt_flag;  //计时器计满指示

三段式因为有当前状态和新状态之分,所以要两个寄存器来分别存储,因为红绿灯要使用计数器控制时间,故设置了计数器

第一段:将“新状态”赋给“当前状态”,非阻塞赋值

always@(posedge clk or negedge rst_n)  //第一段为单纯次态寄存器迁移到现态寄存器,改变现在状态
beginif(!rst_n)state_cur <= s1;elsestate_cur <= state_next;
end

第二段:产生下一个“新状态”,阻塞赋值,注意激励条件

always@(state_cur or rst_n or cnt_flag)  //第二段为状态转移条件判断,改变下一个状态beginif(!rst_n)state_next = s2;elsebegincase(state_cur)s1:beginif(cnt_flag)state_next = s2;elsestate_next = s1;ends2:beginif(cnt_flag)state_next = s1;elsestate_next = s2;enddefault:state_next = s1;endcaseendend

注意激励条件不再是时钟上升沿,否则会出现一直改变状态的死循环错误

第三段:根据“当前状态”产生输出

always@(posedge clk or negedge rst_n)  //第三段为现在状态和输出的关系beginif(!rst_n)beginred1 = 0;blue1 = 0;red2 = 0;blue2 = 0;endelsebegincase(state_cur)s1:beginred1 = 1;blue1 = 0;red2 = 0;blue2 = 1;ends2:beginred1 = 0;blue1 = 1;red2 = 1;blue2 = 0;enddefault:beginred1 = 0;blue1 = 0;red2 = 0;blue2 = 0;endendcaseendend

【重拾FPGA】三段式状态机的路口红绿灯相关推荐

  1. 重迭式三段式状态机序列检测器-检测10110110

    重迭式三段式状态机序列检测器-检测10110110 要求:序列检测器 clk input clock input rst_n input asynchronous reset, low active ...

  2. fpga时序逻辑(三段式状态机模板、rom实现、边沿检测)

    目录 VL21 根据状态转移表实现时序电路 VL22 根据状态转移图实现时序电路 VL23 ROM的简单实现 VL24 边沿检测 VL21 根据状态转移表实现时序电路 题目分析: 1.使用三段式状态机 ...

  3. 三段式状态机_Verilog实战篇(5)——FIFO amp; 状态机

    今天的暑期培训课依旧是由邸志雄老师主讲:FIFO基本原理及状态机的编写和应用. 下面先说一下FIFO:     一.FIFO 常见参数主要有:   1. FIFO的宽度:即 FIFO 一次读写操作的数 ...

  4. 三段式状态机_FPGA笔试题——序列检测(FSM状态机)

    FSM有限状态机,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见. (1)了解状态机:什么是摩尔型状态机,什么是米利型状态机,两者的区别是什么?一段式.二段式.三段式状态机的 ...

  5. DSP嵌入式C语言状态机,三段式状态机描述及模版

    三段式状态机描述及模版 [复制链接] 本帖最后由 Aguilera 于 2018-11-10 20:23 编辑 时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为 ...

  6. 三段式状态机-FSM

    三段式代码多,但是有时钟同步,延时少,组合逻辑跟时序逻辑分开并行出错少. (1)同步状态转移 (2)当前状态判断接下来的状态 (3)动作输出 如果程序复杂可以不止三个always   .always ...

  7. 一段式、两段式以及三段式状态机(FSM)设计实例

    一段式.二段式以及三段式状态机(FSM)设计实例 状态机(FSM)分类 状态转移的三种编码方式 一段式.两段式状态机(FSM)区别 vivado与modelsim联调显示状态机 设计实例 状态转移图 ...

  8. 基于verilog的三段式状态机

    三段式状态机的优势:三段式描述方法与一段式和两段式状态机描述相比,虽然代码结构复杂了一些,但是换来的优势是使FSM(Finite State Machine)做到了同步寄存器输出,消除了组合逻辑输出的 ...

  9. 小梅哥三段式状态机按键消抖改写

    小梅哥三段式状态机按键消抖改写 小梅哥资料中按键消抖部分是用一段式.二段式状态机写的.我用三段式状态机改写了一下,仿真和板载测试通过. 代码记录如下: module key_filter1(input ...

  10. SJA1000 CAN总线verilog写的SJA1000 CAN总线控制器。 程序使用三段式状态机,对于语句均有箱子的中文注释

    SJA1000 CAN总线verilog写的SJA1000 CAN总线控制器. 程序使用三段式状态机,对于语句均有箱子的中文注释,同时还有相关的文档说明. 可直接拿来使用,同时适合新手学习规范写作代码 ...

最新文章

  1. 【堆叠抓取+深度学习】基于深度学习+PPO深度强化学习的堆叠物体抓取算法的MATLAB仿真
  2. 判断程序是否运行在虚拟机中的代码
  3. Scala入门到精通——第八节 包和引入
  4. 几种简单的素数判定法(转)
  5. 【转载】interpolation(插值)和 extrapolation(外推)的区别
  6. 机器人总动员中的小草_机器人总动员读后感
  7. python time库_python中time库的实例使用方法
  8. ASP.NET2.0的快速入门站点
  9. 《编写高质量代码:改善Java程序的151条建议》读书笔记
  10. pycharm如何上传代码到github
  11. markdown语法中一些数学符号怎么打
  12. ad如何计算电路板的pin数量_PCB厂一到八层电路板的叠层设计方式
  13. 【金融市场基础知识】——中国的金融体系(二)
  14. stm32h743单片机嵌入式学习笔记8-avi视频解码
  15. 商业银行vh是哪个银行的简称_各个银行缩写是什么
  16. Springboot开启APR模式
  17. 【群晖NAS】真·免费内网穿透方案 及踩坑合集
  18. 网页上打印PDF文件
  19. L298N电机驱动的使用
  20. 安卓模拟器自动抓取某红书晒单数据

热门文章

  1. houseprice_analysis_广州房子租售比分析(中)
  2. java中注释如何换行,java注释中空格和换行符的处理
  3. 中国天气网城市代码爬取
  4. 【易语言界面开发系列教程之(EX_UI使用系列教程(12)--EX组件(列表框EX))】
  5. Android开发,MapBox地图详细介绍、使用、部分功能实现(初始化、标记、定位、styleurl)
  6. 图像的上采样与下采样
  7. 嵌入式linux UBoot移植篇
  8. idea格式化代码小技巧
  9. oracle库sql根据拼音查汉字,根据拼音首字母模糊查询数据库中文字段
  10. AI为传统零售行业赋能,自助收银推动无人零售发展