当前位置:   article > 正文

FPGA开发——状态机的使用

FPGA开发——状态机的使用

一、概述

我们在使用FPGA进行开发的过程当中,实现一个东西用得最多的实现方法就是状态机的实现方法,用一句话总结就是万物皆可状态机,这和我们在学习Linux时常说的在Linux中万物都是文件差不多,这里就主要就是突出状态机的应用范围很广。

二、相关理论

1、概念

2、状态机编码方式

在进行状态机编码时我们一般采用独热码进行编码,独热码想对于自然二进制编码和格雷码编码来说:组合逻辑较少,不易产生毛刺,使用范围广。缺点就是触发器个数较多,(二进制编码毛刺大,格雷码逻辑组合较多)

3、描述方式

在进行代码编写时我们通常采用三段式的编码方式进行编写。

三、代码编写

这里我们就简单使用状态机描述输入多个二进制数,当检测到1011时输出一个标志位的过程。

1、状态转移图

2、设计文件的编写

  1. module test (
  2. input clk ,
  3. input rst_n ,
  4. input din ,
  5. output reg dout
  6. );
  7. //参数定义
  8. parameter IDLE =5'b00001,//0
  9. S1 =5'b00010,//检测到1
  10. S2 =5'b00100,//检测到10
  11. S3 =5'b01000,//检测到101
  12. S4 =5'b10000;//检测到1011
  13. //内部信号
  14. reg [5:0] state_c ;//现态
  15. reg [5:0] state_n ;//次态
  16. //时序逻辑电路描述状态转移
  17. always @(posedge clk or negedge rst_n)begin
  18. if(!rst_n)
  19. state_c = IDLE;
  20. else
  21. state_c = state_n;
  22. end
  23. //使用组合逻辑描述状态转移条件
  24. always @(*)begin
  25. case (state_c)
  26. IDLE :begin//0
  27. if(din==1)
  28. state_n = S1;
  29. else
  30. state_n = IDLE;
  31. end
  32. S1 :begin//1
  33. if(din==0)
  34. state_n = S2;
  35. else
  36. state_n = S1;
  37. end
  38. S2 :begin//10
  39. if(din==1)
  40. state_n = S3;
  41. else
  42. state_n = IDLE;
  43. end
  44. S3 :begin//101
  45. if(din==1)
  46. state_n = S4;
  47. else
  48. state_n = S2;
  49. end
  50. S4 :begin//1011
  51. state_n = IDLE;
  52. end
  53. default: state_n = IDLE;
  54. endcase
  55. end
  56. //描述输出结果
  57. always @(posedge clk or negedge rst_n)begin
  58. if(!rst_n)
  59. dout<=0;
  60. else if(state_c ==S4)
  61. dout<=1;
  62. else
  63. dout<=0;
  64. end
  65. endmodule

3、测试文件的编写

  1. //定义时间尺度
  2. `timescale 1ns/1ns
  3. module test_tb ;
  4. //输入信号定义
  5. reg clk ;
  6. reg rst_n;
  7. reg din ;
  8. wire dout ;
  9. //模块例化
  10. test test_inst(
  11. /*input */ .clk (clk ),
  12. /*input */ .rst_n (rst_n),
  13. /*input */ .din (din ),
  14. /*output reg */ .dout (dout )
  15. );
  16. //时钟
  17. parameter CLK_CLY =20;
  18. initial clk=0;
  19. always #(CLK_CLY/2) clk=~clk;
  20. //复位
  21. initial begin
  22. //初始化
  23. rst_n= 1'b0;
  24. #(CLK_CLY*2);
  25. #5;
  26. rst_n=1'b1;
  27. end
  28. //激励
  29. initial begin
  30. din= 1'b0;
  31. #(CLK_CLY*3);
  32. #5;
  33. repeat (30)begin
  34. din= $random;
  35. #(CLK_CLY*1);
  36. end
  37. $stop;
  38. end
  39. endmodule

四、波形仿真

在波形图中我们可以看到当检测到输入的二进制数与状态转移条件就会发生变化,当检测到1011时,输出会产生一个高电平,代表检测到数据。通过总体观察,波形图中状态之间的转移和我们在前面画的状态转移条件一致没说明我们的状态机设置成功。 

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

闽ICP备14008679号