基于verlog的简单自动售货机设计

课程设计:基于verlog的简单自动售货机设计

1.设计目的:
(1)了解DE2-70开发板的硬件构成;
(2)熟悉开发板可用资源的硬件电路;
(3)掌握EDA开发流程;
(4)熟悉Quartus II开发环境;
(5)掌握Verilog基本语法;
(6)熟练掌握在Quartus II环境下进行软件仿真的方法。

2.设计内容及基本要求:
设计一个小商品自动售货机,要求如下:
(1)基本功能
①售货机只售出价值为5角、1元、1.5元和2元的小商品。购买者每次通过开关选择一种小商品进行购买。
②用开关分别模拟5角、1元硬币和5元纸币投入(一次只能投入一个硬币或一张纸币)。当所投面值达到或超出购买者所选面值,并确认购买时,购买成功:小商品对应的灯亮表示售出。投入确认和购买确认可用按钮。
③当所投币值不足面值时,可通过一个复位按钮退回所投币值,回到初始状态。
④若退回或找零时,用几组灯分别表示找零数量:一组灯表示找回的5元纸币的数量,一组灯表示找回的1元的数量,一组表示找回的5角的数量。
⑤售出货物或退回后,都回到初始状态。
(2)扩展功能
退回或找零时,用七段数码管显示找零金额。显示系统时间(时:分:秒)

3.撰写课程设计报告。报告内容要求如下:
设计题目、目的、内容;
设计思路;
系统电路图;
各功能模块的功能、实现方法、电路图(源代码)、功能仿真图;
开发板硬件资源使用情况;
FPGA引脚分配表;
编程模块的源代码清单;
设计时碰到的问题及解决方法。

1 售货模块代码

module auto_seller(clk,rst,dis_mony,dis_monywujiao,dis_monywuyuan,return_mony,btn_ok,btn_mon,btn_sell,led_warn,led,beep);
input clk,rst,btn_ok,return_mony;
input [2:0] btn_mon;//选择放入的钱
input [3:0] btn_sell;//选择商品bbt_5,gz_10,kqs_15,kl_20
output [3:0] led;//led_5,led_10,led_15,led_20
output led_warn;//钱不足,指示灯
output [3:0] dis_mony;//display the return mony [4,3,2,1]->1
//output [11:0] dis_mony5;//数码管显示价钱
output beep;
output dis_monywujiao;//12121
output dis_monywuyuan;

reg clk_500Hz;
reg [3:0] led;//led_5,led_10,led_15,led_20
reg led_warn;//警告放入钱不足
reg [3:0] dis_mony;// [4,3,2,1]->1

reg [9:0] price,price_all,mony_all;

reg beep=0;
reg dis_monywujiao=0;
reg dis_monywuyuan=0;

always @(negedge rst or posedge clk)
begin
if(!rst)
begin
led = 4’b0000;//LED灭
price_all = 0;//价格清零
led_warn = 0;
price = 0;
beep = 0;
dis_mony=0;
dis_monywuyuan=0;
dis_monywujiao=0;
dis_mony=4’b1101;
end
else
begin/三种面值共8种组合/
case(btn_mon)
3’b001:begin mony_all =5;end
3’b010:begin mony_all = 10;end
3’b100:begin mony_all = 50;end
endcase
begin

price_all=price_all+mony_all;

end
case(btn_sell)
4’b0001:begin price = 5;
end
4’b0010:begin price = 10;
end
4’b0100:begin price = 15;
end
4’b1000:begin price = 20;
end
default:begin price = 0;
end
endcase
if(btn_ok == 1)
begin
if(price_all < price) //放入钱不足
begin
led_warn = 1;
price = 0;

if(return_mony1)
begin
if(price_all<50)
begin
if(price_all%10
5)
begin
dis_monywujiao=1;
end
case(price_all/10)

1: begin dis_mony = 4’b0001;end
2: begin dis_mony = 4’b0011;end
3: begin dis_mony= 4’b0111;end
4: begin dis_mony = 4’b1111;end

default: begin dis_mony = 4’b0000;end
endcase

end
else
begin
if(price_all/50==1)
begin
dis_monywuyuan=1;
end

end

end
end
else
begin //金钱足够
price_all = price_all-price;
beep = 1;
case(price) //LED灯显示货物卖出
5: begin led = 4’b0001;end
10:begin led = 4’b0010;end
15:begin led = 4’b0100;end
20:begin led = 4’b1000;end
endcase
end

if(return_mony==1)
begin
if(price_all<50)
begin

if(price_all%10==5)
begin
dis_monywujiao=1;
end

case(price_all/10)

1: begin dis_mony = 4’b0001;end
2: begin dis_mony = 4’b0011;end
3: begin dis_mony= 4’b0111;end
4: begin dis_mony = 4’b1111;end

default: begin dis_mony = 4’b0000;end
endcase

else
begin
if(price_all/50==1)
begin
dis_monywuyuan=1;
end

end

end

end
end
end
endmodule
2.显示模块代码
module aaa(iA,oY,ow,wujiao,wuyuan);

input [3:0] iA;
input wujiao;
input wuyuan;
output [6:0]oY;
output [7:0]ow;

reg[7:0]ow;
reg [3:0]iB;
reg[6:0]oY;
always@(wuyuan)
begin
iB=iA;
case(wuyuan)

1’b1:iB=7’b0101;
endcase

end

always@(iB)
begin

case(iB)
4’b0000:oY=7’b1000000;
4’b0001:oY=7’b1111001;
4’b0011:oY=7’b0100100;
4’b0111:oY=7’b0110000;
4’b1111:oY=7’b0011001;
4’b0101:oY=7’b0010010;
4’b1101:oY=7’b11000110;
default:oY=7’b1111111;
endcase

end

always@(wujiao)
begin
case(wujiao)

1’b1:ow=8’b10010010;

default:ow=8’b10000110;
endcase

end
endmodule
3.时间模块代码
module system_time(cleartime,clk,led0,led1,led2,led3,led4,led5,led6,led7);
input clk;
input cleartime;
output led0,led1,led2,led3,led4,led5,led6,led7;
reg [7:0] led0,led1,led2,led3,led4,led5,led6,led7;
reg [3:0] time1,time2,time3,time4,time5,time6;
reg [7:0] time_h;
reg [7:0] time_m;
reg [7:0] time_s;
reg [31:0]count1,count2;

always @(posedge  clk or posedge cleartime)
if(cleartime)
begin 
	count1=0;
	count2=0;
	time_h=8'b00000000;	
	time_m=8'b00000000;	
	time_s=8'b00000000;	
		
	led1=8'b11000000;
	led0=8'b11000000;
	led2=8'b11000000;
	led3=8'b11000000;
	led4=8'b11000000;
	led5=8'b11000000;
	led6=8'b11000000;
	led7=8'b11000000;
	led8=8'b11000000;
		
end
else
	begin
		if(count1<50000000)
			count1=count1+1;
		else
		begin 
			count1=0;
			if(time_s==59)
			begin 
				time_s<=0;
				if(time_m==59)
				begin
					time_m<=0;
					if(time_h==23)
						time_h<=0;
					else
						time_h<=time_h+1;
				end
				else
					time_m<=time_m+1;				
			end
			else
				time_s<=time_s+1;
		
		
		
		time1=time_s%4'd10;
		time2=time_s/4'd10;
		time3=time_m%4'd10;
		time4=time_m/4'd10;
		time5=time_h%4'd10;
		time6=time_h/4'd10;
			
		
		begin
			case(time1)
				0:led0=8'b11000000;
				1:led0=8'b11111001;
				2:led0=8'b10100100;
				3:led0=8'b10110000;
				4:led0=8'b10011001;
				5:led0=8'b10010010;
				6:led0=8'b10000010;
				7:led0=8'b11111000;
				8:led0=8'b10000000;
				9:led0=8'b10010000;
			endcase
		end
		
		begin
			case(time2)
				0:led1=8'b11000000;
				1:led1=8'b11111001;
				2:led1=8'b10100100;
				3:led1=8'b10110000;
				4:led1=8'b10011001;
				5:led1=8'b10010010;
				6:led1=8'b10000010;
				7:led1=8'b11111000;
				8:led1=8'b10000000;
				9:led1=8'b10010000;
			endcase
		end
		
		begin
			case(time3)
				0:led2=8'b11000000;
				1:led2=8'b11111001;
				2:led2=8'b10100100;
				3:led2=8'b10110000;
				4:led2=8'b10011001;
				5:led2=8'b10010010;
				6:led2=8'b10000010;
				7:led2=8'b11111000;
				8:led2=8'b10000000;
				9:led2=8'b10010000;
			endcase
		end
		
		begin
			case(time4)
				0:led3=8'b11000000;
				1:led3=8'b11111001;
				2:led3=8'b10100100;
				3:led3=8'b10110000;
				4:led3=8'b10011001;
				5:led3=8'b10010010;
				6:led3=8'b10000010;
				7:led3=8'b11111000;
				8:led3=8'b10000000;
				9:led3=8'b10010000;
			endcase
		end
		
		begin
			case(time5)
				0:led4=8'b11000000;
				1:led4=8'b11111001;
				2:led4=8'b10100100;
				3:led4=8'b10110000;
				4:led4=8'b10011001;
				5:led4=8'b10010010;
				6:led4=8'b10000010;
				7:led4=8'b11111000;
				8:led4=8'b10000000;
				9:led4=8'b10010000;
			endcase
		end
		
		begin
			case(time6)
				0:led5=8'b11000000;
				1:led5=8'b11111001;
				2:led5=8'b10100100;
				3:led5=8'b10110000;
				4:led5=8'b10011001;
				5:led5=8'b10010010;
				6:led5=8'b10000010;
				7:led5=8'b11111000;
				8:led5=8'b10000000;
				9:led5=8'b10010000;
			endcase
		end	
		end

	end

endmodule

电路图:

在这里插入图片描述在这里插入图片描述
仅供参考,希望能帮到需要的人。
|

附录引脚分配表

猜你喜欢

转载自blog.csdn.net/weixin_42821448/article/details/86750015