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

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

https://www.nowcoder.com/practice/e405fe8975e844c3ab843d72f168f9f4

`timescale 1ns/1ns

module seq_circuit(
   input                C   ,
   input                clk ,
   input                rst_n,
 
   output   wire        Y   
);

reg y_r;
reg [1:0] s, ns;
parameter P_S0 = 2'b00 , P_S1 = 2'b01 , P_S2 = 2'b11, P_S3 = 2'b10;

//first always state change
always@(posedge clk or negedge rst_n) begin
    if(!rst_n)
        s <= P_S0;
    else
        s <= ns;
end

//secend always state shif rules combination
always@(s or C) begin
    case(s)
        P_S0: begin
            if(C)
                ns = P_S1;
            else
                ns = P_S0;
        end
        P_S1: begin
            if(C)
                ns = P_S1;
            else
                ns = P_S2;
        end 
        P_S2:begin
            if(C)
                ns = P_S3;
            else
                ns = P_S2;
        end 
        P_S3:begin
            if(C)
                ns = P_S3;
            else
                ns = P_S0;
        end 
        default: ns = P_S0;
    endcase
end

//third always output logic
//always@(posedge clk or negedge rst_n) begin
always@(*) begin
        case (s)
            P_S0: y_r = 1'b0;
            P_S1: y_r = 1'b0;
            P_S2: y_r = 1'b1;
            P_S3:begin
                 if(C) y_r = 1'b1;
                 else y_r = 1'b0;
            end
            default: y_r = 1'b0;
        endcase
end
assign Y = y_r;
endmodule

全部评论
assign语句不能放在always块内。第三段状态机用时序写的话输出会有一个clk的延时,还未找到解决办法,所以使用logic实现。 也有可能时因为combination第二段使用了阻塞赋值而不是非阻塞
点赞 回复 分享
发布于 2023-09-11 10:50 北京

相关推荐

评论
点赞
收藏
分享

创作者周榜

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