饮料售卖机
三个按键,复位键,5毛投币键 1元投币键,当投入5毛亮一个灯,1元两两个灯,1.5元亮三个灯,4元亮4个灯;2.5元灯单向闪烁,代表出饮料,3元双休闪烁,代表处硬币和找零钱;
售卖机控制层代码如下所示:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 20:09:35 08/03/2020
// Design Name: robetwu
// Module Name: sell_control
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module sell_control(
input clk,
input rst_n,
input key1,key2,
output [3:0] led_out
);
reg [3:0]led;
reg [3:0] stata;
// assign led_out=led;
/*
wire [3:0] led_wire;
assign led=led_wire;*/
//状态机
parameter IDEL = 0;
parameter A1 = 1;
parameter A2 = 2;
parameter A3 = 3;
parameter A4 = 4;
parameter A5 = 5;
parameter A6 = 6;
wire scwc1;//单向闪烁完成标记
wire scwc2;//双向闪烁完成标记
//状态控制
always@(posedge clk or negedge rst_n)
if(!rst_n)
stata<=IDEL;
else
case(stata)
IDEL:
if(key1==1)
stata<=A1;
else if(key2==1)
stata<=A2;
else
stata<=IDEL;
A1:
if(key1==1)
stata<=A2;
else if(key2==1)
stata<=A3;
else
stata<=A1;
A2:
if(key1==1)
stata<=A3;
else if(key2==1)
stata<=A4;
else
stata<=A2;
A3:
if(key1==1)
stata<=A4;
else if(key2==1)
stata<=A5;
else
stata<=A3;
A4:
if(key1==1)
stata<=A5;
else if(key2==1)
stata<=A6;
else
stata<=A4;
A5:
if(scwc1==1)
stata<=IDEL;
else
stata<=A5;
A6:
if(scwc2==1)
stata<=IDEL;
else
stata<=A6;
default: stata<=IDEL;
endcase
reg single_info;
reg double_info;
wire single_info_wire=single_info;
wire double_info_wire=double_info;
//不同状态的灯亮显示
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
single_info<=0;
double_info<=0;
end
else
case(stata)
IDEL:
begin
led<=4'd0;
single_info<=0;
double_info<=0;
end
A1:
led<=4'b0001;
A2:
led<=4'b0011;
A3:
led<=4'b0111;
A4:
led<=4'b1111;
A4:
led<=4'b1111;
A5:
begin
single_info<=1;
double_info<=0;
end
A6:
begin
single_info<=0;
double_info<=1;
end
endcase
wire [3:0]led_info_1;
wire [3:0]led_info_2;
//d单向闪烁
single_led single_led_inst(
.clk(clk),
.rst_n(rst_n),
.single_info(single_info_wire),
.led_out(led_info_1),
.scwc(scwc1));
//双向闪烁
double_led double_led_inst(
.clk(clk),
.rst_n(rst_n),
.double_info(double_info_wire),
.led_out(led_info_2),
.scwc(scwc2));
//不同状态的输出
assign led_out=(stata==A5)?led_info_1:(stata==A6)?led_info_2:led;
endmodule
单向闪烁层代码如下
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 19:36:59 08/03/2020
// Design Name: robetwu
// Module Name: single_led
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module single_led(
input clk,
input rst_n,
input single_info,
output wire[3:0] led_out,
output reg scwc
);
assign led_out=led;
reg [3:0] led;
reg [19:0] cnt_10ms;
reg flag;
reg [31:0] cnt_2s;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt_2s<=0;
else if(single_info==1)
cnt_2s<=cnt_2s+1;
else
cnt_2s<=0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
scwc<=0;
else if (cnt_2s>=32'd999_999_99)
scwc<=1;
else
scwc<=0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt_10ms<=20'd0;
else if((cnt_10ms==20'd999_999)&&(single_info==1))
begin
cnt_10ms<=20'd0;
flag<=1;
end
else
if(single_info==1)
begin
cnt_10ms<=cnt_10ms+20'd1;
flag<=0;
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
led<=4'b0001;
else if((single_info==1)&&(flag==1)&&(scwc==0))
led<={led[2:0],led[3]};
endmodule
双层闪烁层如下
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 20:03:26 08/03/2020
// Design Name:
// Module Name: double_led
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module double_led(
input clk,
input rst_n,
input double_info,
output [3:0] led_out,
output reg scwc
);
assign led_out=led;
reg [3:0] led;
reg [19:0] cnt_10ms;
reg flag;
reg [31:0] cnt_2s;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt_2s<=0;
else if(double_info==1)
cnt_2s<=cnt_2s+1;
else
cnt_2s<=0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
scwc<=0;
else if (cnt_2s>=32'd999_999_99)
scwc<=1;
else
scwc<=0;
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt_10ms<=20'd0;
else if((cnt_10ms==20'd999_999)&&(double_info==1))
begin
cnt_10ms<=20'd0;
flag<=1;
end
else
if(double_info==1)
begin
cnt_10ms<=cnt_10ms+20'd1;
flag<=0;
end
always@(posedge clk or negedge rst_n)
if(!rst_n)
led<=4'b0110;
else if((double_info==1)&&(flag==1)&&(scwc==0))
led<={led[2],led[3],led[0],led[1]};
endmodule
top层代码如下
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 19:27:36 08/03/2020
// Design Name:
// Module Name: sell_box_top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module sell_box_top(
input clk,
input rst_n,
input key1,
input key2,
output [3:0] led
);
// reg [3:0] led;
wire key1_out;
wire key2_out;
sell_control sell_control(
.clk(clk),
.rst_n(rst_n),
.key1(key1_out),
.key2(key2_out),
.led_out(led)
);
//按键1(5毛)消抖
ax_debounce key1_debounce
(
.clk(clk),
.rst(~rst_n),
.button_in(key1),
.button_posedge(),
.button_negedge(key1_out),
.button_out()
);
//按键2(1元)消抖
ax_debounce key2_debounce
(
.clk(clk),
.rst(~rst_n),
.button_in(key2),
.button_posedge(),
.button_negedge(key2_out),
.button_out()
);
endmodule