1. 有限状态机,(英语Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
    有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存器。在有限状态机中,状态寄存器的的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑又可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。
  2.  
  3. 以下是用FSM自由控制的led
    module led_test(clk,led_out);
  4. input clk;
  5. output reg[:] led_out;
  6.  
  7. reg[:] state='b0000;
  8. reg[:] timer='d0;
  9.  
  10. parameter state_0='b0000;
  11. parameter state_1='b0001;
  12. parameter state_2='b0010;
  13. parameter state_3='b0100;
  14. parameter state_4='b1000;
  15.  
  16. always@(posedge clk)
  17. begin
  18.  
  19. case(state)
  20.  
  21. state_0:
  22. if(timer>='d9999_9999)
  23. begin
  24. state<=state_1;
  25. led_out<=state_1;
  26. timer<='d0;
  27. end
  28. else
  29. begin
  30. state<=state;
  31. led_out<=led_out;
  32. timer=timer+'d1;
  33. end
  34.  
  35. state_1:
  36. if(timer>='d9999_9999)
  37. begin
  38. state<=state_2;
  39. led_out<=state_2;
  40. timer<='d0;
  41. end
  42. else
  43. begin
  44. state<=state;
  45. led_out<=led_out;
  46. timer=timer+'d1;
  47. end
  48.  
  49. state_2:
  50. if(timer>='d9999_9999)
  51. begin
  52. state<=state_3;
  53. led_out<=state_3;
  54. timer<='d0;
  55. end
  56. else
  57. begin
  58. state<=state;
  59. led_out<=led_out;
  60. timer=timer+'d1;
  61. end
  62.  
  63. state_3:
  64. if(timer>='d9999_9999)
  65. begin
  66. state<=state_4;
  67. led_out<=state_4;
  68. timer<='d0;
  69. end
  70. else
  71. begin
  72. state<=state;
  73. led_out<=led_out;
  74. timer=timer+'d1;
  75. end
  76.  
  77. state_3:
  78. if(timer>='d9999_9999)
  79. begin
  80. state<=state_4;
  81. led_out<=state_4;
  82. timer<='d0;
  83. end
  84. else
  85. begin
  86. state<=state;
  87. led_out<=led_out;
  88. timer=timer+'d1;
  89. end
  90.  
  91. state_4:
  92. if(timer>='d9999_9999)
  93. begin
  94. state<=state_0;
  95. led_out<=state_0;
  96. timer<='d0;
  97. end
  98. else
  99. begin
  100. state<=state;
  101. led_out<=led_out;
  102. timer=timer+'d1;
  103. end
  104.  
  105. default:
  106. state<=state_0;
  107.  
  108. endcase
  109. end
  110.  
  111. endmodule
  112.  
  113. 以下是用一个按键来控制LED流动的开始,当按下按键10s后LED会开始流动。
  1. module practice(clk,key,led);
  2. input clk; //时钟输入 50Mhz
  3. input key; //按键
  4. output reg[:] led; //4位LED
  5. reg[:] count='d0; //一个计数器,如果编译软件不优化,将生成32个D触发器
  6.  
  7. reg[:] state='d0;
  8. parameter state_0='d0;
  9. parameter state_1='d1;
  10. parameter state_2='d2;
  11. parameter state_3='d3;
  12. parameter state_4='d4;
  13.  
  14. reg[:] key_count; //按键按下的时间控制寄存器
  15.  
  16. always@(posedge clk)
  17. begin
  18.  
  19. case(state)
  20. state_0:
  21. begin
  22. if(key == 'b0)
  23. key_count <= key_count + 'd1;
  24. else
  25. key_count <= 'd0;
  26. if(key_count >= 'd49_999_999)
  27. state <= state_1;
  28. else
  29. state <= state;
  30. led <= 'b0000;
  31. end
  32.  
  33. state_1:
  34. begin
  35. led <= 'b0001;
  36. if(count == 'd4999_9999)
  37. begin
  38. state <= state_2;//1秒后进入下一个状态
  39. count <= 'd0;
  40. end
  41. else
  42. begin
  43. state <= state;
  44. count <= count + 'd1;
  45. end
  46. end
  47.  
  48. state_2:
  49. begin
  50. led <= 'b0010;
  51. if(count == 'd9999_9999)
  52. begin
  53. state <= state_3;//1秒后进入下一个状态
  54. count <= 'd0;
  55. end
  56. else
  57. begin
  58. state <= state;
  59. count <= count + 'd1;
  60. end
  61. end
  62.  
  63. state_3:
  64. begin
  65. led <= 'b0100;
  66. if(count == 'd1_4999_9999)
  67. begin
  68. state <= state_4;//1秒后进入下一个状态
  69. count <= 'd0;
  70. end
  71. else
  72. begin
  73. state <= state;
  74. count <= count + 'd1;
  75. end
  76. end
  77.  
  78. state_4:
  79. begin
  80. led <= 'b1000;
  81. if(count == 'd1_9999_9999)
  82. begin
  83. state <= state_1;//1秒后进入下一个状态
  84. count <= 'd0;
  85. end
  86. else
  87. begin
  88. state <= state;
  89. count <= count + 'd1;
  90. end
  91. end
  92.  
  93. default: //最好不要忘了写default,写别是组合逻辑使用case,不写会有大麻烦
  94. state <= state_1;
  95.  
  96. endcase
  97. end
  98. endmodule

利用简单的有限状态机(FSM)来实现一个简单的LED流水灯的更多相关文章

  1. 第一个FPGA工程—LED流水灯

    这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...

  2. jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)

    JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter ...

  3. 利用COOKIE保存历史浏览商品的一个简单思路

    <?php //如是COOKIE 里面不为空,则往里面增加一个商品ID if (!empty($_COOKIE['SHOP']['history'])){ //取得COOKIE里面的值,并用逗号 ...

  4. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  5. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  6. 鸿蒙系统应用开发之JS实现一个简单的List

    在之前的文章鸿蒙应用开发之怎么更好的远程连接手表模拟器做调试里我运行了一个穿戴设备的应用,利用JS UI实现了一个最简单的HelloWorld. 今天我打算在智慧屏设备上利用豆瓣音乐的接口数据实现一个 ...

  7. 分享一个简单易用的RPC开源项目—Tatala

    http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...

  8. (2)自己写一个简单的servle容器

    自己写一个简单的servlet,能够跑一个简单的servlet,说明一下逻辑. 首先是写一个简单的servlet,这就关联到javax.servlet和javax.servlet.http这两个包的类 ...

  9. 使用PyQt5编写一个简单的GUI程序(pyside 有 pyside-uic 把ui文件转成py文件,pyside-rcc 把qrc文件转成 py文件导入就行了)

    我做Python窗口界面编程时,经常使用PyQt进行设计.这里简单叙述一下使用PyQt5制作一个简单的图形界面的流程 PyQt的简介以及开发环境的搭建在此不多赘述. 1.       打开Qt Des ...

随机推荐

  1. Tomcat的架构

    Tomcat 7.0---Servlet API 3.0---JSP API 2.2---JDK 1.6 一个Tomcat实例,或者服务器(server),是Tomcat容器层次结构中的顶级组件. 只 ...

  2. django+uwsgi+nginx: websock 报502/400

    耽搁了近2个月,终于解决了,主要是nginx/uwsgi/django相关的配置: 一.django工程settings.py,添加 WEBSOCKET_FACTORY_CLASS = "d ...

  3. C# Math.Round()的银行家算法

    可能很多人都跟我一样,都只知道Math.Round()是C#中用来做四舍五入,保留指定小数位的 但实际上它并不是真正的四舍五入,而是银行家算法的四舍六入五取偶 事实上这也是IEEE的规范,因此所有符合 ...

  4. css height属性中的calc方法

    例如父盒子是100%的高度 盒子里面的head部分固定位140px 内容部分始终为剩余的全部高度 height: calc(100% - 140px); 切结"+或-"两边要有空格 ...

  5. elementUI中的loading

    先安装引入 import ElementUI from 'element-ui' import { Loading } from 'element-ui' 在vue的原型链上定义一个打开loading ...

  6. php实现多进程、多线程

    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程使用f ...

  7. 查看PHP指定扩展的版本信息

    命令:php --ri 扩展名

  8. 5.移动端自动化测试-小知识 import和from...import的区别

    一.import   1 import导入的时,需要使用模块名的限定. 举个例子,我们首先创建一个md.py文件,里面有一个函数 2 然后在1.py文件中引用这个函数. 注意,我们需要使用md.的方式 ...

  9. VUE【一、概述】

    早上写的忘了保存..还有很多唠叨的内容...哎又得重新写一遍..想吐槽那个自动保存有卵用.. 今天周一,早上起来继续 由于周六加了一整天班,导致周日无心学习,一天都在玩游戏看电影,到了晚上反而更加空虚 ...

  10. 生成ID之雪花算法

    package com.shopping.test; /** * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0000 ...