题解 | #根据状态转移表实现时序电路#

根据状态转移表实现时序电路

https://www.nowcoder.com/practice/455c911bee0741bf8544a75d958425f7

根据题目的状态表可知,此题的解答需要采用状态机,所以可以选用三段式状态机,需要注意的是,输出没有延时,所以在第三段的时候,状态应该是nex_state,不能是cur_state,不然会存在一个延时一拍
`timescale 1ns/1ns

module seq_circuit(
      input                A   ,
      input                clk ,
      input                rst_n,
 
      output   wire        Y   
);
    
    localparam    Zero = 2'b00;
    localparam    One  = 2'b01;
    localparam    Two  = 2'b10;
    localparam    Thre = 2'b11;
    
    reg    Y_temp;
    
    assign Y = Y_temp;
    
    reg    [1:0]    cur_state;
    reg    [1:0]    nex_state;
    
    
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            cur_state <= Zero;
        else
            cur_state <= nex_state;
    end
    
    
    always@(*)
    begin
        nex_state = One;
        case(cur_state)
            Zero    :    nex_state = (A) ? Thre : One;
            One     :    nex_state = (A) ? Zero : Two;
            Two     :    nex_state = (A) ? One  : Thre;
            Thre    :    nex_state = (A) ? Two  : Zero;
            default :    nex_state = One;
        endcase
    end
    
    always @(posedge clk or rst_n)
    begin
        if(!rst_n)
            Y_temp <= 1'b0;
        else
            begin
                case(nex_state)         //这里需要注意的是,必须填写nex状态,因为,这个是时序逻辑,会存在延时一拍的现象,所以下个状态是他,那么下个时钟的cur就是它,那么刚好就能输出下面的非阻塞赋值,因为他也存在延时一拍的现象
                    Zero    :    Y_temp <= 1'b0;
                    One     :    Y_temp <= 1'b0;
                    Two     :    Y_temp <= 1'b0;
                    Thre    :    Y_temp <= 1'b1;
                endcase
            end
    end
    
    
endmodule

全部评论

相关推荐

勤劳的鲸鱼在okr拆解:没有别的选择就去吧,有实习和没实习找工作是天上地下
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务