题解 | #自动贩售机1#
自动贩售机1
http://www.nowcoder.com/practice/dcf59e6c51f6489093495acb1bc34dd8
`timescale 1ns/1ns
module seller1(
input wire clk ,
input wire rst ,
input wire d1 ,
input wire d2 ,
input wire d3 ,
output reg out1,
output reg [1:0]out2
);
/*
idle: non money
s1 0.5
s2 1
s3 1.5
s4 2
s5 2.5
s6 3
s7 3.5
*/
localparam idle = 6'b000000;
localparam s1 = 6'b000001;
localparam s2 = 6'b000010;
localparam s3 = 6'b000100;
localparam s4 = 6'b001000;
localparam s5 = 6'b010000;
localparam s6 = 6'b100000;
reg [5:0] cs,ns;
wire [2:0] din;
assign din = {d3,d2,d1}; //d3 2 d2 1 d1 0.5
always @(posedge clk or negedge rst) begin
if(!rst) cs <= idle;
else cs <= ns;
end
always@(*) begin
case (cs)
idle: begin
case (din)
3'b001: ns = s1;
3'b010: ns = s2;
3'b100: ns = s4;
default: ns = ns;
endcase
end
s1 : begin
case (din)
3'b001: ns = s2;
3'b010: ns = s3;
3'b100: ns = s5;
default: ns = ns;
endcase
end
s2 : begin
case (din)
3'b001: ns = s3;
3'b010: ns = s4;
3'b100: ns = s6;
default: ns = ns;
endcase
end
s3 : ns = idle;
s4 : ns = idle;
s5 : ns = idle;
s6 : ns = idle;
default: ns = idle;
endcase
end
always @(posedge clk or negedge rst) begin
if (!rst) begin
out1 <= 'b0;
out2 <= 2'b0;
end
else begin case (ns)
s3: begin
out1 <= 1'b1;
out2 <= 2'b0;
end
s4: begin
out1 <= 1'b1;
out2 <= 2'b01;
end
s5: begin
out1 <= 1'b1;
out2 <= 2'b10;
end
s6: begin
out1 <= 1'b1;
out2 <= 2'b11;
end
default: begin
out1 <= 1'b0;
out2 <= 2'b00;
end
endcase
end
end
endmodule
module seller1(
input wire clk ,
input wire rst ,
input wire d1 ,
input wire d2 ,
input wire d3 ,
output reg out1,
output reg [1:0]out2
);
/*
idle: non money
s1 0.5
s2 1
s3 1.5
s4 2
s5 2.5
s6 3
s7 3.5
*/
localparam idle = 6'b000000;
localparam s1 = 6'b000001;
localparam s2 = 6'b000010;
localparam s3 = 6'b000100;
localparam s4 = 6'b001000;
localparam s5 = 6'b010000;
localparam s6 = 6'b100000;
reg [5:0] cs,ns;
wire [2:0] din;
assign din = {d3,d2,d1}; //d3 2 d2 1 d1 0.5
always @(posedge clk or negedge rst) begin
if(!rst) cs <= idle;
else cs <= ns;
end
always@(*) begin
case (cs)
idle: begin
case (din)
3'b001: ns = s1;
3'b010: ns = s2;
3'b100: ns = s4;
default: ns = ns;
endcase
end
s1 : begin
case (din)
3'b001: ns = s2;
3'b010: ns = s3;
3'b100: ns = s5;
default: ns = ns;
endcase
end
s2 : begin
case (din)
3'b001: ns = s3;
3'b010: ns = s4;
3'b100: ns = s6;
default: ns = ns;
endcase
end
s3 : ns = idle;
s4 : ns = idle;
s5 : ns = idle;
s6 : ns = idle;
default: ns = idle;
endcase
end
always @(posedge clk or negedge rst) begin
if (!rst) begin
out1 <= 'b0;
out2 <= 2'b0;
end
else begin case (ns)
s3: begin
out1 <= 1'b1;
out2 <= 2'b0;
end
s4: begin
out1 <= 1'b1;
out2 <= 2'b01;
end
s5: begin
out1 <= 1'b1;
out2 <= 2'b10;
end
s6: begin
out1 <= 1'b1;
out2 <= 2'b11;
end
default: begin
out1 <= 1'b0;
out2 <= 2'b00;
end
endcase
end
end
endmodule
