当前位置:   article > 正文

数字IC手撕代码——模七检测器,序列检测联发科提前批笔试_状态机检测7的倍数

状态机检测7的倍数

题目:用状态机检测串行输入单bit序列ser_in,每当已输入序列为7的倍数时,拉高信号flag_7。其中输入时钟为clk 上升沿采样,复位信号为rst_n,低电平有效

这题思路借鉴于模三检测器:使用verilog代码,设计电路,判断输入序列能否被三整除,能的话输出1,不能的话输出0。

模三检测器

原理

判断输入序列的序列监测器,一个输入被三除,对于余数来说只有三种可能,分别为0、1、2(整除,余数为1,余数为2),假如0、1、2对应三种状态,加上IDLE状态,我们需要四个状态来表示模三检测器的状态机(换到模七就是八个状态)。

关键点

输入序列是一边移位、一边输入,假如第一位输入1,第二位输入0,在输入第二位的时候,当前输入序列表示为10,即先输入的1移动到了输入序列的最高位。

模三检测器的本质,是一个结合了当前状态和输入序列,来判断输出的mealy型状态机(输出与当前状态和输入都有关)

所以具体的状态机转换为:

当前态余数输入次态余数输出
0110
0001
1020
1101
2010
2120

状态转换图

 代码

  1. // 模三
  2. module mod3_check(
  3. input clk,
  4. input rst_n,
  5. input data,
  6. output test
  7. );
  8. parameter IDLE = 2'b00;
  9. parameter s1 = 2'b01;
  10. parameter s2 = 2'b10;
  11. parameter s3 = 2'b11;
  12. reg [1 : 0] state;
  13. reg [1 : 0] nstate;
  14. always@(posedge clk or negedge rst_n) begin
  15. if(rst_n == 1'b1)
  16. state <= IDLE;
  17. else
  18. state <= nstate;
  19. end
  20. always(*) begin
  21. case(state)
  22. IDLE : nstate = data ? s1 : s3;
  23. s1 : nstate = data ? s3 : s2;
  24. s2 : nstate = data ? s2 : s1;
  25. s3 : nstate = data ? s1 : s3;
  26. default nstate = IDLE;
  27. endcase
  28. end
  29. assign test = state == s3 ? 1 : 0;
  30. endmodule

模七检测器

用状态机检测串行输入单bit序列ser_in,每当已输入序列为7的倍数时,拉高信号flag_7。其中输入时钟为clk 上升沿采样,复位信号为rst_n,低电平有效

状态转换图

 代码

  1. // 模七
  2. module mod7_check(
  3. input clk,
  4. input rst_n,
  5. input data,
  6. output test
  7. );
  8. parameter IDLE = 3'b000;
  9. parameter s1 = 3'b001;
  10. parameter s2 = 3'b010;
  11. parameter s3 = 3'b011;
  12. parameter s4 = 3'b100;
  13. parameter s5 = 3'b101;
  14. parameter s6 = 3'b110;
  15. parameter s7 = 3'b111;
  16. reg [1 : 0] state;
  17. reg [1 : 0] nstate;
  18. always@(posedge clk or negedge rst_n) begin
  19. if(rst_n == 1'b1)
  20. state <= IDLE;
  21. else
  22. state <= nstate;
  23. end
  24. always(*) begin
  25. case(state)
  26. IDLE : nstate = data ? s1 : s7; // 1 -> s1 , 0 -> s7
  27. s1 : nstate = data ? s3 : s2; // 11 -> s3 , 10 -> s2
  28. s2 : nstate = data ? s5 : s4; // 101 -> s5 , 100 -> s4
  29. s3 : nstate = data ? s7 : s6; // 111 -> s7 , 110 -> s6
  30. s4 : nstate = data ? s2 : s1; // 1001 -> s2 , 1000 -> s1
  31. s5 : nstate = data ? s4 : s3; // 1011 -> s4 , 1010 -> s3
  32. s6 : nstate = data ? s6 : s5; // 1101 -> s6 , 1100 -> s5
  33. s7 : nstate = data ? s1 : s7; // 1111 -> s1 , 1110 -> s7
  34. default nstate = IDLE;
  35. endcase
  36. end
  37. assign test = state == s7 ? 1 : 0;
  38. endmodule

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

闽ICP备14008679号