题解 | 自动贩售机2(mealy三段)

自动贩售机2

https://www.nowcoder.com/practice/298dec1c3dce45c881f3e53e02558828

和上一题一样,对输入寄存用mealy三段,注意输出逻辑要排除{d2,d1}==2'b00的情况

输入控制有sel和d2,d1,寄存为sel_reg和inp_reg

`timescale 1ns / 1ns

module seller2 (
    input wire clk,
    input wire rst,
    input wire d1,
    input wire d2,
    input wire sel,

    output reg out1,
    output reg out2,
    output reg out3
);
    //*************code***********//
    reg [1:0] inp_reg;
    reg sel_reg;
    // assign inp_reg={d2,d1};
    localparam [2:0] S0 = 3'b000, S5 = 3'b001, S10 = 3'b010, S15 = 3'b011, S20 = 3'b100;
    reg [2:0] cs, ns;
    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            inp_reg <= 0;
            sel_reg <= 0;
        end else begin
            inp_reg <= {d2, d1};
            sel_reg <= sel;
        end
    end
    always @(posedge clk or negedge rst) begin
        if (!rst) cs <= S0;
        else cs <= ns;
    end
    always @(*) begin
        case (cs)
            S0:
            case (inp_reg)
                2'b01:   ns = S5;
                2'b10:   ns = S10;
                default: ns = cs;
            endcase
            S5:
            case (inp_reg)
                2'b01:   ns = S10;
                2'b10:   ns = sel_reg ? S10 : S0;
                default: ns = cs;
            endcase
            S10:
            case (inp_reg)
                2'b01:   ns = sel_reg ? S15 : S0;
                2'b10:   ns = sel_reg ? S20 : S0;
                default: ns = cs;
            endcase
            S15:
            case (inp_reg)
                2'b01:   ns = S20;
                2'b10:   ns = S0;
                default: ns = cs;
            endcase
            S20:
            case (inp_reg)
                2'b01:   ns = S0;
                2'b10:   ns = S0;
                default: ns = cs;
            endcase
            default: ns = S0;
        endcase
    end
    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            out1 <= 0;
            out2 <= 0;
            out3 <= 0;
        end else begin
            case (sel_reg)
                0: begin
                    out1 <= (cs == S5 && inp_reg == 2'b10) | (cs == S10 && inp_reg == 2'b10) | (cs == S10 && inp_reg == 2'b01);
                    out2 <= 0;
                    out3 <= (cs == S10 && inp_reg == 2'b10);
                end
                1: begin
                    out1 <= 0;
                    out2 <= (cs == S15 && inp_reg == 2'b10) | (cs == S20 && inp_reg == 2'b10) | (cs == S20 && inp_reg == 2'b01);
                    out3 <= (cs == S20 && inp_reg == 2'b10);
                end
            endcase
        end
    end


    //*************code***********//
endmodule

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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