题解 | 自动售卖机
自动售卖机
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 S0=0,S5=1,S10=2,S15=3; reg [1:0]cs; reg [1:0]ns; always@(posedge clk or negedge rst_n )begin if(!rst_n) cs<=0; else cs<=ns; end always@(*)begin if(sel==0)begin case(cs) S0:begin if(din==0) ns=S0; else if(din==1) ns=S5; else if(din==2) ns=S10; else ns=S0; end S5:begin if(din==0) ns=S0; else if(din==1) ns=S5; else if(din==2) ns=S10; else ns=S0; end S10:begin if(din==0) ns=S0; else if(din==1) ns=S5; else if(din==2) ns=S10; else ns=S0; end default:ns=S0; endcase end else begin case(cs) S0:begin if(din==0) ns=S0; else if(din==1) ns=S5; else if(din==2) ns=S10; else ns=S0; end S5:begin if(din==0) ns=S5; else if(din==1) ns=S10; else if(din==2) ns=S15; else ns=S5; end S10:begin if(din==0) ns=S0; else if(din==1) ns=S5; else if(din==2) ns=S10; else ns=S0; end S15:begin if(din==0) ns=S0; else if(din==1) ns=S5; else if(din==2) ns=S10; else ns=S0; end default:ns=S0; endcase end end always@(posedge clk or negedge rst_n)begin if(!rst_n) drinks_out<=0; else if(sel==0)begin if(ns==S5||ns==S10) drinks_out<=1; else drinks_out<=0; end else begin if(ns==S10||ns==S15) drinks_out<=2; else drinks_out<=0; end end always@(posedge clk or negedge rst_n)begin if(!rst_n) change_out<=0; else if(sel==0)begin if(ns==S10) change_out<=1; else change_out<=0; end else begin if(ns==S15) change_out<=1; else change_out<=0; end end endmodule
这题隐含了两个东西,第一个是在卖完以后不会到初始状态,会接着检测输入。第二个在买饮料2的时候,貌似当钱不够的是时候会一直等待够为止,不会吞钱重新算。