题解 | #自动售卖机#

自动售卖机

https://www.nowcoder.com/practice/487953e6d3e3434988e0dd6960b6c9f8

`timescale 1ns/1ns

module sale(
   input                clk   ,
   input                rst_n ,
   input                sel   ,//sel=0,5$dranks,sel=1,10&=$drinks
   input          [1:0] din   ,//din=1,input 5$,din=2,input 10$
 
   output   reg [1:0] drinks_out,//drinks_out=1,output 5$ drinks,drinks_out=2,output 10$ drinks
   output   reg      change_out   
);
    localparam IDLE = 3'd0;
    localparam A1 = 3'd1;
    localparam A2 = 3'd2;

    localparam B1 = 3'd3;
    localparam B2 = 3'd4;
    localparam B3 = 3'd5;

    reg [2:0] state, nxt_state;
    wire [2:0] change = {sel,din};
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            state <= IDLE;
        else
            state <= nxt_state;
    end
    
    always@(*)begin
        case(state)
            IDLE: begin
                case(change)
                    3'b101:nxt_state <= B1;
                    3'b110:nxt_state <= B2;
                    3'b100:nxt_state <= IDLE;

                    3'b000:nxt_state <= IDLE;
                    3'b001:nxt_state <= A1;
                    3'b010:nxt_state <= A2;
                    default:nxt_state <=IDLE;
                endcase
            end

            B1:begin
                case(change)
                    3'b100:nxt_state <= B1;
                    3'b101:nxt_state <= B2;
                    3'b110:nxt_state <= B3;
                endcase
            end

            B2:begin
                 case(change)
                    3'b101:nxt_state <= B1;
                    3'b110:nxt_state <= B2;
                    default:nxt_state <= IDLE;
                endcase
            end 
            B3: begin
               case(change)
                    3'b101:nxt_state <= B1;
                    3'b110:nxt_state <= B2;
                    default:nxt_state <= IDLE;
                endcase
            end 
            A1: begin
                 case(change)
                    3'b001:nxt_state <= A1;
                    3'b010:nxt_state <= A2;
                    default:nxt_state <= IDLE;
                endcase
            end 
            A2:begin
               case(change)
                    3'b001:nxt_state <= A1;
                    3'b010:nxt_state <= A2;
                    default:nxt_state <= IDLE;
               endcase
            end
        endcase
    end

    always@(*)begin
        if(state == B3 ||state == B2)
            drinks_out <=  2'b10;
        else if(state == A1 || state == A2)
            drinks_out <= 2'b01;
        else 
            drinks_out <= 0;
    end

    always@(*)begin
        if(state == B3 || state == A2)
            change_out<=1;
        else 
            change_out <= 0;
    end
   
    
            
endmodule

把两端状态机分开不香吗哈哈

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
05-14 18:44
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务