题解 | #自动售卖机#

自动售卖机

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   
);
parameter IDLE = 0;
parameter WAIT = 1;
reg [1:0] state;
reg [1:0] nstate;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        state <= IDLE;
    else 
        state <= nstate;
end

always @(*) begin
    if(!rst_n) begin 
        nstate <= IDLE;
        drinks_out <= 0;
        change_out <= 0;
    end 
    else begin
        case(state)
         IDLE: begin
            case(sel)
                0: begin
                    nstate <= IDLE;
                    end
                1: begin
                    case(din) 
                        0: nstate <= IDLE;
                        1: nstate <= WAIT;
                        2: nstate <= IDLE;
                    endcase
                    end
            endcase
            end
          WAIT: begin
             case(din)
                0: nstate <= WAIT;
                1: nstate <= IDLE;
                2: nstate <= IDLE;
             endcase
          end


        endcase 
    end
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        drinks_out <= 0;
        change_out <= 0;
    end 
    else begin
        case (state)
            IDLE: begin
                case(sel)
                    0:begin
                        if (din == 0) begin
                            drinks_out <= 0;
                            change_out <= 0;
                        end
                        else if (din == 1) begin
                            drinks_out <= 2'b01;
                            change_out <= 0;
                        end
                        else begin
                            drinks_out <= 2'b01;
                            change_out <= 1;
                        end
                    end
                    1:begin
                        if (din == 0) begin
                            drinks_out <= 0;
                            change_out <= 0;
                        end
                        else if (din == 1) begin
                            drinks_out <= 0;
                            change_out <= 0;
                        end
                        else begin
                            drinks_out <= 2'b10;
                            change_out <= 0;
                        end
                    end
                endcase
            end
            WAIT: begin
                case(din)
                    0:begin
                        drinks_out <= 0;
                        change_out <= 0;
                    end
                    1:begin
                        drinks_out <= 2'b10;
                        change_out <= 0;
                    end
                    2:begin
                        drinks_out <= 2'b10;
                        change_out <= 1;
                    end                                        
                endcase
            end
        endcase
    end 
end






endmodule

该题主要分为IDLE和WAIT两个状态,sel信号优先级高,作为一级状态跳转判断条件。

如能成功完成购买或者根本未投钱则次态还是IDLE,

仅当投入钱且钱不够的时候次态为WAIT。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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