• 【HDLBits 刷题 9】Circuits(5)Finite State Manchines 1-9


    目录

    写在前面

    Finite State Manchines

    Fsm1

    Fsm1s

    Fsm2

    Fsm2s

    Fsm3comb

    Fsm3onehot

    Fsm3

    Fsm3s

    Design a Moore FSM


    写在前面

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

    Finite State Manchines

    Fsm1

    设计一个摩尔状态机,具有两种状态,一种输入和一种输出。实现此状态机。请注意,重置状态为 B。使用异步重置。

    1. module top_module(
    2. input clk,
    3. input areset, // Asynchronous reset to state B
    4. input in,
    5. output out
    6. );
    7. //状态申明
    8. parameter A = 0;
    9. parameter B = 1;
    10. reg state;
    11. reg next_state;
    12. //状态机第一段,起始状态
    13. always @(posedge clk or posedge areset) begin
    14. if (areset) begin
    15. state <= B;
    16. end
    17. else begin
    18. state <= next_state;
    19. end
    20. end
    21. //状态机第二段,状态的跳转
    22. always @(*) begin
    23. next_state = state;
    24. case(state)
    25. B:
    26. case(in)
    27. 0 : next_state = A;
    28. 1 : next_state = B;
    29. endcase
    30. A :
    31. case(in)
    32. 0 : next_state = B;
    33. 1 : next_state = A;
    34. endcase
    35. default:
    36. next_state = B;
    37. endcase
    38. end
    39. //状态机第三段,在每个状态的输出
    40. assign out = (state == B);
    41. endmodule

    Fsm1s

    一个摩尔状态机,具有两种状态,一种输入和一种输出。实现此状态机。请注意,重置状态为 B。使用同步复位。

    1. module top_module(clk, reset, in, out);
    2. input clk;
    3. input reset; // Synchronous reset to state B
    4. input in;
    5. output out;
    6. parameter A = 0;
    7. parameter B = 1;
    8. reg out;
    9. reg present_state;
    10. reg next_state;
    11. //状态机第一段,初始状态,非阻塞逻辑
    12. always @(posedge clk) begin
    13. if (reset) begin
    14. present_state <= B;
    15. end
    16. else begin
    17. present_state <= next_state;
    18. end
    19. end
    20. //状态机第二段,状态转移,阻塞赋值
    21. always @(*) begin
    22. next_state = present_state;
    23. case(present_state)
    24. B:
    25. case(in)
    26. 1: next_state = B;
    27. 0: next_state = A;
    28. endcase
    29. A:
    30. case(in)
    31. 1: next_state = A;
    32. 0: next_state = B;
    33. endcase
    34. endcase
    35. end
    36. //状态机第三段,状态输出
    37. assign out = (present_state==B);
    38. endmodule

    Fsm2

    这是一个摩尔状态机,有两个状态,两个输入和一个输出。实现此状态机。使用异步重置。

    1. module top_module(
    2. input clk,
    3. input areset, // Asynchronous areset to OFF
    4. input j,
    5. input k,
    6. output out
    7. );
    8. parameter OFF = 0;
    9. parameter ON = 1;
    10. reg state;
    11. reg next_state;
    12. //状态机第一段,初始状态,非阻塞逻辑
    13. always @(posedge clk or posedge areset) begin
    14. if (areset) begin
    15. state <= OFF;
    16. end
    17. else begin
    18. state <= next_state;
    19. end
    20. end
    21. //状态机第二段,状态转移,阻塞赋值
    22. always @(*) begin
    23. next_state = state;
    24. case(state)
    25. OFF:
    26. case(j)
    27. 1: next_state = ON;
    28. 0: next_state = OFF;
    29. endcase
    30. ON:
    31. case(k)
    32. 1: next_state = OFF;
    33. 0: next_state = ON;
    34. endcase
    35. endcase
    36. end
    37. //状态机第三段,状态输出
    38. assign out = (state==ON);
    39. endmodule

    Fsm2s

    这是一个摩尔状态机,有两个状态,两个输入和一个输出。实现此状态机。使用同步复位。

    1. //`timescale 100ps / 1ps
    2. //
    3. // Stage: Finite_State_Manchines
    4. // Engineer: LQC
    5. // Create Date: 2022/08/06
    6. // Design Name:
    7. // Module Name: top_module
    8. // Description:
    9. // 摩尔状态机,有两个状态,两个输入和一个输出。
    10. // 实现此状态机。使用同步重置。
    11. //
    12. module top_module(
    13. input clk,
    14. input reset, // Asynchronous reset to OFF
    15. input j,
    16. input k,
    17. output out
    18. );
    19. parameter OFF = 0;
    20. parameter ON = 1;
    21. reg state;
    22. reg next_state;
    23. //状态机第一段,初始状态,非阻塞逻辑
    24. always @(posedge clk) begin
    25. if (reset) begin
    26. state <= OFF;
    27. end
    28. else begin
    29. state <= next_state;
    30. end
    31. end
    32. //状态机第二段,状态转移,阻塞赋值
    33. always @(*) begin
    34. next_state = state;
    35. case(state)
    36. OFF:
    37. case(j)
    38. 1: next_state = ON;
    39. 0: next_state = OFF;
    40. endcase
    41. ON:
    42. case(k)
    43. 1: next_state = OFF;
    44. 0: next_state = ON;
    45. endcase
    46. endcase
    47. end
    48. //状态机第三段,状态输出
    49. assign out = (state==ON);
    50. endmodule

    Fsm3comb

    以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。使用以下状态编码:A=2'b00、B=2'b01、C=2'b10、D=2'b11。

    仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态,根据状态转换表计算和输出 。

    1. module top_module(
    2. input in,
    3. input [1:0] state,
    4. output [1:0] next_state,
    5. output out
    6. );
    7. parameter A=0, B=1, C=2, D=3;
    8. always @(*) begin
    9. case(state)
    10. A:
    11. case(in)
    12. 0: next_state = A;
    13. 1: next_state = B;
    14. endcase
    15. B:
    16. case(in)
    17. 0: next_state = C;
    18. 1: next_state = B;
    19. endcase
    20. C:
    21. case(in)
    22. 0: next_state = A;
    23. 1: next_state = D;
    24. endcase
    25. D:
    26. case(in)
    27. 0: next_state = C;
    28. 1: next_state = B;
    29. endcase
    30. default:
    31. next_state = A;
    32. endcase
    33. end
    34. assign out = (state==D);
    35. endmodule

    Fsm3onehot

    以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。使用以下单热状态编码:A=4'b0001、B=4'b0010、C=4'b0100、D=4'b1000。

    通过检查(假设为单热编码)派生状态转换和输出逻辑方程。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。(测试平台将使用非一个热输入进行测试,以确保您不会尝试执行更复杂的操作)。

    1. module top_module(
    2. input in,
    3. input [3:0] state,
    4. output [3:0] next_state,
    5. output out
    6. );
    7. //状态申明
    8. parameter A = 0;
    9. parameter B = 1;
    10. parameter C = 2;
    11. parameter D = 3;
    12. //只需要判断next_state在哪个状态变成此状态即可
    13. assign next_state[A] = (state[A] && ~in) | (state[C] && ~in);
    14. assign next_state[B] = (state[B] && in) | (state[D] && in) | (state[A] && in);
    15. assign next_state[C] = (state[B] && ~in) | (state[D] && ~in);
    16. assign next_state[D] = (state[C] && in);
    17. //只有当状态为D时输出才为1
    18. assign out = (state[D]);
    19. endmodule

    Fsm3

    以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。实现此状态机。包括将 FSM 重置为状态 A 的异步重置。

    1. module top_module(
    2. input clk,
    3. input in,
    4. input areset,
    5. output out
    6. );
    7. //状态申明
    8. parameter A = 4'b0001;
    9. parameter B = 4'b0010;
    10. parameter C = 4'b0100;
    11. parameter D = 4'b1000;
    12. parameter ON = 1;
    13. parameter OFF = 0;
    14. reg [3:0] state;
    15. reg [3:0] next_state;
    16. //状态机第一段,初始状态,时序逻辑、非阻塞赋值
    17. always @(posedge clk or posedge areset) begin
    18. if (areset) begin
    19. state <= A;
    20. end
    21. else begin
    22. state <= next_state;
    23. end
    24. end
    25. //状态机第二段,状态转移,时序逻辑、阻塞赋值
    26. always @(*) begin
    27. next_state = state;
    28. case(state)
    29. A:
    30. case(in)
    31. ON: next_state = B;
    32. OFF: next_state = A;
    33. endcase
    34. B:
    35. case(in)
    36. ON: next_state = B;
    37. OFF: next_state = C;
    38. endcase
    39. C:
    40. case(in)
    41. ON: next_state = D;
    42. OFF: next_state = A;
    43. endcase
    44. D:
    45. case(in)
    46. ON: next_state = B;
    47. OFF: next_state = C;
    48. endcase
    49. endcase
    50. end
    51. //状态机第三段,结果输出,组合逻辑
    52. assign out = (state==D);
    53. endmodule

    Fsm3s

    以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。实现此状态机。包括将 FSM 重置为状态 A 的同步复位,这与 Fsm3 存在相同的问题,但具有同步复位。

    1. module top_module(
    2. input clk,
    3. input in,
    4. input reset,
    5. output out
    6. );
    7. //状态申明
    8. parameter A = 4'b0001;
    9. parameter B = 4'b0010;
    10. parameter C = 4'b0100;
    11. parameter D = 4'b1000;
    12. parameter ON = 1;
    13. parameter OFF = 0;
    14. reg [3:0] state;
    15. reg [3:0] next_state;
    16. //状态机第一段,初始状态,时序逻辑、非阻塞赋值
    17. always @(posedge clk) begin
    18. if (reset) begin
    19. state <= A;
    20. end
    21. else begin
    22. state <= next_state;
    23. end
    24. end
    25. //状态机第二段,状态转移,时序逻辑、阻塞赋值
    26. always @(*) begin
    27. next_state = state;
    28. case(state)
    29. A:
    30. case(in)
    31. ON: next_state = B;
    32. OFF: next_state = A;
    33. endcase
    34. B:
    35. case(in)
    36. ON: next_state = B;
    37. OFF: next_state = C;
    38. endcase
    39. C:
    40. case(in)
    41. ON: next_state = D;
    42. OFF: next_state = A;
    43. endcase
    44. D:
    45. case(in)
    46. ON: next_state = B;
    47. OFF: next_state = C;
    48. endcase
    49. endcase
    50. end
    51. //状态机第三段,结果输出,组合逻辑
    52. assign out = (state==D);
    53. endmodule

    Design a Moore FSM

    1. module top_module (
    2. input clk,
    3. input reset,
    4. input [3:1] s,
    5. output fr3,
    6. output fr2,
    7. output fr1,
    8. output dfr
    9. );
    10. parameter A = 3'b000;
    11. parameter B = 3'b001;
    12. parameter C = 3'b010;
    13. parameter D = 3'b011;
    14. parameter E = 3'b100;
    15. parameter F = 3'b101;
    16. wire [2:0] state;
    17. wire [2:0] next_state;
    18. //状态机第一段,初始状态,时序逻辑非阻塞赋值
    19. always@(posedge clk)begin
    20. if(reset)
    21. state <= A;
    22. else
    23. state <= next_state;
    24. end
    25. //状态机第二段,状态跳转,阻塞赋值
    26. always@(*)begin
    27. case(state)
    28. A: next_state = s[1]? B:A;
    29. B: next_state = s[2]? D:(s[1]? B:A);
    30. C: next_state = s[2]? D:(s[1]? C:A);
    31. D: next_state = s[3]? F:(s[2]? D:C);
    32. E: next_state = s[3]? F:(s[2]? E:C);
    33. F: next_state = s[3]? F:E;
    34. endcase
    35. end
    36. //状态机第三段,结果输出
    37. always@(*)begin
    38. case(state)
    39. A: {fr3,fr2,fr1,dfr} = 4'b1111;
    40. B: {fr3,fr2,fr1,dfr} = 4'b0110;
    41. C: {fr3,fr2,fr1,dfr} = 4'b0111;
    42. D: {fr3,fr2,fr1,dfr} = 4'b0010;
    43. E: {fr3,fr2,fr1,dfr} = 4'b0011;
    44. F: {fr3,fr2,fr1,dfr} = 4'b0000;
    45. endcase
    46. end
    47. endmodule
  • 相关阅读:
    华为云云耀云服务器L实例评测|无人值守羽毛球馆预约小程序系统搭建方案 | 在线场馆预订 | 共享空间
    100、相同的树
    JAVA计算机毕业设计医院管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
    经营目标量化考核
    JAVA要点
    Sql语句的执行流程
    数据结构——线性表的类型定义
    【RocketMQ系列六】RocketMQ事务消息
    GBase8s数据库SET CONSTRAINTS 语句
    C语言程序设计笔记(浙大翁恺版) 第五周:循环控制
  • 原文地址:https://blog.csdn.net/m0_61298445/article/details/126367751