题解 | #自动售卖机#
自动售卖机
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 = 'd0; parameter s1 = 'd1; parameter s2 = 'd2; parameter s3 = 'd3; reg [1:0] state,nstate; always@(posedge clk,negedge rst_n)begin if(!rst_n) state <= s0; else state <= nstate; end always@(*)begin if(!rst_n) nstate = s0; else if(sel == 'd0) nstate = s0; else if(sel == 'd1)begin case(state) s0:begin if(din == 'd0) nstate = s0; else if(din == 'd1) nstate = s1; else nstate = s0; end s1:begin if(din == 'd0) nstate = s1; else nstate = s0; end default:nstate = s0; endcase end else nstate =s0; end always@(posedge clk,negedge rst_n)begin if(!rst_n)begin drinks_out <= 'd0; change_out <= 'd0; end else if(sel == 'd0)begin if(din == 'd0)begin drinks_out <= 'd0; change_out <= 'd0; end else if(din == 'd1)begin drinks_out <= 'd1; change_out <= 'd0; end else if(din == 'd2)begin drinks_out <= 'd1; change_out <= 'd1; end else begin drinks_out <= 'd0; change_out <= 'd0; end end else if(sel == 'd1)begin if(state == s1)begin if(din == 'd0)begin drinks_out <= 'd0; change_out <= 'd0; end else if(din == 'd1)begin drinks_out <= 'd2; change_out <= 'd0; end else if(din == 'd2)begin drinks_out <= 'd2; change_out <= 'd1; end else begin drinks_out <= 'd0; change_out <= 'd0; end end else if(state == s0)begin if(din == 'd2)begin drinks_out <= 'd2; change_out <= 'd0; end else begin drinks_out <= 'd0; change_out <= 'd0; end end else begin drinks_out <= 'd0; change_out <= 'd0; end end else begin drinks_out <= 'd0; change_out <= 'd0; end end endmodule