一、背景知识
1.接受的只有两种面值: 0.5美元和1美元纸币
2.商品定价为1.5美元
二、代码
sale_machine.v代码如下:
c
`timescale 1ns / 1ps
module sale_machine(
input clk ,
input rst ,
input half_dollar ,
input one_dollar ,
output reg half_out ,
output reg [1:0] sell ,
output reg fetch
);
reg [2:0] status;
localparam idle = 3'b000;
localparam half = 3'b001;
localparam one = 3'b010;
localparam one_half = 3'b011;
localparam two = 3'b100;
always @(posedge clk)
begin
if(!rst)
begin
half_out = 0;
sell = 0;
fetch = 0;
status = 0;
end
else
case(status)
idle:
if(half_dollar) begin
status = half;
half_out = 0;
sell = 2'b00;
fetch =1'b0;
end
else if(one_dollar) begin
half_out = 0;
sell = 2'b00;
fetch =1'b0;
status = one;
end
half:
if(half_dollar) begin
status = one;
half_out = 0;
sell = 2'b00;
fetch =1'b0;
end
else if(one_dollar) begin
status =one_half;
half_out = 0;
sell = 2'b00;
fetch =1'b0;
end
one_half:
if(half_dollar) begin
status = two;
half_out = 0;
sell = 2'b00;
fetch =1'b0;
end
else if(one_dollar)
begin
half_out = 0;
sell = 2'b01;
fetch =1'b1;
status = idle;
end
two:
if(half_dollar)
begin
half_out = 1'b1;
sell = 2'b01;
fetch =1'b1;
status = idle;
end
else if( one_dollar )
begin
half_out = 1'b1;
sell = 2'b10;
fetch =1'b1;
status = idle;
end
default: begin
half_out = 0;
sell = 2'b01;
fetch =1'b1;
status = idle;
end
endcase
end
endmodule
仿真文件sale_machine_tb.v:
c
`timescale 1ns / 1ps
module sale_machine_tb;
reg clk ;
reg rst ;
reg half_dollar ;
reg one_dollar ;
wire half_out ;
wire [1:0] sell ;
wire fetch ;
parameter cycle = 20;
always #(cycle/2) clk =~clk;
sale_machine u_machine(
.clk (clk ) ,
.rst (rst ) ,
.half_dollar (half_dollar) ,
.one_dollar (one_dollar ) ,
.half_out (half_out ) ,
.sell (sell ) ,
.fetch (fetch )
);
initial begin
clk =0;
rst=0;
half_dollar =0;
one_dollar =0;
#cycle rst = 1'b1; half_dollar = 1'b1;
#(cycle * 10 ) $finish;
end
endmodule
三、仿真图

四、原理图
