电子综合设计EDA课程教学设计自动售票机.doc
-/课程设计报告2015-2016学年第2学期课程设计名称: 电子综合设计EDA课程设计 院 (系): 电子信息学院 专业: 电子信息工程 班级: 电子1313 学生姓名: 吴限 学号: 26 综合实验时间: 2016/7/11-2016/7/15 指导教师: 钟 旭 提交时间: 2016/7/15 上海电机学院课程设计任务书课程名称电子综合设计EDA课程设计课程代码033117P1课程设计课题清单1、数字式竞赛抢答器 2、自动售票机3、乒乓球比赛游戏机 4、电子密码锁5、出租车自动计费器 6、洗衣机控制器7、交通信号灯控制器 8、电梯控制器设计时间2016 年 7 月 11 日 2016 年 7 月 15 日一、课程设计任务汇总设计任务:自动售票机功能要求:1、 设计一个自动售票机,用开关电平信号模拟投币过程,每次投一枚硬币,但可以连续投入数枚硬币;2、 机器能自动识别硬币金额,最大为 1 元,最小为 5 角。设定票价为 2.5 元,每次售一张票; 3、 购票时先投入硬币,当投入的硬币总金额达到或超过票的面值时,机器发出指示,这时可以按取票键取出票;4、 如果所投硬币超过票的面值则会提示找零钱,取完票以后按找零键则可以取出零钱,并显示零钱数;使用数码管显示当前投入的金额。二、对课程设计成果的要求(包括课程设计报告、图纸、图表、实物等软硬件要求)1课程设计基本要求 课题分析、查阅资料、方案论证、方案实现、系统联调、撰写课程设计报告2成果要求(1)系统方案 (2)电路RTL原理图(3)Verilog源程序和流程图(或状态机转移图)(4)Verilog测试程序 (5)设计说明书(课程设计报告)三、课程设计工作进度计划: 时间安排内容星期一下达任务星期二程序设计星期三程序调试星期四撰写报告星期五考核答辩四、主要参考资料:指 导 书:Verilog数字系统设计教程 夏宇闻编著 北京航空航天大学出版社参考资料:EDA设计实验教程 艾明晶编著 清华大学出版社目录一、题目名称1二、内容摘要1三、设计任务和要求1四、系统方案2五、设计方法硬件设计3六、设计方法软件设计4七、系统调试57.1使用的主要仪器和仪表57.2调试电路的方法和技巧57.3整理性能测试数据和波形,并与计算结果比较分析57.4调试中出现的故障、原因及排除方法5八、设计成果6九、设计结论10十、收获和体会11附件(源程序)12参考文献22一、 题目名称自动售票机二、 内容摘要自动售票机是为了实现机器根据输入指令进行全自动出售票的目的。本设计是采用了币值输入相加模块、主控模块和币值显示这三个模块实现的。在币值输入相加模块中, 用两个开关电平输入按钮分别代表 2 种硬币输入,每按一次,表示投入一枚硬币。并设置控制电路,硬币输入的次数控制十进制加法器的加数 A 和被加数 B,使输入的币值实时相加。用两位数码管显示当前的投入币值,在主控模块中设置一个复位信号reset,用于中止交易(系统复位)。设置一个取票信号ok,一个票给出信号tout,tout 接 LED 显示,灯亮则表示可以取票,否则取票键无效,按ok 键取票,灯灭。设置一个取零钱信号 charge,一个零钱输出信号 mout,mout 接 LED 显示,灯亮则表示有零钱,按 charge 取零钱,灯灭。主控模块中是一个状态机,当币值不同时分别实现不同的结果。三、 设计任务和要求设计一个自动售票机,用开关电平信号模拟投币过程,每次投一枚硬币,但可以连续投入数枚硬币。机器能自动识别硬币金额,最大为1元,最小为 5 角。设定票价为2.5元,每次售一张票。 购票时先投入硬币,当投入的硬币总金额达到或超过票的面值时,机器发出指示,这时可以按取票键取出票。如果所投硬币超过票的面值则会提示找零钱,取完票以后按找零键则可以取出零钱。四、 系统方案图4-1 自动售票机系统框图表4-1 币值相加模块输入状态表五、 设计方法硬件设计图5-1 自动售票机硬件系统框图六、 设计方法软件设计图6-1 币值判断流程图图6-2 系统流程图七、 系统调试7.1使用的主要仪器和仪表计算机一台、ISE仿真设计软件。7.2调试电路的方法和技巧分别运行每个模块的程序,观察是否通过检测,最后通过仿真出来的测试波形图,仔细的进行一步步运行,观察运行结果是否和课题的设计要求相对应。7.3整理性能测试数据和波形,并与计算结果比较分析实际的仿真结果图能够完美的实现课题的各项要求,最终的仿真测试图如下图8-4。7.4调试中出现的故障、原因及排除方法数码管显示不正确,原因是管脚的配置不对。八、 设计成果图8-1 顶层模块clk:时钟信号;reset:系统复位清零;half:5角硬币模拟信号,为1时表示投币5角,为0表示未投入;one:1元硬币模拟信号,为1时表示投币1元,为0表示未投入;mout:可找零钱输出显示,置1表示有零可找,置0表示无零钱可找;tout:有票输出信号,置1表示有票可出,置0表示不能出票;charge:取零钱信号,置1检查是否能出零钱;ok:取票,置1检查是否可取票;ms1,ms2:输出数码管片选信号,01选中第2位数码管,10选中第1位数码管;a,b,c,d,e,f,g:数码管输出译码信号,分别驱动数码管7个引脚。图8-2 主控模块mh:投入金额数码显示的高4位;ml: 投入金额数码显示的低4位。图8-3 数码管模块in1,in2:分别表示高低位输入金额;ms1,ms2:输出数码管片选信号。a,b,c,d,e,f,g:数码管输出译码信号,分别驱动数码管7个引脚。图8-4 模拟仿真图图8-5图8-5为第一次交易此时投入一枚硬币,此时金额显示为10,译码后也就是1001111,0000001;此时按下ok键,由于金额不足,没有任何反应。随后投入第二枚硬币,金额显示20,金额不足,依旧没有反应。图8-6图8-6表示此时又投入1元,此时总共已经投入3元,数码管显示30,译码后就是0000110,0000001;此时,tout为1。按下ok,出票,tout为0。图8-7图8-7表示由于还有余额5毛,所以mout为1,按下charge,找零,mout清零,找零。图8-8图8-8为第二次交易,先按下half,金额为5毛,显示05,译码后为0000001,0100100。由于金额不足按下ok后,没有反应。图8-9图8-9表示随后按下one,再按one,此时金额达到2.5元,金额已满,tout=1。然后按下ok,出票并且tout清零。九、 设计结论本自动售票机较好地采用了自顶向下的设计理念,利用层次化结构化的方法将售票机系统分为三个模块。自动售票机系统是由顶层模块负责连接各子模块,主控模块设置各输入输出信号、时钟信号及复位信号,并控制币值的累加,数码管显示模块负责数码管的动态显示币值组成。设计合理,层次清晰,仿真时能够分别测试各个模块从而尽早地排除错误。在程序设计上顶层模块调用主模块及数码管显示模块,实现对主控与数码管的连接;主控模块采用Mealy状态机结构主要对投币情况及出票进行控制并送数码管显示;数码管模块采用动态扫描方法结合片选信号实现两位数码显示。通过对着三个大模块的设计,成功实现了自动售票的功能并进行仿真测试,即当币值等于 2.5 元时,tout指示灯亮,ok键有票给出,mout灯不亮,不找零钱;当币值为 3.0 元时,tout指示灯亮,ok键有票给出,mout指示灯亮,有零钱给出,charge键找零钱;其余情况下,既无票给出也不找零钱。测试结果显示设计符合要求。十、 收获和体会通过本次课程设计,我对Verilog HDL语言有了更深刻的了解,能够比较灵活地运用它来实现我们所想要要其实现的功能。在实验中,我也遇到了很多挫折,不过我都和同伴一一克服了,大家齐心协力解决了问题,使我明白了和他人共同合作的重要性。在以后的道路上我们也必须深刻认识到团队合作的精神,投入今后的发展之中。 日常生活中有很多各种不同的自动售票机,通过本次课程设计我终于了解到自动售票是如何实现的了,虽然我们设计的知识很简单的一种售票机,但是原理是大同小异的,相信如果让我设计更复杂点的功能,我也会研究出来。成功就是在不断摸索着前进中实现的,遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。附件(源程序)顶层模块程序:module top(one,half,reset,clk,ok,charge,tout,mout,ms1,ms2,a,b,c,d,e,f,g); /顶层模块,进行子模块的连接 input one,half,reset,clk,ok,charge; output tout,mout,ms1,ms2,a,b,c,d,e,f,g; wire 3:0mh,ml; ticket u1( /子模块连接 .one(one), .half(half), .mh(mh), .ml(ml), .tout(tout), .mout(mout), .reset(reset), .clk(clk), .ok(ok), .charge(charge) ); sel u2( .in1(ml), .in2(mh), .clk(clk), .ms1(ms1), .ms2(ms2), .a(a), .b(b), .c(c), .d(d), .e(e), .f(f), .g(g) );endmodule/主控模块程序:/自动售票机/*信号定义:clk:时钟信号;reset:系统复位清零;half:5角硬币模拟信号;one:1元硬币模拟信号;mout:有找零钱输出显示;tout:有票输出信号;charge:取零钱;ok:取票;mh:投入金额数码显示的高4位;ml: 投入金额数码显示的低4位。*/module ticket(one,half,mh,ml,tout,mout,reset,clk,ok,charge);parameter a=0,b=1,c=2,d=3,e=4; /定义5个状态input one,half,reset,clk,ok,charge;output tout,mout,mh,ml;reg mout,tout;reg3:0 money;reg3:0 mh;reg3:0 ml;always(posedge clk) begin if(reset) begin tout=0; mout=0; money=a; mh,ml=8b00000000; end case(money) a:if(half) begin money=b; mh,ml=8b00000101; end else if(one) begin money=c; mh,ml=8b00010000; end b:if(half) begin money=c; mh,ml=8b00010000; end else if(one) begin money=d;mh,ml=8b00010101;end c:if(half) begin money=d; mh,ml=8b00010101; end else if(one) begin money=e; mh,ml=8b00100000; end d:if(half) begin money=e; mh,ml=8b00100000; end else if(one) begin money=a; mh,ml=8b00100101; mout=0; tout=1; /sell end e:if(half) begin money=a; mh,ml=8b00100101; tout=1; /sell end else if(one) begin money=a; mh,ml=8b00110000; tout=1; end endcase if(mh,ml=8b00100101) begin if(ok) begin tout=0; mout=0; mh,ml=8b00000000; end end if(mh,ml=8b00110000) begin if(ok) begin tout=0; mout=1; mh,ml=8b00000101;end end if(charge&mout=1) begin mh,ml=8b00000000; mout=0;end endendmodule/数码管模块:module sel(in1,in2,clk,ms1,ms2,a,b,c,d,e,f,g); input 3:0in1,in2; /输入金额 input clk; output reg ms1,ms2; /输出数码管片选信号 output reg a,b,c,d,e,f,g; /输出译码信号 reg i=0; always(posedge clk) begin case(i) 1d0:begin ms1,ms2=2b10; /对数码管进行动态显示 i=i+1b1; case(in1) 4d0:a,b,c,d,e,f,g=7b0000001; /进行数码管译码输出 4d1:a,b,c,d,e,f,g=7b1001111; 4d2:a,b,c,d,e,f,g=7b0010010; 4d3:a,b,c,d,e,f,g=7b0000110; 4d4:a,b,c,d,e,f,g=7b1001100; 4d5:a,b,c,d,e,f,g=7b0100100; 4d6:a,b,c,d,e,f,g=7b0100000; 4d7:a,b,c,d,e,f,g=7b0001111; 4d8:a,b,c,d,e,f,g=7b0000000; 4d9:a,b,c,d,e,f,g=7b0000100; endcase end 1d1:begin ms1,ms2=2b01; /对数码管进行动态扫描 i=i+1b1; case(in2) 4d0:a,b,c,d,e,f,g=7b0000001; /进行数码管译码输出 4d1:a,b,c,d,e,f,g=7b1001111; 4d2:a,b,c,d,e,f,g=7b0010010; 4d3:a,b,c,d,e,f,g=7b0000110; 4d4:a,b,c,d,e,f,g=7b1001100; 4d5:a,b,c,d,e,f,g=7b0100100; 4d6:a,b,c,d,e,f,g=7b0100000; 4d7:a,b,c,d,e,f,g=7b0001111; 4d8:a,b,c,d,e,f,g=7b0000000; 4d9:a,b,c,d,e,f,g=7b0000100; endcase end endcase endendmodule测试程序:module test_top;/ Inputsreg one;reg half;reg reset;reg clk;reg ok;reg charge;/ Outputswire tout;wire mout;wire ms1;wire ms2;wire a;wire b;wire c;wire d;wire e;wire f;wire g;/ Instantiate the Unit Under Test (UUT)top uut (.one(one), .half(half), .reset(reset), .clk(clk), .ok(ok), .charge(charge), .tout(tout), .mout(mout), .ms1(ms1), .ms2(ms2), .a(a), .b(b), .c(c), .d(d), .e(e), .f(f), .g(g);initial begin/ Initialize Inputsone = 0;half = 0;reset = 1;clk = 0;ok = 0;charge = 0;/ Wait 100 ns for global reset to finish#100; reset=0; /系统开始运行#2 /投入一枚1元硬币one=1; #2one=0;#6 /按下ok键,取票,金额为1元,无效ok=1;#2 ok=0;#6one=1; /再投入一枚一元硬币#2one=0;#6one=1; /再投入一枚一元硬币#2one=0;#6 /按下ok键,取票,金额为3元,可以取票ok=1;#2 ok=0;#6 /按下charge键,找零,找零5角charge=1;#2charge=0;/第二次交易#10 /投入一枚5角硬币half=1; #2half=0;#6 /按下ok键,取票,金额为0.5元,无效ok=1;#2 ok=0;#6one=1; /再投入一枚一元硬币#2one=0;#6one=1; /再投入一枚一元硬币#2one=0;#6 /按下ok键,取票,金额为2.5元,取票成功ok=1;#2 ok=0;end always #1clk=clk; /产生时钟信号 endmodule参考文献1.夏宇闻. Verilog数字系统设计教程.北京:北京航空航天大学出版社,20132.艾明晶.EDA设计实验教程.北京:清华大学出版社,2010 小组分工资料搜集与整理朱佳俊Verilog HDL程序及仿真测试吴限Verilog HDL程序及仿真测试谢煜撰写报告及PPT苏嘉明
收藏
- 资源描述:
-
-/
课程设计报告
2015-2016学年第2学期
课程设计名称: 电子综合设计EDA课程设计
院 (系): 电子信息学院
专业: 电子信息工程 班级: 电子1313
学生姓名: 吴限 学号: 26
综合实验时间: 2016/7/11-2016/7/15
指导教师: 钟 旭
提交时间: 2016/7/15
上海电机学院课程设计任务书
课程名称
电子综合设计EDA课程设计
课程代码
033117P1
课程设计
课题清单
1、数字式竞赛抢答器 2、自动售票机
3、乒乓球比赛游戏机 4、电子密码锁
5、出租车自动计费器 6、洗衣机控制器
7、交通信号灯控制器 8、电梯控制器
设计时间
2016 年 7 月 11 日 —— 2016 年 7 月 15 日
一、课程设计任务汇总
设计任务:自动售票机
功能要求:
1、 设计一个自动售票机,用开关电平信号模拟投币过程,每次投一枚硬币,但可以连续投入数枚硬币;
2、 机器能自动识别硬币金额,最大为 1 元,最小为 5 角。设定票价为 2.5 元,每次售一张票;
3、 购票时先投入硬币,当投入的硬币总金额达到或超过票的面值时,机器发出指示,这时可以按取票键取出票;
4、 如果所投硬币超过票的面值则会提示找零钱,取完票以后按找零键则可以取出零钱,并显示零钱数;
使用数码管显示当前投入的金额。
二、对课程设计成果的要求(包括课程设计报告、图纸、图表、实物等软硬件要求)
1.课程设计基本要求
课题分析、查阅资料、方案论证、方案实现、系统联调、撰写课程设计报告
2.成果要求
(1)系统方案 (2)电路RTL原理图
(3)Verilog源程序和流程图(或状态机转移图)
(4)Verilog测试程序 (5)设计说明书(课程设计报告)
三、课程设计工作进度计划:
时间
安排内容
星期一
下达任务
星期二
程序设计
星期三
程序调试
星期四
撰写报告
星期五
考核答辩
四、主要参考资料:
指 导 书:《Verilog数字系统设计教程》 夏宇闻编著 北京航空航天大学出版社
参考资料:《EDA设计实验教程》 艾明晶编著 清华大学出版社
目录
一、 题目名称 1
二、 内容摘要 1
三、 设计任务和要求 1
四、 系统方案 2
五、 设计方法——硬件设计 3
六、 设计方法——软件设计 4
七、 系统调试 5
7.1使用的主要仪器和仪表 5
7.2调试电路的方法和技巧 5
7.3整理性能测试数据和波形,并与计算结果比较分析 5
7.4调试中出现的故障、原因及排除方法 5
八、 设计成果 6
九、 设计结论 10
十、 收获和体会 11
附件(源程序) 12
参考文献 22
一、 题目名称
自动售票机
二、 内容摘要
自动售票机是为了实现机器根据输入指令进行全自动出售票的目的。本设计是采用了币值输入相加模块、主控模块和币值显示这三个模块实现的。在币值输入相加模块中, 用两个开关电平输入按钮分别代表 2 种硬币输入,每按一次,表示投入一枚硬币。并设置控制电路,硬币输入的次数控制十进制加法器的加数 A 和被加数 B,使输入的币值实时相加。用两位数码管显示当前的投入币值,在主控模块中设置一个复位信号reset,用于中止交易(系统复位)。设置一个取票信号ok,一个票给出信号tout,tout 接 LED 显示,灯亮则表示可以取票,否则取票键无效,按ok 键取票,灯灭。设置一个取零钱信号 charge,一个零钱输出信号 mout,mout 接 LED 显示,灯亮则表示有零钱,按 charge 取零钱,灯灭。主控模块中是一个状态机,当币值不同时分别实现不同的结果。
三、 设计任务和要求
设计一个自动售票机,用开关电平信号模拟投币过程,每次投一枚硬币,但可以连续投入数枚硬币。机器能自动识别硬币金额,最大为1元,最小为 5 角。设定票价为2.5元,每次售一张票。
购票时先投入硬币,当投入的硬币总金额达到或超过票的面值时,机器发出指示,这时可以按取票键取出票。如果所投硬币超过票的面值则会提示找零钱,取完票以后按找零键则可以取出零钱。
四、 系统方案
图4-1 自动售票机系统框图
表4-1 币值相加模块输入状态表
五、 设计方法——硬件设计
图5-1 自动售票机硬件系统框图
六、 设计方法——软件设计
图6-1 币值判断流程图
图6-2 系统流程图
七、 系统调试
7.1使用的主要仪器和仪表
计算机一台、ISE仿真设计软件。
7.2调试电路的方法和技巧
分别运行每个模块的程序,观察是否通过检测,最后通过仿真出来的测试波形图,仔细的进行一步步运行,观察运行结果是否和课题的设计要求相对应。
7.3整理性能测试数据和波形,并与计算结果比较分析
实际的仿真结果图能够完美的实现课题的各项要求,最终的仿真测试图如下图8-4。
7.4调试中出现的故障、原因及排除方法
数码管显示不正确,原因是管脚的配置不对。
八、 设计成果
图8-1 顶层模块
clk:时钟信号;
reset:系统复位清零;
half:5角硬币模拟信号,为1时表示投币5角,为0表示未投入;
one:1元硬币模拟信号,为1时表示投币1元,为0表示未投入;
mout:可找零钱输出显示,置1表示有零可找,置0表示无零钱可找;
tout:有票输出信号,置1表示有票可出,置0表示不能出票;
charge:取零钱信号,置1检查是否能出零钱;
ok:取票,置1检查是否可取票;
ms1,ms2:输出数码管片选信号,01选中第2位数码管,10选中第1位数码管;
a,b,c,d,e,f,g:数码管输出译码信号,分别驱动数码管7个引脚。
图8-2 主控模块
mh:投入金额数码显示的高4位;ml: 投入金额数码显示的低4位。
图8-3 数码管模块
in1,in2:分别表示高低位输入金额;
ms1,ms2:输出数码管片选信号。
a,b,c,d,e,f,g:数码管输出译码信号,分别驱动数码管7个引脚。
图8-4 模拟仿真图
图8-5
图8-5为第一次交易此时投入一枚硬币,此时金额显示为10,译码后也就是1001111,0000001;此时按下ok键,由于金额不足,没有任何反应。随后投入第二枚硬币,金额显示20,金额不足,依旧没有反应。
图8-6
图8-6表示此时又投入1元,此时总共已经投入3元,数码管显示30,译码后就是0000110,0000001;此时,tout为1。按下ok,出票,tout为0。
图8-7
图8-7表示由于还有余额5毛,所以mout为1,按下charge,找零,mout清零,找零。
图8-8
图8-8为第二次交易,先按下half,金额为5毛,显示05,译码后为0000001,0100100。由于金额不足按下ok后,没有反应。
图8-9
图8-9表示随后按下one,再按one,此时金额达到2.5元,金额已满,tout=1。然后按下ok,出票并且tout清零。
九、 设计结论
本自动售票机较好地采用了自顶向下的设计理念,利用层次化结构化的方法将售票机系统分为三个模块。自动售票机系统是由顶层模块——负责连接各子模块,主控模块——设置各输入输出信号、时钟信号及复位信号,并控制币值的累加,数码管显示模块——负责数码管的动态显示币值组成。设计合理,层次清晰,仿真时能够分别测试各个模块从而尽早地排除错误。
在程序设计上顶层模块调用主模块及数码管显示模块,实现对主控与数码管的连接;主控模块采用Mealy状态机结构主要对投币情况及出票进行控制并送数码管显示;数码管模块采用动态扫描方法结合片选信号实现两位数码显示。通过对着三个大模块的设计,成功实现了自动售票的功能并进行仿真测试,即当币值等于 2.5 元时,tout指示灯亮,ok键有票给出,mout灯不亮,不找零钱;当币值为 3.0 元时,tout指示灯亮,ok键有票给出,mout指示灯亮,有零钱给出,charge键找零钱;其余情况下,既无票给出也不找零钱。测试结果显示设计符合要求。
十、 收获和体会
通过本次课程设计,我对Verilog HDL语言有了更深刻的了解,能够比较灵活地运用它来实现我们所想要要其实现的功能。在实验中,我也遇到了很多挫折,不过我都和同伴一一克服了,大家齐心协力解决了问题,使我明白了和他人共同合作的重要性。在以后的道路上我们也必须深刻认识到团队合作的精神,投入今后的发展之中。
日常生活中有很多各种不同的自动售票机,通过本次课程设计我终于了解到自动售票是如何实现的了,虽然我们设计的知识很简单的一种售票机,但是原理是大同小异的,相信如果让我设计更复杂点的功能,我也会研究出来。
成功就是在不断摸索着前进中实现的,遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。
附件(源程序)
顶层模块程序:
module
top(one,half,reset,clk,ok,charge,tout,mout,ms1,ms2,a,b,c,d,e,f,g); //顶层模块,进行子模块的连接
input one,half,reset,clk,ok,charge;
output tout,mout,ms1,ms2,a,b,c,d,e,f,g;
wire [3:0]mh,ml;
ticket u1( //子模块连接
.one(one),
.half(half),
.mh(mh),
.ml(ml),
.tout(tout),
.mout(mout),
.reset(reset),
.clk(clk),
.ok(ok),
.charge(charge)
);
sel u2(
.in1(ml),
.in2(mh),
.clk(clk),
.ms1(ms1),
.ms2(ms2),
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g)
);
endmodule
//主控模块程序:
//自动售票机
/*信号定义:
clk:时钟信号;
reset:系统复位清零;
half:5角硬币模拟信号;
one:1元硬币模拟信号;
mout:有找零钱输出显示;
tout:有票输出信号;
charge:取零钱;
ok:取票;
mh:投入金额数码显示的高4位;
ml: 投入金额数码显示的低4位。
*/
module ticket(one,half,mh,ml,tout,mout,reset,clk,ok,charge);
parameter a=0,b=1,c=2,d=3,e=4; //定义5个状态
input one,half,reset,clk,ok,charge;
output tout,mout,mh,ml;
reg mout,tout;
reg[3:0] money;
reg[3:0] mh;
reg[3:0] ml;
always@(posedge clk)
begin
if(reset)
begin
tout=0;
mout=0;
money=a;
{mh,ml}=8b00000000;
end
case(money)
a:if(half)
begin
money=b;
{mh,ml}=8b00000101;
end
else if(one)
begin
money=c;
{mh,ml}=8b00010000;
end
b:if(half)
begin
money=c;
{mh,ml}=8b00010000;
end
else if(one)
begin
money=d;
{mh,ml}=8b00010101;
end
c:if(half)
begin
money=d;
{mh,ml}=8b00010101;
end
else if(one)
begin
money=e;
{mh,ml}=8b00100000;
end
d:if(half)
begin
money=e;
{mh,ml}=8b00100000;
end
else if(one)
begin
money=a;
{mh,ml}=8b00100101;
mout=0;
tout=1; //sell
end
e:if(half)
begin
money=a;
{mh,ml}=8b00100101;
tout=1; //sell
end
else if(one)
begin
money=a;
{mh,ml}=8b00110000;
tout=1;
end
endcase
if({mh,ml}==8b00100101)
begin
if(ok)
begin
tout=0;
mout=0;
{mh,ml}=8b00000000;
end
end
if({mh,ml}==8b00110000)
begin
if(ok)
begin
tout=0;
mout=1;
{mh,ml}=8b00000101;end
end
if(charge&&mout==1)
begin
{mh,ml}=8b00000000;
mout=0;end
end
endmodule
//数码管模块:
module sel(in1,in2,clk,ms1,ms2,a,b,c,d,e,f,g);
input [3:0]in1,in2; //输入金额
input clk;
output reg ms1,ms2; //输出数码管片选信号
output reg a,b,c,d,e,f,g; //输出译码信号
reg i=0;
always@(posedge clk)
begin
case(i)
1d0:begin
{ms1,ms2}=2b10; //对数码管进行动态显示
i<=i+1b1;
case(in1)
4d0:{a,b,c,d,e,f,g}<=7b0000001; //进行数码管译码输出
4d1:{a,b,c,d,e,f,g}<=7b1001111;
4d2:{a,b,c,d,e,f,g}<=7b0010010;
4d3:{a,b,c,d,e,f,g}<=7b0000110;
4d4:{a,b,c,d,e,f,g}<=7b1001100;
4d5:{a,b,c,d,e,f,g}<=7b0100100;
4d6:{a,b,c,d,e,f,g}<=7b0100000;
4d7:{a,b,c,d,e,f,g}<=7b0001111;
4d8:{a,b,c,d,e,f,g}<=7b0000000;
4d9:{a,b,c,d,e,f,g}<=7b0000100;
endcase
end
1d1:begin
{ms1,ms2}=2b01; //对数码管进行动态扫描
i<=i+1b1;
case(in2)
4d0:{a,b,c,d,e,f,g}<=7b0000001; //进行数码管译码输出
4d1:{a,b,c,d,e,f,g}<=7b1001111;
4d2:{a,b,c,d,e,f,g}<=7b0010010;
4d3:{a,b,c,d,e,f,g}<=7b0000110;
4d4:{a,b,c,d,e,f,g}<=7b1001100;
4d5:{a,b,c,d,e,f,g}<=7b0100100;
4d6:{a,b,c,d,e,f,g}<=7b0100000;
4d7:{a,b,c,d,e,f,g}<=7b0001111;
4d8:{a,b,c,d,e,f,g}<=7b0000000;
4d9:{a,b,c,d,e,f,g}<=7b0000100;
endcase
end
endcase
end
endmodule
测试程序:
module test_top;
// Inputs
reg one;
reg half;
reg reset;
reg clk;
reg ok;
reg charge;
// Outputs
wire tout;
wire mout;
wire ms1;
wire ms2;
wire a;
wire b;
wire c;
wire d;
wire e;
wire f;
wire g;
// Instantiate the Unit Under Test (UUT)
top uut (
.one(one),
.half(half),
.reset(reset),
.clk(clk),
.ok(ok),
.charge(charge),
.tout(tout),
.mout(mout),
.ms1(ms1),
.ms2(ms2),
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g)
);
initial begin
// Initialize Inputs
one = 0;
half = 0;
reset = 1;
clk = 0;
ok = 0;
charge = 0;
// Wait 100 ns for global reset to finish
#100;
reset=0; //系统开始运行
#2 //投入一枚1元硬币
one=1;
#2
one=0;
#6 //按下ok键,取票,金额为1元,无效
ok=1;
#2
ok=0;
#6
one=1; //再投入一枚一元硬币
#2
one=0;
#6
one=1; //再投入一枚一元硬币
#2
one=0;
#6 //按下ok键,取票,金额为3元,可以取票
ok=1;
#2
ok=0;
#6 //按下charge键,找零,找零5角
charge=1;
#2
charge=0;
//第二次交易
#10 //投入一枚5角硬币
half=1;
#2
half=0;
#6 //按下ok键,取票,金额为0.5元,无效
ok=1;
#2
ok=0;
#6
one=1; //再投入一枚一元硬币
#2
one=0;
#6
one=1; //再投入一枚一元硬币
#2
one=0;
#6 //按下ok键,取票,金额为2.5元,取票成功
ok=1;
#2
ok=0;
end
always #1 clk=~clk; //产生时钟信号
endmodule
参考文献
[1].夏宇闻. Verilog数字系统设计教程.北京:北京航空航天大学出版社,2013
[2].艾明晶.EDA设计实验教程.北京:清华大学出版社,2010
小组分工
资料搜集与整理
朱佳俊
Verilog HDL程序及仿真测试
吴限
Verilog HDL程序及仿真测试
谢煜
撰写报告及PPT
苏嘉明
展开阅读全文