verilog大作业_第1页
verilog大作业_第2页
verilog大作业_第3页
verilog大作业_第4页
verilog大作业_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西安电子科技大学Verilog大作业一自动售邮票机院系:电子工程学院姓名:李岩学号:1202121468专业:电子与通信工程自动售邮票机1.题目介绍本设计主要以程序为主,并通过波形仿真来验证程序功能的实现。中选择好邮票并投币后,数码管显示所选邮票价格及投入钱币价格;按下确认付款开关,交易成功,数码管显示应找多少钱,蜂鸣器响,对应商品LED丁亮。假设所投钱币 缺乏所选商品价格,对应警告钱币缺乏的LED灯亮;当继续投入钱币直到到达所选邮票价格, 按下确认付款开关,交易同样成功。具体设计要求如下:(1)机器有一个投币孔,每次只能投入一枚硬币。机器能自动识别硬币金额,最大为1元,最小为1角。购票者可选

2、择的邮票面值有1元和5角两种, 每次售出1枚邮票。(2)灯亮时表示该邮票售出。(3)用开关分别模拟1角、5角硬币和1元硬币投入,可以用几只发光二极管分别代表找回剩余的硬币。(4)每次只能售出一种邮票,当所投硬币到达或超过购置者所选面值时,售出货物并找回剩余的硬币,回到初始状态;(5)当所投硬币值缺乏面值时,可通过一个复位键退回所投硬币, 回到初始状态。3程序介绍首先声明,本程序具有完全自主知识产权,是经过屡次尝试以及错误之后的成果。本程序的核心是利用我们最近刚学的状态机来实现机器不同状态之前的转换。由于没有实验板,只能使用波形仿真,所以最后的functions ( led显示函数)注释起来了,

3、但程序还是保存了数码管动态扫描局部。程序根本可以分为三大模块:(1)状态机模块,这是程序的核心局部。在写程序之前看过网上的一些现有 例程,但都没有解决一个我认为的核心问题,那就是如何解决连续投币问题。后来经过不断地试错,发现可以使用状态机完美地解决这个问题。(2)数码管动态扫描局部,它的作用是按照给定时钟来回点亮四个数码管(两个dis_money,两个dis_price ),使数码管在人的肉眼看来一直是亮的。这局部 由于没有实2.程序状态框图所投的所投的I小千商品价小千商品价验板,所以看不出其发挥出来的功能。(3)数码管显示函数,用函数的方法可以防止重复,使程序看起来简洁明 了,从而最大程度提

4、高程序编写效率。4源程序module work (clk,rst,dis_ mon y_d,dis_ mon y_g,dis_price_d,dis_price_g,btn_ok,btn_ mon ,btn_sell,warn,beep );in put clk,rst,bt n ok;input 2:0 btn_mon;/选择放入的钱input 1:0 btn_sell;/选择商品output warn;/钱缺乏,指示灯output 3:0 dis_mo ny_d,dis_mo ny_g;两个数码管显示投入面值,个位和十位output 3:0 dis_price_d,dis_price_g;

5、/两个数码管显示价钱,同上output beep;/高电平交易成功reg warn;/警告放入钱缺乏reg 3:0 dis_mony_d,dis_mony_g;reg 3:0 dis_price_d,dis_price_g;reg 3:0 money,money_all,price;reg 1:0 flag = 2b00;/数码管显示标志位reg beep=0;reg 2:0 state;parameter IDLE=d0,A=d1,B=d2;always (negedge rst or posedge clk)beginif(!rst) /初始化beginprice=0;money=0; s

6、tate=IDLE; money_all=0; warn = 0;beep = 0;endelsebegi n三种面值case(btn_mon) 3b001: money = 1; 3b010: money = 5;3b100: money = 10; default:money = 0;endcase case(btn_sell) /两种 邮票2b01: price = 5;2b10: price = 10; default: price= 0; endcasecasex(state)IDLE:if(btn_sell)beginmoney_all = money_all +money; st

7、ate=A;endA: if(btn_ok =0)beginmoney_all = money_all +money; endelsebeginmoney_all = money_all +money; state=price)beginmoney_all = money_all-price; beep = 1;warn=0;state=IDLE;endelsebeginwarn = 1;state=A;enddefault: state=IDLE;endcaseend end/*将时钟给数码管 ,数码管分别显示放入钱多少、邮票价格*/always (posedge clk) begincas

8、e(flag)2b00:begin dis_mony_d =money_all%10; dis_price_d =price%10; flag = 2b01;end2b01: begin dis_mony_g = money_all/10; dis_price_g =price/10; flag = 2b00;endendcase end /*数码管段码function 6:0 led7; input 3:0 dis_input;begincase (dis_input) 0 : led7 = 7b111_1110; 1 : led7 = 7b011_0000; 2 : led7= 7b110

9、_1101; 3 : led7 = 7b111_1001; 4 : led7 = 7b011_0011; 5 : led7 = 7b101_1011;6 : led7 = 7b101_1111; 7 : led7 = 7b111_0000; 8 : led7 = 7b111_1111; 9 : led7 =7b111_0011; default : led7 = 7b111_1111;endcaseend endfunction */ endmodule仿真分析:(1)按下1元邮票选择键( 2b10 ),当连续两次投入5角( 3b 010 )并按 下ok键时,beep变为高电平,交易成功,找零

10、dis_money为零。波形仿真如下图:(2)按下1元邮票选择键( 2b10 ),当一次投入5角( 3b 010 )并按下ok键warn变为高电平,交易失败,找零dis_money为投入的5角。波形仿真如下图:3按下1元邮票选择键2b10,当一次投入5角3b 010并按下ok键时,warn变为高电平,交易失败。继续投入5角3b 010并按下ok键时,beep变为高电平,交易成功,找零dis_money为零。波形仿真如下列图:5总结本次大作业断断续续持续了两个星期,但我觉得这个时间值得。通过本次大作业的编写,我对verilog HDL语言有了更深刻的了解,能够比拟灵活地运用它来实现我所想要实现的功能。在程序编写中,我也遇到了很多挫折,甚至想放弃这个题目,但是我还是坚持下来了。发现问题连续投币所在之后想了很多方法,甚至是C语言的里面的brea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论