数字电子技术课程设计
——自动售货机
摘 要
自动售货机是一台机电一体化的自动化装置,在接收到货币已输入的前提下,靠触摸控制按钮输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出。当顾客按下需要买的商品所对应的按键时,数码管将显示出该商品的的价格,然后顾客需要将货币投入投币口,数码管上显示出所投币额。当按下确认键,则自动售货机将对投入的货币与商品的价格进行比较。如果投入的币额足够时,则自动送出商品,并且把多余的钱找回,在数码管上显示出来。如果两者币的相等,则直接送出商品。如果投入的币额不足时则报警,设计时可以设置报警时间。当顾客一旦按下确认键3秒后,自动售货机将自动恢复到初始状态,此时顾客才可以进行下一次购货操作。售货机还具有商家使用累加货币的功能,累加的货币在数码管上显示出,此累加器只能有商家可以控制清零。此售货机还有商家控制的整体复位功能。该售货机具有使用方便,结构简单,灵活通用等优点,因此在销售业,食品产业得到广泛的应用。本文设计的自动售货机,主要应用到Verilog 语言和Quartus II 软件,通过编写Verilog 语言子模块程序经过Quartus II仿真生成电路图,然后编写总体程序并调用各子程序,经过Quartus II 仿真反馈连接生成一个自动售货机模型,最后将其下载到FPGA 开发板内进行功能测试。
关键字:自动售货机、Verilog 语言、Quartus II软件、FPGA 开发板
目录
1.设计完成的功能…………………………………………………1
2.实验原理…………………………………………………………1
3.设计思路………………………………………………………1-2
4.程序代码段…………………………………………………2-9
5.Quartus II综合分析得各模块RTL 电路图………………9-12
6.Quartus II 仿真结果………………………………………13-15
7.FPGA 开发板管脚配置图………………………………………15
8.FPGA 开发板测试结果…………………………………………16
一、设计完成的功能
(1)设计一个自动售货机,此机能出售1元、2元、5元、10元的四种商品。出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格。
(2)顾客投入硬币的钱数也是有1元、2元、5元、10元四种,但每次只能投入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来。
(3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒(可用点阵模拟报警)。如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
(4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作。
(5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。此累加器只有商家可以控制清零。
(6)此售货机要设有一个由商家控制的整体复位控制。
二、实验原理
总的设计思想:首先用Verilog 语言编写各子模块程序代码,来实现各子模块设计要求功能。然后编写一个顶层模块,并在顶层模块中调用各子模块的程序代码,以使各子模块联系起来。编程完成以后通过Quartus II 调入程序进行综合分析仿真,得到总模块以及各子模块的RTL 电路图,最后将其下载到FPGA 开发板内进行功能测试。
具体流程:首先应搭建识别模块,将代表每种硬币的拨码开关信号转变为BCD 码进行累加。当累加完成后,将累加结果与代表商品的BCD 码相比较。如果大于售出商品并对两个BCD 码求差,求差的结果作为找钱信号;如果等于直接售出商品;小于则报警。至于统计卖钱额,则是对售出的商品进行累加。同时还要通过数码管显示模块进行显示。
三、设计思路
采用先部分再整体的设计思想,将总体设计分为以下模块
(1) 分频(fenpin )模块。
(2)计时(count )模块。用于控制确认键后到恢复初始化的3秒计时。
(3)识别(shibie)模块。将每种硬币、货品的拨码开关信号转变为编码 。
(4)清零(qingling)模块 。用于销售总额的清零。
(5)初始化(init)模块
(6)控制(control)模块。用于数据读入、投币不足、交易成功状态的控制及转化。
(7)显示(display)模块
四、程序代码段
(1)fenpin 模块程序代码:
module fenpin(clk,f_1m,f_1s);
input clk;
output f_1m,f_1s;
reg f_1m,f_1s;
integer a_temp1,a_temp2;
always@(posedge clk)
begin
if (a_temp2==24999)
begin
f_1m=~f_1m;
a_temp2
end
else
a_temp2
end
always@(posedge clk)
begin
if(a_temp1==24999999)
begin
f_1s=~f_1s;
a_temp1
end
else
a_temp1
end
endmodule
该模块设计目的是实现分频,以使后续模块能得到毫秒和秒级的动作。
(2)count 模块程序代码:
module count(f_1s,ret,a);
input f_1s;
input ret;
output a;
integer a;
always @ (posedge f_1s)
begin
if(ret!=0) //用于按确认键后的计时
begin
a=a+1;
end
else
begin
a=0;
end
end
endmodule
该模块的主要功能是计时,以使后续后续模块能够实现顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,允许顾客进行下一次购货操作。
(3)shibie 模块程序代码:
module shibie(read,g,m,goods,money);
input[1:0] g,m;
input read;
output goods,money;
reg [3:0] goods,money;
always
begin
if(read!=0) //非商家读取模式(普通读写模式)
begin // 识别模块
case(g) //表每种货品的拨码开关信号转变为编码 4'b00:begin goods=1;end
4'b01:begin goods=2;end
4'b10:begin goods=5;end
4'b11:begin goods=10;end
default:begin goods=0;end
endcase
case(m) //表每种硬币的拨码开关信号转变为编码
4'b00:begin money=1;end
4'b01:begin money=2;end
4'b10:begin money=5;end
4'b11:begin money=10;end
default:begin money=0;end
endcase
end
end
endmodule
该模块的功能是识别是否是商家读取模式,如果是普通读写模式则将每种硬币、
货品的拨码开关信号转变为编码 。
(4)qingling 模块程序代码:
module qingling(f_1m,zero,count);
input f_1m,zero;
output count;
reg [9:0]count;
always @ (posedge f_1m)
begin
if(zero==0) //清零
begin
count=0;
end
end
endmodule
该模块的功能实现商家能够整体复位。
(5)init 模块程序代码:
module init(a,led,leda,ledb,x,ret);
input a;
output led,leda, ledb,x,ret;
reg[1:0] ret;
reg[3:0] led;
reg leda;
reg ledb;
reg x=1;
always
begin
if(a==3) //初始化
begin
ret=0;
led=4'b0000;
leda=1;
ledb=0;
x=0;
end
end
endmodule
该模块的功能是按确认键计时3秒后自动回到初始状态,以允许顾客进行下一次购货操作。
(6)control 模块程序代码:
module control(x,yes,money,goods,g_c,ret,leda,ledb,led,count); input[3:0] money,goods;
input yes,x;
output g_c,ret,leda,ledb,led,count;
reg [3:0] change,g_c,led;
reg leda;
reg ledb;
reg[9:0] count=0;
reg[1:0] ret;
always
begin
if(yes==0) //按确定键
begin
if(money
begin
change=0;
ret=1;
end
else
begin//金钱足够
change=money-goods;
ret=2;
if(x==0) //交易成功销售总额增加
begin
count=count+goods;
end
g_c=goods;
end
endmodule
该模块的功能是用于数据读入、投币不足、交易成功状态的控制及转化。
(7)display 模块程序代码:
module display(g_c,money,read,count,com,led_seg,);
input [3:0]g_c,money;
input [9:0] count;
input read;
output com;
output led_seg;
reg [3:0]com;
reg [7:0]led_seg;
integer r,b;
reg i=0;
reg [1:0] state=0;
always
begin
if(read!=0)
begin
case(state)
//显示选择的货物
0:begin
r=g_c % 10;
com=4'b1110;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
1:begin
r=g_c / 10;
com=4'b 1101;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
//显示投入的钱数及余额
2:begin
r=money % 10;
com=4'b 1011;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end
7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
3:begin
r=money / 10;
com=4'b 0111;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
endcase
state=state+1;
end
if(read==0)//商家读取模式
begin
case(i) //显示销售总额
0:begin
b=count/10;
com=4'b 1110;
case(b)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
1:begin
b=count%10; com=4'b 1101; case(b)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase end
endcase i=i+1; if(i==2) begin i=0; end end end
endmodule
该模块的功能是将顾客投入硬币的钱数、投币额足够送出货物、应找回的多余的钱数用数码管显示出来。
(8)总体顶层模块autoseller 程序代码: module
autoseller(f_1s,f_1m,g,m,yes,read,zero,com,led_seg,leda,ledb,led); input yes,read,zero;//确定键,商家读取键,清零键 input f_1s,f_1m;
input [1:0] g , m; //货品及投币选择键
output com,led_seg,leda,ledb,led;//数码管输出及点阵输出 wire leda;
wire leda1,leda2,ledb1,ledb2; wire [3:0]led1,led2; wire ledb; wire a;
wire [3:0] goods,money,led,change,g_c,com; integer r,b, a_tmp2,a_tmp1;
wire [1:0] ret=0;//用于控制各状态间的转换 wire [9:0]count; wire [7:0]led_seg;
wire [1:0]state=0; wire i=0; wire x;
//fenpin autoseller1(clk,f_1m,f_1s); count autoseller2(f_1s,ret,a);
init autoseller3(a,led1,leda1,ledb1,x,ret); qingling autoseller4(f_1m,zero,count); shibie autoseller5(read,g,m,goods,money);
control autoseller6(yes,money,goods,g_c,ret,leda2,ledb2,led2,count); display autoseller7(g_c,goods,money,read,com,led_seg,count); assign leda=(a==3)?leda1:leda2; assign ledb=(a==3)?ledb1:ledb2; assign led=(a==3)?led1:led2; endmodule
该模块的功能是将各子模块通过顶层模块联系在一起,以期实现整体设计功能。
五: Quartus II综合分析得各模块RTL 电路图
(1)autoseller 总模块RTL 电路图
:
(2)fenpin模块RTL 电路图:
(3)count 模块RTL 电路图:
(4)shibie 模块RTL 电路图:
(6)init 模块RTL 电路图:
(7)control模块RTL 电路图:
六:Quartus II仿真结果
(1)autoseller总模块仿真结果图:
(2)fenpin模块仿真结果图:
(3)count 模块仿真结果图:
(5)qingling 模块仿真结果图:
(6)init 模块仿真结果图:
(8)display 模块仿真结果图:
七:FPGA 开发板管脚配置图:
八:FPGA 开发板测试结果
数字电子技术课程设计
——自动售货机
摘 要
自动售货机是一台机电一体化的自动化装置,在接收到货币已输入的前提下,靠触摸控制按钮输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出。当顾客按下需要买的商品所对应的按键时,数码管将显示出该商品的的价格,然后顾客需要将货币投入投币口,数码管上显示出所投币额。当按下确认键,则自动售货机将对投入的货币与商品的价格进行比较。如果投入的币额足够时,则自动送出商品,并且把多余的钱找回,在数码管上显示出来。如果两者币的相等,则直接送出商品。如果投入的币额不足时则报警,设计时可以设置报警时间。当顾客一旦按下确认键3秒后,自动售货机将自动恢复到初始状态,此时顾客才可以进行下一次购货操作。售货机还具有商家使用累加货币的功能,累加的货币在数码管上显示出,此累加器只能有商家可以控制清零。此售货机还有商家控制的整体复位功能。该售货机具有使用方便,结构简单,灵活通用等优点,因此在销售业,食品产业得到广泛的应用。本文设计的自动售货机,主要应用到Verilog 语言和Quartus II 软件,通过编写Verilog 语言子模块程序经过Quartus II仿真生成电路图,然后编写总体程序并调用各子程序,经过Quartus II 仿真反馈连接生成一个自动售货机模型,最后将其下载到FPGA 开发板内进行功能测试。
关键字:自动售货机、Verilog 语言、Quartus II软件、FPGA 开发板
目录
1.设计完成的功能…………………………………………………1
2.实验原理…………………………………………………………1
3.设计思路………………………………………………………1-2
4.程序代码段…………………………………………………2-9
5.Quartus II综合分析得各模块RTL 电路图………………9-12
6.Quartus II 仿真结果………………………………………13-15
7.FPGA 开发板管脚配置图………………………………………15
8.FPGA 开发板测试结果…………………………………………16
一、设计完成的功能
(1)设计一个自动售货机,此机能出售1元、2元、5元、10元的四种商品。出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格。
(2)顾客投入硬币的钱数也是有1元、2元、5元、10元四种,但每次只能投入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来。
(3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒(可用点阵模拟报警)。如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
(4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作。
(5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。此累加器只有商家可以控制清零。
(6)此售货机要设有一个由商家控制的整体复位控制。
二、实验原理
总的设计思想:首先用Verilog 语言编写各子模块程序代码,来实现各子模块设计要求功能。然后编写一个顶层模块,并在顶层模块中调用各子模块的程序代码,以使各子模块联系起来。编程完成以后通过Quartus II 调入程序进行综合分析仿真,得到总模块以及各子模块的RTL 电路图,最后将其下载到FPGA 开发板内进行功能测试。
具体流程:首先应搭建识别模块,将代表每种硬币的拨码开关信号转变为BCD 码进行累加。当累加完成后,将累加结果与代表商品的BCD 码相比较。如果大于售出商品并对两个BCD 码求差,求差的结果作为找钱信号;如果等于直接售出商品;小于则报警。至于统计卖钱额,则是对售出的商品进行累加。同时还要通过数码管显示模块进行显示。
三、设计思路
采用先部分再整体的设计思想,将总体设计分为以下模块
(1) 分频(fenpin )模块。
(2)计时(count )模块。用于控制确认键后到恢复初始化的3秒计时。
(3)识别(shibie)模块。将每种硬币、货品的拨码开关信号转变为编码 。
(4)清零(qingling)模块 。用于销售总额的清零。
(5)初始化(init)模块
(6)控制(control)模块。用于数据读入、投币不足、交易成功状态的控制及转化。
(7)显示(display)模块
四、程序代码段
(1)fenpin 模块程序代码:
module fenpin(clk,f_1m,f_1s);
input clk;
output f_1m,f_1s;
reg f_1m,f_1s;
integer a_temp1,a_temp2;
always@(posedge clk)
begin
if (a_temp2==24999)
begin
f_1m=~f_1m;
a_temp2
end
else
a_temp2
end
always@(posedge clk)
begin
if(a_temp1==24999999)
begin
f_1s=~f_1s;
a_temp1
end
else
a_temp1
end
endmodule
该模块设计目的是实现分频,以使后续模块能得到毫秒和秒级的动作。
(2)count 模块程序代码:
module count(f_1s,ret,a);
input f_1s;
input ret;
output a;
integer a;
always @ (posedge f_1s)
begin
if(ret!=0) //用于按确认键后的计时
begin
a=a+1;
end
else
begin
a=0;
end
end
endmodule
该模块的主要功能是计时,以使后续后续模块能够实现顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,允许顾客进行下一次购货操作。
(3)shibie 模块程序代码:
module shibie(read,g,m,goods,money);
input[1:0] g,m;
input read;
output goods,money;
reg [3:0] goods,money;
always
begin
if(read!=0) //非商家读取模式(普通读写模式)
begin // 识别模块
case(g) //表每种货品的拨码开关信号转变为编码 4'b00:begin goods=1;end
4'b01:begin goods=2;end
4'b10:begin goods=5;end
4'b11:begin goods=10;end
default:begin goods=0;end
endcase
case(m) //表每种硬币的拨码开关信号转变为编码
4'b00:begin money=1;end
4'b01:begin money=2;end
4'b10:begin money=5;end
4'b11:begin money=10;end
default:begin money=0;end
endcase
end
end
endmodule
该模块的功能是识别是否是商家读取模式,如果是普通读写模式则将每种硬币、
货品的拨码开关信号转变为编码 。
(4)qingling 模块程序代码:
module qingling(f_1m,zero,count);
input f_1m,zero;
output count;
reg [9:0]count;
always @ (posedge f_1m)
begin
if(zero==0) //清零
begin
count=0;
end
end
endmodule
该模块的功能实现商家能够整体复位。
(5)init 模块程序代码:
module init(a,led,leda,ledb,x,ret);
input a;
output led,leda, ledb,x,ret;
reg[1:0] ret;
reg[3:0] led;
reg leda;
reg ledb;
reg x=1;
always
begin
if(a==3) //初始化
begin
ret=0;
led=4'b0000;
leda=1;
ledb=0;
x=0;
end
end
endmodule
该模块的功能是按确认键计时3秒后自动回到初始状态,以允许顾客进行下一次购货操作。
(6)control 模块程序代码:
module control(x,yes,money,goods,g_c,ret,leda,ledb,led,count); input[3:0] money,goods;
input yes,x;
output g_c,ret,leda,ledb,led,count;
reg [3:0] change,g_c,led;
reg leda;
reg ledb;
reg[9:0] count=0;
reg[1:0] ret;
always
begin
if(yes==0) //按确定键
begin
if(money
begin
change=0;
ret=1;
end
else
begin//金钱足够
change=money-goods;
ret=2;
if(x==0) //交易成功销售总额增加
begin
count=count+goods;
end
g_c=goods;
end
endmodule
该模块的功能是用于数据读入、投币不足、交易成功状态的控制及转化。
(7)display 模块程序代码:
module display(g_c,money,read,count,com,led_seg,);
input [3:0]g_c,money;
input [9:0] count;
input read;
output com;
output led_seg;
reg [3:0]com;
reg [7:0]led_seg;
integer r,b;
reg i=0;
reg [1:0] state=0;
always
begin
if(read!=0)
begin
case(state)
//显示选择的货物
0:begin
r=g_c % 10;
com=4'b1110;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
1:begin
r=g_c / 10;
com=4'b 1101;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
//显示投入的钱数及余额
2:begin
r=money % 10;
com=4'b 1011;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end
7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
3:begin
r=money / 10;
com=4'b 0111;
case(r)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
endcase
state=state+1;
end
if(read==0)//商家读取模式
begin
case(i) //显示销售总额
0:begin
b=count/10;
com=4'b 1110;
case(b)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase
end
1:begin
b=count%10; com=4'b 1101; case(b)
0:begin led_seg=8'b1001_0000;end 1:begin led_seg=8'b1001_1111;end 2:begin led_seg=8'b0101_1000;end 3:begin led_seg=8'b0001_1001;end 4:begin led_seg=8'b0001_0111;end 5:begin led_seg=8'b0011_0001;end 6:begin led_seg=8'b0011_0000;end 7:begin led_seg=8'b1001_1101;end 8:begin led_seg=8'b0001_0000;end 9:begin led_seg=8'b0001_0101;end endcase end
endcase i=i+1; if(i==2) begin i=0; end end end
endmodule
该模块的功能是将顾客投入硬币的钱数、投币额足够送出货物、应找回的多余的钱数用数码管显示出来。
(8)总体顶层模块autoseller 程序代码: module
autoseller(f_1s,f_1m,g,m,yes,read,zero,com,led_seg,leda,ledb,led); input yes,read,zero;//确定键,商家读取键,清零键 input f_1s,f_1m;
input [1:0] g , m; //货品及投币选择键
output com,led_seg,leda,ledb,led;//数码管输出及点阵输出 wire leda;
wire leda1,leda2,ledb1,ledb2; wire [3:0]led1,led2; wire ledb; wire a;
wire [3:0] goods,money,led,change,g_c,com; integer r,b, a_tmp2,a_tmp1;
wire [1:0] ret=0;//用于控制各状态间的转换 wire [9:0]count; wire [7:0]led_seg;
wire [1:0]state=0; wire i=0; wire x;
//fenpin autoseller1(clk,f_1m,f_1s); count autoseller2(f_1s,ret,a);
init autoseller3(a,led1,leda1,ledb1,x,ret); qingling autoseller4(f_1m,zero,count); shibie autoseller5(read,g,m,goods,money);
control autoseller6(yes,money,goods,g_c,ret,leda2,ledb2,led2,count); display autoseller7(g_c,goods,money,read,com,led_seg,count); assign leda=(a==3)?leda1:leda2; assign ledb=(a==3)?ledb1:ledb2; assign led=(a==3)?led1:led2; endmodule
该模块的功能是将各子模块通过顶层模块联系在一起,以期实现整体设计功能。
五: Quartus II综合分析得各模块RTL 电路图
(1)autoseller 总模块RTL 电路图
:
(2)fenpin模块RTL 电路图:
(3)count 模块RTL 电路图:
(4)shibie 模块RTL 电路图:
(6)init 模块RTL 电路图:
(7)control模块RTL 电路图:
六:Quartus II仿真结果
(1)autoseller总模块仿真结果图:
(2)fenpin模块仿真结果图:
(3)count 模块仿真结果图:
(5)qingling 模块仿真结果图:
(6)init 模块仿真结果图:
(8)display 模块仿真结果图:
七:FPGA 开发板管脚配置图:
八:FPGA 开发板测试结果