Verilog 课程设计
------自动售货机
完成时间:2010/6/15
一、实验目的
1)设计一个自动售货机,此机能出售 1 元、2 元、5 元、10 元的四种商品。
出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品
的价格。
2)顾客投入硬币的钱数也是有 1 元、2 元、5 元、10 元四种,但每次只能投
入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将
投币额显示出来。
3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间 3 秒(可
用点阵模拟报警)。如果投币额足够时自动送出货物(送出的货物用相应不同的
指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
4)顾客一旦按动确认键 3 秒后,自动售货机即可自动恢复到初始状态,此时
才允许顾客进行下一次购货操作。
5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管
显示,显示 2 位即可。此累加器只有商家可以控制清零。
6)此售货机要设有一个由商家控制的整体复位控制。
二、实验原理
首先应搭建识别模块,将代表每种硬币的拨码开关信号转变为 BCD 码进行
累加。当累加完成后,将累加结果与代表商品的 BCD 码相比较。如果大于售出
商品并对两个 BCD 码求差,求差的结果作为找钱信号;如果等于直接售出商品;
小于则报警。至于统计卖钱额,则是对售出的商品进行累加。
三、分析与设计思路
可分为以下模块
1)分频模块。
2)计时模块。用于控制确认键后到恢复初始化的 3 秒计时。
3)识别模块。将每种硬币、货品的拨码开关信号转变为编码 。
4)清零模块 。用于销售总额的清零。
5)初始化模块
6)控制模块。用于数据读入、投币不足、交易成功状态的控制及转化。
7)显示模块
四、程序代码段
module autoseller(clk,g,m,yes,read,zero,led_dig,led_seg,led_c,led_r,led);
input clk,yes,read,zero;//确定键,商家读取键,清零键
input [3:0] g , m; //货品及投币选择键
output led_dig,led_seg,led_c,led_r,led;//数码管输出及点阵输出
reg f_100;//分频时钟
reg f_1;
reg [3:0] goods,money,led,change,g_c;
integer r,a,b, a_tmp2,a_tmp1;
integer ret=0;//用于控制各状态间的转换
reg [9:0]count;
reg [7:0] led_c,led_r,led_dig,led_seg;
reg [1:0]state;
integer i;
reg x;
always @ (posedge clk) //分频模块
begin
if(a_tmp2==999)
begin
f_100=~f_100;
a_tmp2<=0;
end
else
a_tmp2<=a_tmp2+1;
end
always @ (posedge clk)
begin
if(a_tmp1==9999999)
begin
f_1=~f_1;
a_tmp1<=0;
end
else
a_tmp1<=a_tmp1+1;
end
always @ (posedge f_1)
begin
if(ret!=0) //用于按确认键后的计时
begin
a=a+1;
end
else
begin
a=0;
end
end
always @ (posedge f_100)
begin
if(zero==0)
begin
//清零
count=0;
end
if(read!=0)
begin
识别模块
//
case(g)
4'b0001:begin goods=1;end
4'b0010:begin goods=2;end
4'b0100:begin goods=5;end
4'b1000:begin goods=10;end
default:begin goods=0;end
endcase
case(m)
4'b0001:begin money=1;end
4'b0010:begin money=2;end
4'b0100:begin money=5;end
4'b1000:begin money=10;end
default:begin money=0;end
endcase
//非商家读取模式(普通读写模式)
//表每种货品的拨码开关信号转变为编码
//表每种硬币的拨码开关信号转变为编码
if(a==3)
//初始化
begin
ret=0;
led=4'b0000;
led_c=8'b0000_0000;led_r=8'b1111_1111;
x=0;
end
if(yes==0)
//按确定键
begin
if(money
//交易成功销售总额增加
if(x==0)
begin
count=count+goods;
x=1;
end
end
end
g_c=goods;
//显示模块
if(ret==1) //金额不足,数码管报警
begin
led_c=8'b1111_1111;led_r=8'b0000_0000;
end
if(ret==2)//交易成功
begin
case(goods) //LED 灯显示货物
1:begin led=4'b0001;end
2:begin led=4'b0010;end
5:begin led=4'b0100;end
10:begin led=4'b1000;end
endcase
g_c=change;
end
case(state)
//显示选择的货物
0:begin
r=g_c % 10;
led_dig=8'b1111_1011;
case(r)
0:begin led_seg=8'b1111_1100;end
1:begin led_seg=8'b0110_0000;end
2:begin led_seg=8'b1101_1010;end
3:begin led_seg=8'b1111_0010;end
4:begin led_seg=8'b0110_0110;end
5:begin led_seg=8'b1011_0110;end
6:begin led_seg=8'b1011_1110;end
7:begin led_seg=8'b1110_0000;end
8:begin led_seg=8'b1111_1110;end
9:begin led_seg=8'b1111_0110;end
endcase
end
1:begin
r=g_c / 10;
led_dig=8'b0111_1111;
case(r)
0:begin led_seg=8'b1111_1100;end
1:begin led_seg=8'b0110_0000;end
2:begin led_seg=8'b1101_1010;end
3:begin led_seg=8'b1111_0010;end
4:begin led_seg=8'b0110_0110;end
5:begin led_seg=8'b1011_0110;end
6:begin led_seg=8'b1011_1110;end
7:begin led_seg=8'b1110_0000;end
8:begin led_seg=8'b1111_1110;end
9:begin led_seg=8'b1111_0110;end
endcase
end
//显示投入的钱数及余额
2:begin
r=money % 10;
led_dig=8'b1110_1111;
case(r)
0:begin led_seg=8'b1111_1100;end
1:begin led_seg=8'b0110_0000;end
2:begin led_seg=8'b1101_1010;end
3:begin led_seg=8'b1111_0010;end
4:begin led_seg=8'b0110_0110;end
5:begin led_seg=8'b1011_0110;end
6:begin led_seg=8'b1011_1110;end
7:begin led_seg=8'b1110_0000;end
8:begin led_seg=8'b1111_1110;end
9:begin led_seg=8'b1111_0110;end
endcase
r=money / 10;
led_dig=8'b1111_0111;
case(r)
0:begin led_seg=8'b1111_1100;end
1:begin led_seg=8'b0110_0000;end
2:begin led_seg=8'b1101_1010;end
3:begin led_seg=8'b1111_0010;end
4:begin led_seg=8'b0110_0110;end
5:begin led_seg=8'b1011_0110;end
6:begin led_seg=8'b1011_1110;end
7:begin led_seg=8'b1110_0000;end
8:begin led_seg=8'b1111_1110;end
9:begin led_seg=8'b1111_0110;end
end
3:begin
endcase
end
endcase
state=state+1;
end
if(read==0)//商家读取模式
begin
case(i) //显示销售总额
0:begin
end
1:begin
b=count/10;
led_dig=8'b1111_1110;
case(b)
0:begin led_seg=8'b1111_1100;end
1:begin led_seg=8'b0110_0000;end
2:begin led_seg=8'b1101_1010;end
3:begin led_seg=8'b1111_0010;end
4:begin led_seg=8'b0110_0110;end
5:begin led_seg=8'b1011_0110;end
6:begin led_seg=8'b1011_1110;end
7:begin led_seg=8'b1110_0000;end
8:begin led_seg=8'b1111_1110;end
9:begin led_seg=8'b1111_0110;end
endcase
b=count%10;
led_dig=8'b1111_1101;
case(b)
0:begin led_seg=8'b1111_1100;end
1:begin led_seg=8'b0110_0000;end
2:begin led_seg=8'b1101_1010;end
3:begin led_seg=8'b1111_0010;end
4:begin led_seg=8'b0110_0110;end
5:begin led_seg=8'b1011_0110;end
6:begin led_seg=8'b1011_1110;end
7:begin led_seg=8'b1110_0000;end
8:begin led_seg=8'b1111_1110;end
9:begin led_seg=8'b1111_0110;end
endcase
end
endcase
i=i+1;
if(i==2)
begin
i=0;
end
end
end
endmodule
五、对应变量的管脚配置表