题解 | #自动售卖机#

自动售卖机

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   
);
    reg state,next_state;
    parameter save0 = 0;
    parameter save5 = 1;
    //售货机上暂存的钱0或5
    //sel信号会先于din信号有效,且在购买一种饮料时值不变

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            state <= save0;
        else
            state <= next_state;
    end
    always @(*) begin
        case(state)
            save0: begin
                if(din==1 && sel==1) //给5块买10块饮料
                    next_state <= save5;
                else 
                    next_state <= save0;
            end
            save5: begin
                if(din==0)
                    next_state <= save5;
                else
                    next_state <= save0;
            end
            default: next_state <= save0;
        endcase
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            drinks_out <= 0;
            change_out <= 0;
        end
        else begin
            case(state)
                save0: begin
                    if(din==0) begin
                        drinks_out <= 0;
                        change_out <= 0;
                    end
                    else if(din==1 && sel==0) begin
                        drinks_out <= 1;
                        change_out <= 0;
                    end
                    else if(din==1 && sel==1) begin
                        drinks_out <= 0;
                        change_out <= 0;
                    end
                    else if(din==2 && sel==0) begin
                        drinks_out <= 1;
                        change_out <= 1;
                    end
                    else if(din==2 && sel==1) begin
                        drinks_out <= 2;
                        change_out <= 0;
                    end
                    else begin
                        drinks_out <= 0;
                        change_out <= 0;
                    end
                end
                save5: begin
                    if(din==0) begin
                        drinks_out <= 0;
                        change_out <= 0;
                    end
                    else if(din==1) begin
                        drinks_out <= 2;
                        change_out <= 0;
                    end
                    else if(din==2) begin
                        drinks_out <= 2;
                        change_out <= 1;
                    end
                    else begin
                        drinks_out <= 0;
                        change_out <= 0;
                    end
                end
            endcase
        end
    end
    

endmodule

有两种状态,一种状态是售货机不存钱,给钱够就出货,给钱多了就找零,另一种状态是只有在给五块钱买10块钱的饮料时才会出现,题目说明sel信号会先于din信号有效,且在购买一种饮料时值不变,这时售货机存下五块钱,处于等待继续投钱的状态,而且这期间sel一直是1不会改变。当存五块钱的状态下,收到5块钱,就出饮料B,返回第一个状态,收到10块钱,就出饮料B,找零5块钱,返回第一个状态。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务