【 FPGA 】序列检测器的Mealy状态机实现

举报
李锐博恩 发表于 2021/07/15 03:08:57 2021/07/15
【摘要】 上篇博文讲了使用Moore状态机来设计一个序列检测器:序列检测器的Moore状态机实现 原理一致,这里只不过采用了Mealy状态机实现,快速给出: 状态转移图如下:被检测序列为1101,也就是说,如果出现1101序列,则输出为1,否则输出为0。 Verilog HDL代码为: `timescale 1ns / 1ps//// Company: // Enginee...

上篇博文讲了使用Moore状态机来设计一个序列检测器:序列检测器的Moore状态机实现

原理一致,这里只不过采用了Mealy状态机实现,快速给出:

状态转移图如下:被检测序列为1101,也就是说,如果出现1101序列,则输出为1,否则输出为0。

Verilog HDL代码为:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2019/01/04 20:34:06
  7. // Design Name:
  8. // Module Name: seq_det_mealy
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module seq_det_mealy(
  22. input clk,
  23. input reset,
  24. input din,
  25. output reg dout
  26. );
  27. localparam [1:0]
  28. s0 = 2'b00,
  29. s1 = 2'b01,
  30. s2 = 2'b10,
  31. s3 = 2'b11;
  32. reg [1:0] current_state,next_state;
  33. always @(posedge clk, posedge reset)
  34. begin
  35. if(reset)
  36. current_state <= s0;
  37. else
  38. current_state <= next_state;
  39. end
  40. always @ *
  41. begin
  42. case(current_state)
  43. s0:
  44. if(din == 1'b1) next_state = s1;
  45. else next_state = s0;
  46. s1:
  47. if(din == 1'b1) next_state = s2;
  48. else next_state = s1;
  49. s2:
  50. if(din == 1'b0) next_state = s3;
  51. else next_state = s2;
  52. s3: next_state = s0;
  53. default: next_state = s0;
  54. endcase
  55. end
  56. always @ *
  57. begin
  58. if(reset) dout = 1'b0;
  59. else if( (current_state == s3)&&(din == 1'b1) ) dout = 1'b1;
  60. else dout = 1'b0;
  61. end
  62. endmodule

用上篇博文的测试代码:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2019/01/04 15:24:59
  7. // Design Name:
  8. // Module Name: seq_det_moore_tb
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module seq_det_mealy_tb;
  22. reg clk,reset;
  23. reg din;
  24. wire dout;
  25. reg [20:0] din_mid;
  26. integer i;
  27. // Note: CLK must be defined as a reg when using this method
  28. parameter PERIOD = 10;
  29. always begin
  30. clk = 1'b0;
  31. #(PERIOD/2) clk = 1'b1;
  32. #(PERIOD/2);
  33. end
  34. initial begin
  35. reset = 1'b1;
  36. din_mid = 21'b110111010110100101101;
  37. # 20
  38. reset = 1'b0;
  39. din = 1'b0;
  40. for(i = 0;i < 21;i = i + 1)
  41. begin
  42. #PERIOD
  43. din = din_mid[i];
  44. end
  45. end
  46. seq_det_mealy uu1(.clk(clk),.reset(reset),.din(din),.dout(dout));
  47. endmodule

行为仿真波形图:

这篇博文是在上篇博文的基础上改的,相对而言, 意义就没有那篇博文有意义!

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/85798105

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。