题解 | #自动售卖机#
自动售卖机
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块钱,返回第一个状态。