有重叠与无重叠序列之序列检测与序列产生

举报
李锐博恩 发表于 2021/07/15 03:55:14 2021/07/15
【摘要】 目录   前言 无重叠序列产生 移位寄存器实现 状态机实现 有重叠序列产生 移位寄存器方式实现 状态机方式实现 博文推荐 前言 序列检测与序列产生是一对对称的设计,就像有微分就有积分一样。 序列检测分为有重叠检测和无重叠检测; 例如检测序列1101011,我们给出输入:110101101011,如果是无重叠检测,则只能检测到一个序列:11...

目录

 

前言

无重叠序列产生

移位寄存器实现

状态机实现

有重叠序列产生

移位寄存器方式实现

状态机方式实现

博文推荐


前言

序列检测与序列产生是一对对称的设计,就像有微分就有积分一样。

序列检测分为有重叠检测和无重叠检测;

例如检测序列1101011,我们给出输入:110101101011,如果是无重叠检测,则只能检测到一个序列:1101011_01011;

如果是有重叠检测,则可以检测到两个这样的序列:11010_11_01011。

同理,序列产生也可以分为有重叠序列的产生方法和无重叠序列的产生方法,序列产生的办法也可以用移位寄存器产生,也可以用状态机的方式来产生;这两种方法后面都是提到。

由于序列检测我们之前写的太多了,所以这篇博文的重点不是序列检测而是序列产生。


无重叠序列产生

移位寄存器实现

以产生序列1101011为例,我们产生产生的序列要是这个样子的1101011_1101011..............

所以我们需要使用7位的移位寄存器,每次对序列1101011左移,同时输出最高位;7位的移位寄存器固然需要消耗7个触发器,这也是一个考点。

设计也极其简单,如下:


  
  1. module seq_gen7(
  2. input clk,
  3. input reset,
  4. output out
  5. );
  6. reg [6:0] seq_mid;
  7. always@(posedge clk or posedge reset) begin
  8. if(reset) seq_mid <= 7'b1101011;
  9. else seq_mid <= {seq_mid[5:0], seq_mid[6]};
  10. end
  11. assign out = seq_mid[6];
  12. endmodule

仿真波形:

局部放大:

RTL原理图:

可见用了7个触发器。


状态机实现

移位寄存器实现方式,用了7个触发器构成一个7位的移位寄存器来实现上述无重叠序列产生,那如果我们用状态机实现的话, 我们只需要用3个触发器就可以实现,因为我们的状态变量只需要用3位即可,每一个状态产生一个输出,7个状态即可产生这样的一个序列。

设计也很简单,直接用二段式状态机:


  
  1. module seq_gen7(
  2. input clk,
  3. input reset,
  4. output reg out
  5. );
  6. parameter s0 = 3'd0, s1 = 3'd1, s2 = 3'd2, s3 = 3'd3, s4 = 3'd4, s5 = 3'd5, s6 = 3'd6;
  7. reg [2:0] cur_state, nxt_state;
  8. always@(posedge clk or posedge reset) begin
  9. if(reset) cur_state <= s0;
  10. else cur_state <= nxt_state;
  11. end
  12. always@(*) begin
  13. nxt_state = s0;
  14. case(cur_state)
  15. s0: begin
  16. nxt_state = s1;
  17. out = 1;
  18. end
  19. s1: begin
  20. nxt_state = s2;
  21. out = 1;
  22. end
  23. s2: begin
  24. nxt_state = s3;
  25. out = 0;
  26. end
  27. s3: begin
  28. nxt_state = s4;
  29. out = 1;
  30. end
  31. s4: begin
  32. nxt_state = s5;
  33. out = 0;
  34. end
  35. s5: begin
  36. nxt_state = s6;
  37. out = 1;
  38. end
  39. s6: begin
  40. nxt_state = s0;
  41. out = 1;
  42. end
  43. default: begin
  44. nxt_state = s0;
  45. out = 1;
  46. end
  47. endcase
  48. end
  49. endmodule

仿真波形如下图:

RTL原理图:

可见用了多少个触发器,只需要看时序逻辑部分,也就是状态机的跳转部分,状态变量用了几位就是几个触发器。


有重叠序列产生

移位寄存器方式实现

仍然以产生序列1101011为例,当然这里变成了有重叠序列,也就是产生的序列可以是如下样子:

110101101011...

这个序列中有两个1101011,二者共用11;

因此我们产生这样的序列只需要一个5位的移位寄存器即可:

设计也十分简单,如下:


  
  1. //有重叠序列的移位寄存器实现
  2. module seq_gen5(
  3. input clk,
  4. input reset,
  5. output out
  6. );
  7. reg [4:0] seq_mid;
  8. always@(posedge clk or posedge reset) begin
  9. if(reset) seq_mid <= 5'b11010;
  10. else seq_mid <= {seq_mid[3:0], seq_mid[4]};
  11. end
  12. assign out = seq_mid[4];
  13. endmodule

行为仿真图如下:

对应的RTL原理图如下:

有了用了5位的移位寄存器,所以需要5个触发器即可实现。

状态机方式实现

设计文件:


  
  1. //有重叠序列的状态机实现
  2. module seq_gen5(
  3. input clk,
  4. input reset,
  5. output reg out
  6. );
  7. parameter s0 = 3'd0, s1 = 3'd1, s2 = 3'd2, s3 = 3'd3, s4 = 3'd4;
  8. reg [2:0] cur_state, nxt_state;
  9. always@(posedge clk or posedge reset) begin
  10. if(reset) cur_state <= s0;
  11. else cur_state <= nxt_state;
  12. end
  13. always@(*) begin
  14. nxt_state = s0;
  15. case(cur_state)
  16. s0: begin
  17. nxt_state = s1;
  18. out = 1;
  19. end
  20. s1: begin
  21. nxt_state = s2;
  22. out = 1;
  23. end
  24. s2: begin
  25. nxt_state = s3;
  26. out = 0;
  27. end
  28. s3: begin
  29. nxt_state = s4;
  30. out = 1;
  31. end
  32. s4: begin
  33. nxt_state = s0;
  34. out = 0;
  35. end
  36. default: begin
  37. nxt_state = s0;
  38. out = 1;
  39. end
  40. endcase
  41. end
  42. endmodule

行为仿真图:

RTL原理图如下:

状态变量是3bit的,所以用3个触发器可以实现。


博文推荐

与本博文有关的其他博文列表如下:

序列检测:

序列检测器的Moore状态机实现

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

IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器

【Verilog HDL 训练】第 05 天(序列检测)


序列产生

序列信号产生器的verilog HDL 设计


最后的最后,如果让产生一个序列,并没有说是有重叠还是无重叠的,问你至少需要多少个触发器实现,那样的话,如果能设计成有重叠的就设计成有重叠的,那样的话就可以节省触发器数量。

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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