当前位置:   article > 正文

数字IC-序列检测-fsm_序列测试中pwdnb

序列测试中pwdnb

序列检测简介及代码实现

序列检测器包含两种,一种是移位寄存器,另一种时状态机,还有重复序列和不重复序列检测。重点关注和了解如何用状态机去实现。

序列检测器就是将指定的序列从数字码流 中检测出来,收到输出1,否则输出0

移位寄存器解法

重复序列检测1101序列

  1. module seq_detect1(
  2. input clk ,
  3. input rst_n ,
  4. input din ,
  5. output flg ,
  6. );
  7. reg [3:0] din_t ;
  8. always @(posedge clk or negedge rst_n) begin
  9. if(!rst_n)
  10. din_t <= 4'b0 ;
  11. else
  12. din_t <= {din_t[2:0] ,din};
  13. end
  14. assign flg = (din_t==4'b1101) ? 1'b1 :1'b0 ;
  15. endmodule

不重复序列检测1101

  1. module seq_detect2(
  2. input clk ,
  3. input rst_n ,
  4. input din ,
  5. output flg ,
  6. );
  7. reg [1:0] cnt;
  8. reg [3:0] din_t ;
  9. always @(posedge clk or negedge rst_n) begin
  10. if(!rst_n)
  11. cnt <= 1'b0;
  12. else if(cnt==2'd3)
  13. cnt <= 1'b0;
  14. else
  15. cnt <= cnt+1'b1;
  16. end
  17. always @(posedge clk or negedge rst_n) begin
  18. if(!rst_n)
  19. din_t <= 4'b0 ;
  20. else
  21. din_t <= {din_t[2:0] ,din};
  22. end
  23. assign flg = (din_t==4'b1101) && (cnt==2'd3)? 1'b1 :1'b0 ;
  24. endmodule

状态机解法

此处采用的状态机是三段式Moore状态机的写法

重复序列检测1101

 

  1. module seq_detect3 (
  2. input clk ,
  3. input rst_n,
  4. input din ,
  5. output reg flag ,
  6. );
  7. reg [4:0] cur_state;
  8. reg [4:0] next_state ;
  9. localparam IDLE = 5'b00001;
  10. localparam SEQ1 = 5'b00010;
  11. localparam SEQ11 = 5'b00100;
  12. localparam SEQ110 = 5'b01000;
  13. localparam SEQ1101 = 5'b10000 ;
  14. //状态机三段式
  15. always@(posedge clk or negedge rst_n)begin
  16. if(!rst_n)
  17. cur_state <= IDLE;
  18. else
  19. cur_state <= next_state ;
  20. end
  21. always@(*)
  22. begin
  23. case(cur_state)
  24. IDLE : next_state = din ? SEQ1 : IDLE;
  25. SEQ1 : next_state = din ? SEQ11 : IDLE ;
  26. SEQ11: next_state = din ? SEQ11 : SEQ110 ;
  27. SEQ110 : next_state = din ? SEQ1101 : IDLE ;
  28. SEQ1101 :next_state = din ? SEQ11 : IDLE ;
  29. default : next_state = IDLE ;
  30. endcase
  31. end
  32. always @(posedge clk or negedge rst_n) begin
  33. if(!rst_n)
  34. flag <= 1'b0 ;
  35. else if(cur_state==SEQ1101)
  36. flag <= 1'b1;
  37. else
  38. flag <= 1'b0 ;
  39. end
  40. endmodule

 不重复序列检测1101

 

  1. module seq_detect4 (
  2. input clk ,
  3. input rst_n,
  4. input din ,
  5. output reg flag ,
  6. );
  7. reg [4:0] cur_state;
  8. reg [4:0] next_state ;
  9. localparam IDLE = 5'b00001;
  10. localparam SEQ1 = 5'b00010;
  11. localparam SEQ11 = 5'b00100;
  12. localparam SEQ110 = 5'b01000;
  13. localparam SEQ1101 = 5'b10000 ;
  14. //状态机三段式
  15. always@(posedge clk or negedge rst_n)begin
  16. if(!rst_n)
  17. cur_state <= IDLE;
  18. else
  19. cur_state <= next_state ;
  20. end
  21. always@(*)
  22. begin
  23. case(cur_state)
  24. IDLE : next_state = din ? SEQ1 : IDLE;
  25. SEQ1 : next_state = din ? SEQ11 : IDLE ;
  26. SEQ11: next_state = din ? IDLE : SEQ110 ;
  27. SEQ110 : next_state = din ? SEQ1101 : IDLE ;
  28. SEQ1101 :next_state = IDLE ;
  29. default : next_state = IDLE ;
  30. endcase
  31. end
  32. always @(posedge clk or negedge rst_n) begin
  33. if(!rst_n)
  34. flag <= 1'b0 ;
  35. else if(cur_state==SEQ1101)
  36. flag <= 1'b1;
  37. else
  38. flag <= 1'b0 ;
  39. end
  40. endmodule

 

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

闽ICP备14008679号