2020-08-06

饮料售卖机

三个按键,复位键,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值