基于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%105)
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;
[email protected](wuyuan)
begin
iB=iA;
case(wuyuan)
1’b1:iB=7’b0101;
endcase
end
[email protected](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
[email protected](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
电路图:
仅供参考,希望能帮到需要的人。
|