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

举报
李锐博恩 发表于 2021/07/15 05:08:57 2021/07/15
【摘要】 1. dff和latch有什么区别。 锁存器是一种对脉冲电平(也就是0或者1)敏感的存储单元电路,而触发器是一种对脉冲边沿(即上升沿或者下降沿)敏感的存储电路。 "触发器" 泛指一类电路结构, 它可以由触发信号 (如: 时钟, 置位, 复位等) 改变输出状态, 并保持这个状态直到下一个或另一个触发信号来到时, 触发信号可以用电平或边沿操作. "锁存器"是触发器的一...

1. dff和latch有什么区别。


锁存器是一种对脉冲电平(也就是0或者1)敏感的存储单元电路,而触发器是一种对脉冲边沿(即上升沿或者下降沿)敏感的存储电路。

"触发器" 泛指一类电路结构, 它可以由触发信号 (如: 时钟, 置位, 复位等) 改变输出状态, 并保持这个状态直到下一个或另一个触发信号来到时, 触发信号可以用电平或边沿操作.

"锁存器"是触发器的一种应用类型 。强调的是通过触发信号(如时钟)锁存数据输入位。

锁存器是一种脉冲电平敏感的存储单元。最主要的特点是具有使能性的锁存电平功能,即在使能信号有效时,可以锁住输出信号保持不变,而在使能信号失效时,输出与输入相同,等效于一个输出缓冲器。 

锁存器和触发器的区别


2. 什么是同步电路和异步电路。


同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。

同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来,此时无论外部输入 x 有无变化,状态表中的每个状态都是稳定的。   

异步时序逻辑电路的特点:电路中除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储元件,电路中没有统一的时钟,电路状态的改变由外部输入的变化直接引起


3. 什么是setup time和 hold time。


建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。

保持时间:触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。


4. 设计一个101序列检测器。要画出状态转移图,写verilog,并仿真测试。


使用Moore状态机进行序列检测,状态转移图如下:

根据状态转移图,有如下Verilog描述:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2019/04/26 17:08:22
  7. // Design Name:
  8. // Module Name: seq_detect
  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_detect(
  22. input clk,
  23. input reset,
  24. input din,
  25. output reg dout
  26. );
  27. localparam s0 = 4'b1110, s1 = 4'b1101, s2 = 4'b1011, s3 = 4'b0111;
  28. reg [3:0] current_state, next_state;
  29. always@(posedge clk or posedge reset) begin
  30. if(reset) begin
  31. current_state <= s0;
  32. end
  33. else begin
  34. current_state <= next_state;
  35. end
  36. end
  37. always@(*) begin
  38. case(current_state)
  39. s0: begin
  40. if(din == 1) begin
  41. next_state = s1;
  42. end
  43. else begin
  44. next_state = s0;
  45. end
  46. end
  47. s1: begin
  48. if(din == 0) begin
  49. next_state = s2;
  50. end
  51. else begin
  52. next_state = s1;
  53. end
  54. end
  55. s2: begin
  56. if(din == 1) begin
  57. next_state = s3;
  58. end
  59. else begin
  60. next_state = s0;
  61. end
  62. end
  63. s3: begin
  64. if(din == 1) begin
  65. next_state = s1;
  66. end
  67. else begin
  68. next_state = s2;
  69. end
  70. end
  71. default: begin
  72. next_state = s0;
  73. end
  74. endcase
  75. end
  76. always@(*) begin
  77. if(current_state == s3) begin
  78. dout = 1;
  79. end
  80. else begin
  81. dout = 0;
  82. end
  83. end
  84. endmodule

测试文件:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2019/04/26 17:22:09
  7. // Design Name:
  8. // Module Name: seq_detect_sim
  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_detect_sim(
  22. );
  23. reg clk;
  24. reg reset;
  25. reg din;
  26. wire dout;
  27. reg [19:0] din_init;
  28. integer i;
  29. initial clk = 0;
  30. always begin
  31. #1 clk = ~clk;
  32. end
  33. initial begin
  34. din_init = 20'b1010_0101_0111_0010_1010;
  35. reset = 1;
  36. #11
  37. reset = 0;
  38. for(i = 0;i < 20;i = i + 1) begin
  39. #2
  40. din = din_init[i];
  41. end
  42. end
  43. seq_detect u0(
  44. .clk(clk),
  45. .reset(reset),
  46. .din(din),
  47. .dout(dout)
  48. );
  49. endmodule

行为仿真时序图:

RTL 电路图:

 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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