有限状态机FSM(自动售报机Verilog实现)

FSM

  • 状态机就是一种能够描述具有逻辑顺序和时序顺序事件的方法。

状态机有两大类:Mealy型和Moore型。

Moore型状态机的输出只与当前状态有关,而Mealy型状态机的输出不仅取决于当前状态,还受到输入的直接控制,并且可能与状态无关。

当使用Verilog来描述一个简单状态机的设计时,应将状态寄存器的控制器的控制和状态机状态里的组合逻辑分开。

  • 分离功能使得在逻辑部分的代码中可以使用阻塞赋值语句

状态更新逻辑包含状态寄存器,不能被外设读取。组合逻辑使用输入和当前状态值来对输出赋值,并改变状态机的下一状态。


同步时序电路的设计方法

  • 逻辑抽象,得出电路的状态转换图或者状态转换表
  • 状态化简
  • 状态分配(状态编码:Binary,Gray,One-Hot)
  • Verilog根据最简状态转换图编程,检查设计的电路能否自启动

四个要素

  • 当前输入
  • 当前状态
  • 下一状态
  • 当前输出值

代码风格

一段式

当前状态、下一状态、当前输出值都写在一个always块中

二段式

当前状态、下一状态、当前输出值写在两个always块中

  • 注意:这样三种组合方式,及有三种方式写这两个always块。

三段式

当前状态、下一状态、当前输出值分别写在各自的always块中,这样需要3个always块。


自动售报机Verilog实现


设计说明

设计一个简单的数字电路用于电子的报纸售卖机的投币器。

  • 假设报纸的价格为15分。
  • 投币器只能接受5分和1角的硬币。
  • 必须提供适当的数目的零钱,投币器不找零。
  • 合法的硬币组合包括1个5分的硬币和1个一角的硬币,3个5分的硬币,1个1角的硬币和1个5分的硬币。2个1角的硬币是合法的,但是投币器不找零。

电路说明

  • 当投入硬币时,一个两位的信号coin[1:0]被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持一个始终周期。
  • 数字电路的输出是一位的。每次当投入硬币总数为15分或者超过15分时,输出信号newspaper变为高电平,并且保持一个时钟周期。售卖机的门也被打开。
  • 可以用一个reset信号复位有限状态机。假设为同步复位。

有限状态机FSM

可以用有限状态机表示该数字电路的功能。

  • 输入:2位,coin[1:0]。没有硬币时,x0 = 2'b00;有一个5分的硬币时,x5 = 2'b01;有一个1角的硬币时,x10 = 2'b10。
  • 输出:1位,newspaper。当newspaper = 1'b1时,打开门。
  • 状态:4个状态。s0 = 0分,s5 = 5分,s10 = 10分,s15 = 15分。

状态机转换图

状态 钱数 输入 硬币[1:0]
s0 0分 x0 2'b00
s5 5分 x5 2'b01
s10 10分 x10 2'b10
s15 15分 - 无关


verilog描述


design code

  1. module vend(
  2. input [1:0] coin,
  3. input clock,
  4. input reset,
  5. output newspaper
  6. );
  7. //声明有限状态机的内部状态
  8. wire [1:0] NEXT_STATE;
  9. reg [1:0] PRES_STATE;
  10. //状态编码
  11. parameter s0 = 2'b00;
  12. parameter s5 = 2'b01;
  13. parameter s10 = 2'b10;
  14. parameter s15 = 2'b11;
  15. //用同步复位、时钟正跳变沿触发的状态触发器
  16. always@(posedge clock)
  17. begin
  18. if(reset == 1'b1)
  19. PRES_STATE <= s0;
  20. else
  21. PRES_STATE <= NEXT_STATE;
  22. end
  23. //组合逻辑
  24. function [2:0] fsm; //状态变化及输出组合逻辑
  25. input [1:0] fsm_coin;
  26. input [1:0] fsm_PRES_STATE;
  27. reg fsm_newspaper;
  28. reg [1:0] fsm_NEXT_STATE;
  29. begin
  30. case(fsm_PRES_STATE)
  31. s0: //状态为s0
  32. begin
  33. if(fsm_coin == 2'b10)
  34. begin
  35. fsm_newspaper = 1'b0;
  36. fsm_NEXT_STATE = s10;
  37. end
  38. else if(fsm_coin == 2'b01)
  39. begin
  40. fsm_newspaper = 1'b0;
  41. fsm_NEXT_STATE = s5;
  42. end
  43. else
  44. begin
  45. fsm_newspaper = 1'b0;
  46. fsm_NEXT_STATE = s0;
  47. end
  48. end
  49. s5: //状态为s5
  50. begin
  51. if(fsm_coin == 2'b10)
  52. begin
  53. fsm_newspaper = 1'b0;
  54. fsm_NEXT_STATE = s15;
  55. end
  56. else if(fsm_coin == 2'b01)
  57. begin
  58. fsm_newspaper = 1'b0;
  59. fsm_NEXT_STATE = s10;
  60. end
  61. else
  62. begin
  63. fsm_newspaper = 1'b0;
  64. fsm_NEXT_STATE = s5;
  65. end
  66. end
  67. s10: //状态为s10
  68. begin
  69. if(fsm_coin == 2'b10)
  70. begin
  71. fsm_newspaper = 1'b0;
  72. fsm_NEXT_STATE = s15;
  73. end
  74. else if(fsm_coin == 2'b01)
  75. begin
  76. fsm_newspaper = 1'b0;
  77. fsm_NEXT_STATE = s15;
  78. end
  79. else
  80. begin
  81. fsm_newspaper = 1'b0;
  82. fsm_NEXT_STATE = s10;
  83. end
  84. end
  85. s15: //状态为s15
  86. begin
  87. fsm_newspaper = 1'b1;
  88. fsm_NEXT_STATE = s0;
  89. end
  90. endcase
  91. fsm = {fsm_newspaper,fsm_NEXT_STATE};
  92. end
  93. endfunction
  94. //每当硬币放入或当前状态改变时,组合逻辑动作
  95. assign {newspaper,NEXT_STATE} = fsm(coin,PRES_STATE);
  96. endmodule

testbench

  1. module vend_tb;
  2. reg clock;
  3. reg reset;
  4. reg [1:0] coin;
  5. wire newspaper;
  6. always #20 clock = ~clock;
  7. initial
  8. begin
  9. clock = 0;
  10. reset = 1;
  11. #100;
  12. reset = 0;
  13. @(posedge clock) coin[1:0] = 2'b00;
  14. @(posedge clock);
  15. @(posedge clock) coin[1:0] = 2'b01;
  16. @(posedge clock);
  17. @(posedge clock) coin[1:0] = 2'b10;
  18. @(posedge clock);
  19. @(posedge clock) coin[1:0] = 2'b10;
  20. @(posedge clock);
  21. @(posedge clock) coin[1:0] = 2'b10;
  22. @(posedge clock);
  23. @(posedge clock) coin[1:0] = 2'b00;
  24. @(posedge clock);
  25. @(posedge clock) coin[1:0] = 2'b01;
  26. @(posedge clock);
  27. @(posedge clock) coin[1:0] = 2'b01;
  28. @(posedge clock);
  29. @(posedge clock) coin[1:0] = 2'b01;
  30. #200 $finish;
  31. end
  32. initial begin
  33. $fsdbDumpfile("test.fsdb");
  34. $fsdbDumpvars();
  35. end
  36. vend u_vend(
  37. .coin(coin),
  38. .clock(clock),
  39. .reset(reset),
  40. .newspaper(newspaper)
  41. );
  42. endmodule

仿真结果




参考资料

[1]. Verilog HDL数字设计与综合(第二版) [美]Simir Palnitkar 著 夏宇闻 等译

[2]. Verilog 数字VLSI设计教程 [美] John Willianms 著 李林 等译

[3]. 有限状态机 FSM 设计

[4]. 有限狀態機FSM coding style整理 (SOC) (Verilog)

有限状态机FSM(自动售报机Verilog实现)的更多相关文章

  1. FSM自动售货机 verilog 实现及 code 细节讲解

    1.题目: 饮料1.5 元, 可投入硬币1 元 0.5 元,输出饮料 零钱 2. 画出状态机. 3.仿真结果:coin=1 --> 0.5 元 coin=2-->1元 4.关键代码分析: ...

  2. Atitit. 有限状态机 fsm 状态模式

    Atitit. 有限状态机 fsm 状态模式 1. 有限状态机 1 2. "状态表"和"状态轮换表" 1 3. 有限状态机概念(状态(State)事件(Even ...

  3. 玩转华为物联网IoTDA服务系列三-自动售货机销售分析场景示例

    场景简介 通过收集自动售货机系统的销售数据,EI数据分析售货销量状况. 该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,应用侧可以到物联网平台订阅设备侧变化的通知,用户可以在控制台或通 ...

  4. cocos2d-x 游戏开发之有限状态机(FSM) (四)

    cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...

  5. [原创][FPGA]有限状态机FSM学习笔记(一)

    1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...

  6. 09自动售货机综设实验(含按键消抖,led和状态机)

    一设计功能 1.上次状态机的练习 2这次自动售货机综设 (一)对比两次的售货机 上次售货机的关键是画出状态转移图.明确输入分几种,输出是啥,有哪些状态.如下图所示 (二)系统或综合设计的经验: 既然这 ...

  7. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  8. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

  9. AOI自动光学检测机技术在电路板检查中的应用

    1.简述 AOI技术在许多不同的制造业领域使用,自从电子影像技术开始发展,就被各种人利用在不同的应用领域.大家最熟悉的数字相机.数字摄影机是大家生活中最常用到的器材之一,而工业产品的生产也大量使用这些 ...

随机推荐

  1. C#与.Net Framework的各种版本和联系

    C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序设计语言.并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新 ...

  2. mssql的holdlock锁跟索引的关系

    表锁tablock是会给表所有数据附加共享锁,但是只是当前语句有效,语句执行完毕,锁释放,而不会持续到事务结束,而tablockX表锁是持续到事务结束的锁 holdlock锁,锁定的范围会根据wher ...

  3. PLSQL远程连接到Oracle服务器

    这里只介绍一种远程连接服务器方法,即本机安装了Oracle客户端和PLSql工具,服务器安装在虚拟机或者另一台电脑上 1.打开Oracle客户端的Net Manager,选择Oracle Net配置— ...

  4. JavaScript--声明提前

    声明提前(hoist): 在正式执行程序前,都会将所有var声明的变量和function声明的函数提前到*当前作用域*的顶部集中创建. 但是,赋值留在原地. console.log(a);//unde ...

  5. 数据类型的转换String

    x.toString(): 无法转换null和undefined 不过String()却是万能的,其中的原理如下 function String(x){ if(x===undefined){ retu ...

  6. Python文件之----JSON

    #coding=utf-8import json def writeJSON(filaName="test.json"): f=open(filaName, "wb&qu ...

  7. [FindBugs分析记录]Class defines clone() but doesn't implement Cloneable

    官网解释: This class defines a clone() method but the class doesn't implement Cloneable. There are some ...

  8. JQuery语法总结和注意事项

    1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...

  9. 初涉JavaScript模式 (12) : 沙箱模式

    引子 上一篇说了模块模式,而对于其中的命名空间模式其实也是有着一些问题,比如每添加一个模块或则深入叠加都会导致长命名,并且对于多个库的不同版本同时运行,一不小心就会污染全局标识,而这两天也发现了JSe ...

  10. [HTML5 Canvas学习]使用颜色和透明度

    在canvas中使用颜色和透明度,通过context的strokeStyle和fillStyle属性设置,strokeStyle和fillStyle的值可以是任意有效的css颜色字串.可以用RGB.R ...