当前位置:   article > 正文

Verilog_有限状态机_设计一个简单的数字电路用于电子的报纸售卖机的投币器。 ·假设报纸价格为15分。

设计一个简单的数字电路用于电子的报纸售卖机的投币器。 ·假设报纸价格为15分。

名词解释

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

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

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

代码风格

一段式

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

二段式

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

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

三段式

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

 

自动售报机Verilog实现


设计说明

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

design code 

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/915608
推荐阅读
相关标签
  

闽ICP备14008679号