• 牛客刷题<22>根据状态转移图实现时序电路


    题目:根据状态转移图实现时序电路_牛客题霸_牛客网

    解法一:

    本题提供的是状态转换图,可采用状态机实现,也可采用列激励方程、输出方程,进而用D触发器和组合逻辑电路实现。本题解采用第二种方案实现。

    由状态转换图可得出,电路共4个状态,所以使用2个寄存器来实现状态的寄存。两个寄存器的输出为Q1和Q0,两个寄存器的输入为D1和D0。

     

    1. `timescale 1ns/1ns
    2. module seq_circuit(
    3. input C ,
    4. input clk ,
    5. input rst_n,
    6. output wire Y
    7. );
    8. reg q1;
    9. reg q0;
    10. always@(posedge clk or negedge rst_n)begin
    11. if(!rst_n)
    12. q1 <= 1'b0;
    13. else
    14. q1 <= (q1 & (q0 | C)) | (~q1 & q0 & ~C);
    15. end
    16. always@(posedge clk or negedge rst_n)begin
    17. if(!rst_n)
    18. q0 <= 1'b0;
    19. else
    20. q0 <= (~q1 & (q0 | C)) | (q1 & q0 & ~C);
    21. end
    22. assign Y = (C & q1) | (q1 & q0);
    23. endmodule

    解法二:三段式状态机

    第一段,时序逻辑实现状态转移

    第二段,组合逻辑实现状态跳转

    第三段,组合逻辑实现状态内的赋值

    第一个always时序初态和次态,第二个always组合逻辑描述状态转移,第三个always组合逻辑描述输出。输出可以不合并,编译器会帮你优化的。

    注意:第二段我刚开始使用的时序逻辑输出,部分代码如下:

    1. always@(posedge clk or negedge rst_n)begin //括号里改为*就好了
    2. if(!rst_n)
    3. curr_state <= 2'b00;

    发现答案不通过,波形如下:

     明显看出,我的Y比参考答案延后了一个时钟周期,因为时序逻辑会延后一个时钟周期,根据波形逆推,所以采用了组合逻辑,代码如下:

    1. `timescale 1ns/1ns
    2. module seq_circuit(
    3. input C ,
    4. input clk ,
    5. input rst_n,
    6. output wire Y
    7. );
    8. reg Y1;
    9. reg [1:0] curr_state;
    10. reg [1:0] next_state;
    11. // 当前状态切换,时序逻辑
    12. always@(posedge clk or negedge rst_n)begin
    13. if(!rst_n)
    14. curr_state <= 2'b00;
    15. else
    16. curr_state <= next_state;
    17. end
    18. // 下个状态更新,组合逻辑
    19. always@(*)
    20. case(curr_state)
    21. 2'b00: begin
    22. if(C==1)
    23. next_state <= 2'b01;
    24. else
    25. next_state <= 2'b00;
    26. end
    27. 2'b01: begin
    28. if(C==1)
    29. next_state <= 2'b01;
    30. else
    31. next_state <= 2'b11;
    32. end
    33. 2'b10: begin
    34. if(C==1)
    35. next_state <= 2'b10;
    36. else
    37. next_state <= 2'b00;
    38. end
    39. 2'b11: begin
    40. if(C==1)
    41. next_state <= 2'b10;
    42. else
    43. next_state <= 2'b11;
    44. end
    45. default: next_state <= 2'b00;
    46. endcase
    47. // 输出,组合逻辑
    48. always@(*)begin
    49. case(curr_state)
    50. 2'b11: Y1 = 1;
    51. 2'b10: Y1 = C ? 1 : 0;
    52. 2'b00: Y1 = 0;
    53. 2'b01: Y1 = 0;
    54. endcase
    55. end
    56. assign Y = Y1;
    57. endmodule

    解法三:

    这里有别于日常所见的FSM,根据状态转移图,输出Y的表达式受当前状态以及同一时刻次态的状态影响

    1. `timescale 1ns/1ns
    2. module seq_circuit(
    3. input C ,
    4. input clk ,
    5. input rst_n,
    6. output wire Y
    7. );
    8. reg [1:0] curr_state;
    9. reg [1:0] next_state;
    10. always@(posedge clk or negedge rst_n)begin
    11. if(!rst_n)
    12. curr_state <= 2'b00;
    13. else
    14. curr_state <= next_state;
    15. end
    16. always@(*)begin
    17. case(curr_state)
    18. 2'b00: begin
    19. if(C==1)
    20. next_state <= 2'b01;
    21. else if(C==0)
    22. next_state <= 2'b00;
    23. else
    24. next_state <= next_state;
    25. end
    26. 2'b01: begin
    27. if(C==1)
    28. next_state <= 2'b01;
    29. else if(C==0)
    30. next_state <= 2'b11;
    31. else
    32. next_state <= next_state;
    33. end
    34. 2'b10: begin
    35. if(C==1)
    36. next_state <= 2'b10;
    37. else if(C==0)
    38. next_state <= 2'b00;
    39. else
    40. next_state <= next_state;
    41. end
    42. 2'b11: begin
    43. if(C==1)
    44. next_state <= 2'b10;
    45. else if(C==0)
    46. next_state <= 2'b11;
    47. else
    48. next_state <= next_state;
    49. end
    50. default: next_state <= 2'b00;
    51. endcase
    52. end
    53. assign Y = (curr_state == 2'b10 && C==1) | (curr_state == 2'b11);
    54. //这里有别于日常所见的FSM,根据状态转移图,输出Y的表达式受当前状态以及同一时刻次态的状态影响
    55. endmodule

  • 相关阅读:
    HTML—CSS盒子模型(Box Model)
    第46届ICPC东亚洲区域赛(昆明)补题题解 (B)
    商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
    react 路由拦截通过tocken进行简单拦截
    计算机操作系统-并发控制
    最优乘车——最短路
    Chapter10 : Deep Neural Networks for QSAR
    java编辑pdf(itextpdf)
    2024期权交易佣金手续费最低是多少?期权交易有哪些成本?
    Python从入门到实践(四)if语句
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126592335