不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

verilog编写“11010”序列检测器

序列检测器是时序数字电路中非常常见的设计之一。它的主要功能是将一个指定的序列从数字码流中识别出来。序列检测器实现主要有两种方法:状态机和移位寄存器。

本设计要求:

        序列检测器,din每个clk都会输入0或1,当检测到连续5个周期输入的din序列是11010时,dout会输出一个周期的脉冲。

1、状态机

1.1 实现原理

        状态机实现序列检测器,其实就是每一bit的跳转都需要一个状态,顾状态机共有6个状态,分别是IDLE, A, B, C, D, E,状态机实现图如下所示:

图1 状态机

1.2 verilog代码:

  1. module seq_checker (
  2. input din,
  3. input clk,
  4. input rst_b,
  5. output dout
  6. );
  7. parameter DLY = 0.1;
  8. parameter IDLE = 3’d0;
  9. parameter A = 3’d1;
  10. parameter B = 3’d2;
  11. parameter C = 3’d3;
  12. parameter D = 3’d4;
  13. parameter E = 3’d5;
  14. reg [2:0] state;
  15. assign dout = (state == E) ? 1’b1 : 1’b0;
  16. always @(posedge clk or negedge rst_b) begin
  17. if(!rst_b)
  18. state <= IDLE;
  19. else
  20. case(state)
  21. IDLE :
  22. if(din == 1’b1)
  23. state <= #DLY A;
  24. else
  25. state <= #DLY IDLE;
  26. A :
  27. if(din == 1’b1)
  28. state <= #DLY B;
  29. else
  30. state <= #DLY IDLE;
  31. B :
  32. if(din == 1’b1)
  33. state <= #DLY B;
  34. else
  35. state <= #DLY C;
  36. C :
  37. if(din == 1’b1)
  38. state <= #DLY D;
  39. else
  40. state <= #DLY IDLE;
  41. D :
  42. if(din == 1’b1)
  43. state <= #DLY B;
  44. else
  45. state <= #DLY E;
  46. E :
  47. if(din == 1’b1)
  48. state <= #DLY A;
  49. else
  50. state <= #DLY IDLE;
  51. default :
  52. state <= #DLY IDLE;
  53. endcase
  54. end
  55. endmodule

2、移位寄存器

2.1 实现原理

        定义5bit寄存器shift_reg[4:0],通过左移的方式采样数据,当shift_reg[4:0]=5'b11010时,立即拉高dout。

2.2 verilog 代码:

  1. module seq_checker(
  2. input din,
  3. input clk,
  4. input rst_b,
  5. output dout
  6. );
  7. parameter DLY 0.1;
  8. parameter SEQ 5'b11010;
  9. reg [4:0] shift_reg;
  10. always @(posedge clk or negedge rst_b) begin: cache_data
  11. if(!rst_b)
  12. shift_reg <= 4'b0;
  13. else
  14. shift_reg <= {shift_reg[3:0], din};
  15. end
  16. assign dout = (shift_reg == SEQ) ? 1'b1 : 1'b0; //check target data
  17. endmodule

        综上所述:状态机和移位寄存器都能够实现序列检测器功能,且移位寄存器方案更简便,资源更少,且方便移植;而状态机方案则难以归一,浪费资源。

posted on   皮皮祥  阅读(682)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示