• 【HDLBits 刷题 12】Circuits(8)Finite State Manchines 27-34


    目录

    写在前面

    Finite State Manchines

    2014 q3c

    m2014 q6b

    m2014 q6c

    m2014 q6

    2012 q2fsm

    2012 q2b

    2013 q2afsm

    2013 q2bfsm


    写在前面

    HDLBits 刷题来到了最为重要的一部分---有限状态机,都说 Verilog 设计的精髓就是状态机的设计,可见状态机设计的重要性,通过三十多道的状态机的练习,可以更加熟悉状态机设计的要点,通常都设计为三段式,这样设计的状态机层次清晰且易于设计,时序上更为易懂。以下的解题方法不一定为最佳解决方案,有更好的方法欢迎提出,共同学习,共同进步!

    Finite State Manchines

    2014 q3c

    给定如下所示的状态分配表,实现逻辑函数 Y[0] 和 z。

    1. module top_module (
    2. input clk,
    3. input [2:0] y,
    4. input x,
    5. output Y0,
    6. output z
    7. );
    8. //状态申明
    9. parameter A = 3'b000;
    10. parameter B = 3'b001;
    11. parameter C = 3'b010;
    12. parameter D = 3'b011;
    13. parameter E = 3'b100;
    14. reg [2:0] state;
    15. always @(*) begin
    16. case(y)
    17. A: begin
    18. if (x) begin
    19. state = B;
    20. end
    21. else begin
    22. state = A;
    23. end
    24. end
    25. B: begin
    26. if (x) begin
    27. state = E;
    28. end
    29. else begin
    30. state = B;
    31. end
    32. end
    33. C: begin
    34. if (x) begin
    35. state = B;
    36. end
    37. else begin
    38. state = C;
    39. end
    40. end
    41. D: begin
    42. if (x) begin
    43. state = C;
    44. end
    45. else begin
    46. state = B;
    47. end
    48. end
    49. E: begin
    50. if (x) begin
    51. state = E;
    52. end
    53. else begin
    54. state = D;
    55. end
    56. end
    57. default: begin
    58. state = A;
    59. end
    60. endcase
    61. end
    62. //状态机第三段,结果输出,组合逻辑
    63. assign Y0 = state[0];
    64. assign z = (y==D) || (y==E);
    65. endmodule

    m2014 q6b

    考虑下面显示的状态机,它有一个输入 w 和一个输出 z

    希望使用三个触发器和状态代码 y[3:1] = 000, 001, ..., 101 分别用于状态 A、B、...、F 来实现 FSM。显示此 FSM 的状态分配表。推导触发器 y[2] 的下一个状态表达式。只实现 y[2] 的下一个状态逻辑。

    1. module top_module (
    2. input [3:1] y,
    3. input w,
    4. output Y2
    5. );
    6. //状态定义
    7. parameter A = 3'b000;
    8. parameter B = 3'b001;
    9. parameter C = 3'b010;
    10. parameter D = 3'b011;
    11. parameter E = 3'b100;
    12. parameter F = 3'b101;
    13. reg [3:1] next_state;
    14. always @(*) begin
    15. case(y[3:1])
    16. A: begin
    17. if (w) begin
    18. next_state = A;
    19. end
    20. else begin
    21. next_state = B;
    22. end
    23. end
    24. B: begin
    25. if (w) begin
    26. next_state = D;
    27. end
    28. else begin
    29. next_state = C;
    30. end
    31. end
    32. C: begin
    33. if (w) begin
    34. next_state = D;
    35. end
    36. else begin
    37. next_state = E;
    38. end
    39. end
    40. D: begin
    41. if (w) begin
    42. next_state = A;
    43. end
    44. else begin
    45. next_state = F;
    46. end
    47. end
    48. E: begin
    49. if (w) begin
    50. next_state = D;
    51. end
    52. else begin
    53. next_state = E;
    54. end
    55. end
    56. F: begin
    57. if (w) begin
    58. next_state = D;
    59. end
    60. else begin
    61. next_state = C;
    62. end
    63. end
    64. default: begin
    65. next_state = A;
    66. end
    67. endcase
    68. end
    69. assign Y2 = next_state[2];
    70. endmodule

    m2014 q6c

    考虑下面显示的状态机,它有一个输入 w 和一个输出 z

    对于此部分,假设一个单热代码分别与状态赋值 'y[6:1] = 000001, 000010, 000100, 001000, 010000, 100000,...,, 100000 一起使用。

    为下一状态信号 Y2 和 Y4 编写逻辑表达式。(通过假设独热编码的检查来推导逻辑方程。测试平台将使用非独热输入进行测试,以确保您不会尝试执行更复杂的操作)。

    1. module top_module (
    2. input [6:1] y,
    3. input w,
    4. output Y2,
    5. output Y4
    6. );
    7. assign Y2 = ~w & y[1];
    8. assign Y4 = (w&y[2]) | (w&y[3]) | (w&y[5]) | (w&y[6]);
    9. endmodule

    m2014 q6

    考虑下面显示的状态机,它有一个输入 w 和一个输出 z

    1. module top_module (
    2. input clk,
    3. input reset, // synchronous reset
    4. input w,
    5. output z
    6. );
    7. //状态申明
    8. parameter A = 6'b000001;
    9. parameter B = 6'b000010;
    10. parameter C = 6'b000100;
    11. parameter D = 6'b001000;
    12. parameter E = 6'b010000;
    13. parameter F = 6'b100000;
    14. //定义现态和次态
    15. reg [5:0] state;
    16. reg [5:0] next_state;
    17. //状态机第一段,状态初始化,时序逻辑非阻塞赋值
    18. always @(posedge clk) begin
    19. if (reset) begin
    20. state <= A;
    21. end
    22. else begin
    23. state <= next_state;
    24. end
    25. end
    26. //状态机第二段,状态跳转,阻塞赋值
    27. always @(*) begin
    28. next_state = state;
    29. case(state)
    30. A: begin
    31. if (w) begin
    32. next_state = A;
    33. end
    34. else begin
    35. next_state = B;
    36. end
    37. end
    38. B: begin
    39. if (w) begin
    40. next_state = D;
    41. end
    42. else begin
    43. next_state = C;
    44. end
    45. end
    46. C: begin
    47. if (w) begin
    48. next_state = D;
    49. end
    50. else begin
    51. next_state = E;
    52. end
    53. end
    54. D: begin
    55. if (w) begin
    56. next_state = A;
    57. end
    58. else begin
    59. next_state = F;
    60. end
    61. end
    62. E: begin
    63. if (w) begin
    64. next_state = D;
    65. end
    66. else begin
    67. next_state = E;
    68. end
    69. end
    70. F: begin
    71. if (w) begin
    72. next_state = D;
    73. end
    74. else begin
    75. next_state = C;
    76. end
    77. end
    78. endcase
    79. end
    80. //状态机第三段,结果输出,组合逻辑
    81. assign z = (state==E | state==F);
    82. endmodule

    2012 q2fsm

    编写表示此 FSM 的完整 Verilog 代码。对状态表和状态触发器使用单独的 always 块。描述 FSM 输出,称为 z,使用连续赋值语句或 always 块。

    1. module top_module (
    2. input clk,
    3. input reset, // Synchronous active-high reset
    4. input w,
    5. output z
    6. );
    7. //状态申明
    8. parameter A = 6'b000001;
    9. parameter B = 6'b000010;
    10. parameter C = 6'b000100;
    11. parameter D = 6'b001000;
    12. parameter E = 6'b010000;
    13. parameter F = 6'b100000;
    14. //定义现态和次态
    15. reg [5:0] state;
    16. reg [5:0] next_state;
    17. //状态机第一段,状态初始化,时序逻辑非阻塞赋值
    18. always @(posedge clk) begin
    19. if (reset) begin
    20. state <= A;
    21. end
    22. else begin
    23. state <= next_state;
    24. end
    25. end
    26. //状态机第二段,状态跳转,阻塞赋值
    27. always @(*) begin
    28. next_state = state;
    29. case(state)
    30. A: begin
    31. if (w) begin
    32. next_state = B;
    33. end
    34. else begin
    35. next_state = A;
    36. end
    37. end
    38. B: begin
    39. if (w) begin
    40. next_state = C;
    41. end
    42. else begin
    43. next_state = D;
    44. end
    45. end
    46. C: begin
    47. if (w) begin
    48. next_state = E;
    49. end
    50. else begin
    51. next_state = D;
    52. end
    53. end
    54. D: begin
    55. if (w) begin
    56. next_state = F;
    57. end
    58. else begin
    59. next_state = A;
    60. end
    61. end
    62. E: begin
    63. if (w) begin
    64. next_state = E;
    65. end
    66. else begin
    67. next_state = D;
    68. end
    69. end
    70. F: begin
    71. if (w) begin
    72. next_state = C;
    73. end
    74. else begin
    75. next_state = D;
    76. end
    77. end
    78. default: begin
    79. next_state = A;
    80. end
    81. endcase
    82. end
    83. //状态机第三段,结果输出,组合逻辑
    84. assign z = (state==E | state==F);
    85. endmodule

    2012 q2b

    假设一个独热代码与状态赋值 y[5:0] = 000001(A)、 000010(B)、 000100(C)、 001000(D)、 010000(E)、 100000(F)

    为信号Y1编写一个逻辑表达式,它是状态触发器y[1]的输入。

    为信号Y3编写一个逻辑表达式,它是状态触发器y[3]的输入。

    (通过假设一个热编码的检查来推导逻辑方程。测试平台将使用非一个热输入进行测试,以确保您不会尝试执行更复杂的操作)。

    2013 q2afsm

    此 FSM 充当仲裁器电路,通过三个请求设备控制对某种类型资源的访问。每个设备通过设置信号 r[i] = 1 来请求资源,其中 r[i] 为 r[1]r[2] 或 r[3]。每个 r[i] 是 FSM 的输入信号,代表三个器件之一。只要没有请求,FSM 就会保持在状态 A 中。当发生一个或多个请求时,FSM 决定哪个设备接收使用资源的授权,并更改为将该设备的 g[i] 信号设置为 1 的状态。每个 g[i] 都是 FSM 的一个输出。有一个优先级系统,因为设备 1 的优先级高于设备 2,设备 3 的优先级最低。因此,例如,仅当设备 3 是 FSM 处于状态 A 时发出请求的唯一设备时,它才会收到授权。一旦设备 i 被 FSM 授予授权,只要其请求 r[i] = 1,该设备就会继续接收授权。

    编写表示此 FSM 的完整 Verilog 代码。对状态表和状态触发器使用单独的 always 块,就像在讲座中所做的那样。描述 FSM 输出 g[i],使用连续赋值语句或 always 块。

    1. module top_module (
    2. input clk,
    3. input resetn, // active-low synchronous reset
    4. input [3:1] r, // request
    5. output [3:1] g // grant
    6. );
    7. //状态定义
    8. parameter A = 4'b0001;
    9. parameter B = 4'b0010;
    10. parameter C = 4'b0100;
    11. parameter D = 4'b1000;
    12. //定义现态和次态
    13. reg [3:0] state;
    14. reg [3:0] next_state;
    15. //状态机第一段,状态初始化,时序逻辑非阻塞赋值
    16. always @(posedge clk) begin
    17. if (!resetn) begin
    18. state <= A;
    19. end
    20. else begin
    21. state <= next_state;
    22. end
    23. end
    24. //状态机第二段,状态跳转,非阻塞赋值
    25. always @(*) begin
    26. next_state = state;
    27. case(state)
    28. A: begin
    29. if (r[1]) begin
    30. next_state = B;
    31. end
    32. else if (~r[1] & r[2]) begin
    33. next_state = C;
    34. end
    35. else if (~r[1] & ~r[2] & r[3]) begin
    36. next_state = D;
    37. end
    38. else begin
    39. next_state = A;
    40. end
    41. end
    42. B: begin
    43. if (~r[1]) begin
    44. next_state = A;
    45. end
    46. else begin
    47. next_state = B;
    48. end
    49. end
    50. C: begin
    51. if (~r[2]) begin
    52. next_state = A;
    53. end
    54. else begin
    55. next_state = C;
    56. end
    57. end
    58. D: begin
    59. if (~r[3]) begin
    60. next_state = A;
    61. end
    62. else begin
    63. next_state = D;
    64. end
    65. end
    66. default: begin
    67. next_state = A;
    68. end
    69. endcase
    70. end
    71. //状态机第三段,结果输出,组合逻辑
    72. assign g[1] = state==B;
    73. assign g[2] = state==C;
    74. assign g[3] = state==D;
    75. endmodule

    2013 q2bfsm

    考虑一个用于控制某种类型电机的有限状态机。FSM具有来自电机的输入xy,并产生控制电机的输出fg。还有一个称为clk的时钟输入和一个称为resetn的复位输入。

    密克罗尼西亚联邦必须按如下方式工作。只要置位复位输入,FSM 就会保持开始状态,称为状态 A。当复位信号被解除置位时,在下一个时钟边沿之后,FSM必须将输出f设置为1,持续一个时钟周期。然后,FSM 必须监视 x 输入。当 x 在三个连续的时钟周期中生成值 1, 0, 1 时,应在下一个时钟周期中将 g 设置为 1。在保持 g = 1 的同时,FSM 必须监视 y 输入。如果 y 在最多两个时钟周期内具有值 1,则 FSM 应永久保持 g = 1(即,直到重置)。但是,如果 y 在两个时钟周期内未变为 1,则 FSM 应永久设置 g = 0(直到重置)。

    1. module top_module (
    2. input clk,
    3. input resetn, // active-low synchronous reset
    4. input x,
    5. input y,
    6. output f,
    7. output g
    8. );
    9. //状态定义
    10. parameter START = 9'b000000001;
    11. parameter OUT_F = 9'b000000010;
    12. parameter X_1 = 9'b000000100;
    13. parameter X_2 = 9'b000001000;
    14. parameter X_3 = 9'b000010000;
    15. parameter OUT_G = 9'b000100000;
    16. parameter G_1 = 9'b001000000;
    17. parameter WAIT = 9'b010000000;
    18. parameter G_0 = 9'b100000000;
    19. //现态和次态
    20. reg [8:0] state;
    21. reg [8:0] next_state;
    22. //状态机第一段,状态初始化,时序逻辑非阻塞赋值
    23. always @(posedge clk) begin
    24. if (!resetn) begin
    25. state <= START;
    26. end
    27. else begin
    28. state <= next_state;
    29. end
    30. end
    31. //状态机第二段,状态跳转,阻塞赋值
    32. always @(*) begin
    33. next_state = state;
    34. case(state)
    35. START: begin
    36. next_state = OUT_F;
    37. end
    38. OUT_F: begin
    39. next_state = X_1;
    40. end
    41. X_1: begin
    42. if (x) begin
    43. next_state = X_2;
    44. end
    45. else begin
    46. next_state = X_1;
    47. end
    48. end
    49. X_2: begin
    50. if (x) begin
    51. next_state = X_2;
    52. end
    53. else begin
    54. next_state = X_3;
    55. end
    56. end
    57. X_3: begin
    58. if (x) begin
    59. next_state = OUT_G;
    60. end
    61. else begin
    62. next_state = X_1;
    63. end
    64. end
    65. OUT_G: begin
    66. if (y) begin
    67. next_state = G_1;
    68. end
    69. else begin
    70. next_state = WAIT;
    71. end
    72. end
    73. WAIT: begin
    74. if (y) begin
    75. next_state = G_1;
    76. end
    77. else begin
    78. next_state = G_0;
    79. end
    80. end
    81. G_1: begin
    82. next_state = G_1;
    83. end
    84. G_0: begin
    85. next_state = G_0;
    86. end
    87. default: begin
    88. next_state = START;
    89. end
    90. endcase
    91. end
    92. //状态机第三段,结果输出,组合逻辑
    93. assign f = state==OUT_F;
    94. assign g = (state==OUT_G) | (state==G_1) | (state==WAIT);
    95. endmodule
  • 相关阅读:
    二、Node.js内置API(fs、path、http)
    SBOM实例基础元素分析
    力扣● 392.判断子序列 ● 115.不同的子序列
    7、Mybatis-Plus condition的使用
    CentOS升级GCC
    实训笔记——Spark SQL编程
    【手把手】ios苹果打包——遇见项目实战|超详细的教程分享
    Doccano 修复 spacy.gold 的bug
    Angular知识点系列(4)-每天10个小知识
    06 linux: 文件管理命令
  • 原文地址:https://blog.csdn.net/m0_61298445/article/details/126428573