电话计费系统_第1页
电话计费系统_第2页
电话计费系统_第3页
电话计费系统_第4页
电话计费系统_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、2011-2012学年度第二学期电子技术基础课程设计-电话计费器设计院 系: 控制科学与工程 专 业: 自动化 班 级: 0907 姓 名: 李奕彤 学 号: U20091442 指导教师: 龚军 一、 课程设计名称:电话计费器的设计二、 设计内容与要求:能够通过选择增减的方式快速设定卡内的余额(最大显示200元)能设定通话的种类(14,按键选择),并能根据打电话的种类和通话时间进行金额的扣除:1为市话(0.1元/分钟),2为国内长话(1元/分钟),3为国际长话(2元/分钟),4为特殊种类电话(1.6元/分钟)能进行余额不足的报警:市话低于0.5元报警;国内长话低于5元报警;国际长话低于10元

2、报警;特殊电话低于8元报警,并且当余额不足以通话一分钟即停止通话 用Verilog语言对设计进行描述,并下载到实验板上调试成功,适当增加比较符合现实的控制限制。 写出设计性实验报告,并打印各层次的源文件和仿真波形,然后作简要说明。 并谈谈此次实验的收获、感想及建议三、 系统设计本次设计采用DE0实验板,系统时钟频率为50Mhz。用verilog语言对设计进行描述。1.系统框图:由题目要求,设计的输入应该实现通话种类和余额的设定。首先应存在一个分频器,把系统的时钟频率分解为1hz的秒脉冲。内部有计时器计算通话时间,同时有计费器实现四种模式的计费,同时设计一个报警器,当余额不足时产生报警信号。还应

3、设计数码显示电路,对卡内余额和通话时间进行显示,由一个开关进行切换。系统框图设计如下: 顶层模块 分频器 计费器 数码显示 (四种模式) (余额、 计时器 通话时间) (秒计时分计时) 报警器图1.系统框图2.输入输出设计:输入开关:Start:启动信号 0 计费器关闭 1 计费器启动,由一个开关控制。Mode:000 市话 001 国内长话 010 国际长话 011 特殊种类话费1xx 快速设定卡的余额。由三个开关控制。Show:显示切换 0 显示通话时间 1 显示余额。Add,Dec:设定余额按钮,用两个触点开关控制。输出:数码管:显示通话时间或余额。Warn:报警显示,用一个LED发光二

4、极管,余额不足时亮。Enable:系统工作的使能信号,由一个发光二级管显示,点亮时计费器可以正常工作,熄灭时,计费器不工作。3.系统ASM图:由系统框图和相应的输入输出,结合相应的条件,可以得到系统的ASM图。 Reset 0 Start 1 Mode 1xx 充值 000 001 010 011 市话 国内长话 国际长话 特殊 0 0 0 0费用0.5 费用5 费用10 费用8 1 1 1 1 报警 1 费用不足 0图2.系统ASM图四、 系统仿真1.各工作模式仿真波形按上面的ASM图,并结合DE0板子的特点进行模块设计和代码编写,并进行功能仿真和时序仿真。在仿真过程中,为了便于验证程序功能

5、的正确性,并缩短时间,对分频模块与数码显示模块进行了屏蔽(这两个模块是针对DE0设计的模块,在之前的数字钟实验中已经得到了验证),同时对端口稍作修改。功能仿真波形如下:图3.系统初始化对系统进行初始化如图3,Add信号置为低电平有效,Mode2置高电平,Start置低电平,进入充值模式。可以看到Second和Minute信号均为0,没有计时,每一个秒脉冲到来Money+10(BCD计数)。图4.特殊电话工作图测试计费器能否正常工作如图4,首先令Dec信号低电平有效,同样可以看到Money在时钟脉冲上升沿到来时减10(BCD计数),之后在310.0ns时置Mode信号为011,为特殊电话计费模式

6、,此时不足以通话五分钟(1.65=8.0),Warn信号变高电平。紧接着Start置高电平,由图可知下一脉冲上升沿到来时计时开始,Enable为高电平显示工作正常。1秒过后进行扣费显示Money由0030变为0014,扣费正确。图5.欠费强行挂机在图4.基础上又过了一分钟,此时分钟信号进位变为01,秒计时回0,此时费用不足,Enable信号变为低电平,计时停止。强行挂机的功能正确。以上三图基本上展示了电话计费器的功能,下面的波形验证其他模式工作是否工作正确。图6.普通市话图6是在图5的基础上将计费模式改为000普通市话并重新计时(Start输出一个低电平脉冲),此时Enable变成高电平有效,

7、话费充足,Warn信号变为低电平,在Second为01时扣费正确,普通市话模式工作正确。图7.国内长途图7先充值,使话费充足,Mode为001国内长途。通话时,Enable信号高电平,Warn信号低电平均正确,扣费正确(Money在Second为01时由0163变为0153),国内长话工作模式正确。图8.国际长途 首先令Mode2为1,Dec为0调整话费,之后Mode变为010国际长途计费模式,Start为1开始计费,费用充足,Enable为1,Warn为0。Second为01时Money由0118变为0098,扣费正确。此时余额不足以通话五分钟,Warn变为高电平,工作正确。图9.国际长途强

8、行挂机在图8状态下到Minute为05时余额不足,Enable信号变为低电平,时间清零。国际长途实现了自动挂机,该模式工作正确。时序仿真波形图:图10.时序仿真在功能仿真结束后进行时序仿真,图10是国际长途的时序仿真,可见与功能仿真是基本一致的,但是在Second和Money变量改变时出现了不稳定的中间状态,Warn信号变高电平出现了延迟。其他情况的时序仿真也出现了毛刺和短暂延迟,其他与功能仿真相同,此处不再一一列举。下面是quartus生成的电路图。图11.RTL电路图2. 实测 用quartus为DE0分配引脚,编译后将程序烧进DE0,电话计费器工作正常,时序仿真波形出现的毛刺没有影响系统

9、的功能。原因应该是时序仿真时时钟频率为50MHz,远高于现实中的1Hz,所以信号变化时极短暂的毛刺才显示出来,实际人眼不可能感受到。系统实现了预期的功能,顺利通过了验收。 注:在仿真部分忽略了一些波形图,比如国内长途的费用不足报警,欠费强行挂机等。这些波形与给出的一些波形图除了Mode不同其他变量变化情况均相同,而且它们在实际验收时工作也是正确的。现有的图形足以说明原理,为使报告简洁,将它们忽略了。五、 总结:1. 心得体会与自我评价:本次课设我经历了一次从接受任务,系统设计,编写代码与调试程序,波形仿真到最终硬件实现的全过程。从成果来看我对自己比较满意。最终的产品实现了课题要求的所有功能,而

10、且操作简便,运行稳定。而且我的代码设计也比较合理,设计了正确的算法,每个模块都发挥了相当大的作用。通过对模块的多次调用减少了代码量,我的全部代码只有200行。这次课设也使我获益匪浅,我对Verilog语言掌握的更加熟练,同时我对程序的调试能力和耐心都得到了很多锻炼,意志力得到了提高,对FPGA的开发也更加熟悉和有信心了。2. 改进和扩展:这次的课设也并非完美无缺,还是可以提高的。我看到的一点是在计费模块的充值部分,这部分代码如下: always (posedge cp ) begin case(mode) . 3b100, 3b101, 3b110, 3b111: begin if(add&(

11、money1990)money10)money=money-10; end endcase end 充值是与时钟同步的,虽然可以实现功能,但是充值较慢,可以将always语句的敏感事件改为always (posedge cp or negedge add or negedge dec)变成异步充值,可以加快充值速度,但这加大了调试的难度,多敏感事件时程序比较难写,容易出现各种奇怪的问题(虽然逻辑正确,但到了硬件的时候与预期有很大差异),这个值得尝试。 附录:源程序与注释 下面是该系统的具体实现:module telfee(clk,Start,Mode,Show,Add,Dec,Warn,LED

12、_3,LED_2,LED_1,LED_0,MPoint,TPoint,Enable);/*顶层模块:各端口已在输入输出设计中加以说明,它的输入输出全部在硬件中得到体现,它通过对其他模块的调用以及使能信号的控制,实现了对系统的全局控制。*/输入输出信号,在输入输出设计时已经说明。 input clk; input Start;/Start信号有效时相当于用户摘下电话机 input 2:0Mode; input Show; input Add,Dec; output Warn; output6:0LED_3,LED_2,LED_1,LED_0;/四个数码管的显示 output MPoint;/左边

13、第三个数码管的小数点,用以显示钱 output TPoint;/左边第二个数码管的小数点,用以显示时间 output Enable; /下面的秒,分,钱数都送到数码管输出,是中间变量 wire7:0Second; wire7:0Minute; wire15:0Money; wire CP; /秒脉冲信号 reg Enable; freqDiv_1Hz U0(clk,CP);/调用分频模块,得到秒脉冲 /下面两行体现Show开关的作用,可以显示不同的小数点 assign MPoint=Show; assign TPoint=Show; /U1,U2的调用实现了秒计时counter10 U1(Se

14、cond3:0,Start&Enable,Start,CP);counter6 U2(Second7:4,Start&Enable,(Second3:0=4h9),CP); /U3,U4的调用实现了分钟计时counter10 U3(Minute3:0,Start&Enable,(Second=8h59),CP);counter6 U4(Minute7:4,Start&Enable,(Second=8h59)&(Minute3:0=4h9),CP);/*上面四步就实现了整个系统的时间控制,注意由Start和Enable共同控制了计时器的清零信号,清零信号一直有效时,计费器停止工作。时间采用了84

15、21BCD计数,所以分别写了六进制和十进制的计数器,使计数更加方便。由时间的计数规则,容易得到计时使能信号的有效条件*/ balance U5(Add,Dec,Second,CP,Mode,Warn,Money);/*调用计费模块,用Second,CP作桥梁实现了与计时模块的结合,完成计费功能*/ SEG7_LUT S1(LED_0,Show,Second3:0,Money3:0); SEG7_LUT S2(LED_1,Show,Second7:4,Money7:4); SEG7_LUT S3(LED_2,Show,Minute3:0,Money11:8); SEG7_LUT S4(LED_3

16、,Show,Minute7:4,Money15:12);/*S1,S2,S3,S4实现了最终结果的显示,它可以显示时间的分和秒或者钱数,由Show信号控制*/下面的部分实现了计费器的清零复位,我觉得是所有代码中最大的亮点! always (posedge CP) begin case(Mode) 3b000: begin if(Money=16h0000&Second=8h00)Enable=0; else Enable=1; end 3b001: begin if(Money16h0010&Second=8h00)Enable=0; else Enable=1; end 3b010: beg

17、in if(Money16h0020&Second=8h00)Enable=0; else Enable=1; end 3b011: begin if(Money16h0016&Second=8h00)Enable=0; else Enable=1; end /*仅以case 3b011作说明,另外的case情况基本相同:根据计费规则,当Second=8h01时进行扣费(参见module balance),扣费后如果余额不足,只能再进行最后一分钟通话,所以Enable=0的条件是Money16h0016&Second=8h00 就是说余额不足且秒计时为零时正好过了一分钟,此时Enable为0,

18、即使Start信号有效,计时器依然不工作,相当于系统强行挂机。其他情况Enable为1,有效*/ default:Enable=1; endcase endendmodulemodule counter10(Q, nCR, EN, CP);/*十进制计数器,各个端口变量从左到右依次是,输出数字Q,清零信号nCR,计数使能信号EN,时钟脉冲信号CP*/ input CP, nCR, EN; output 3:0Q; reg 3:0 Q; always (posedge CP or negedge nCR) begin if(nCR) Q = 4b0000; / nCR0,计数器被异步清零 els

19、e if(EN) Q = Q; /EN=0,暂停计数 else if(Q = 4b1001) Q = 4b0000; /计数到9时下一时钟脉冲回零 else Q = Q + 1b1; /计数器增1计数 endendmodule module counter6(Q, nCR, EN, CP);/六进制计数器,与十进制类同 input CP, nCR, EN; output 3:0 Q; reg 3:0 Q; always (posedge CP or negedge nCR) begin if(nCR) Q = 4b0000; / nCR0,计数器被异步清零 else if(EN) Q = Q;

20、 /EN=0,暂停计数 else if(Q = 4b0101) Q = 4b0000; /计数到6时下一时钟脉冲回零 else Q = Q + 1b1; /计数器增1计数 endendmodule /*注:由于数码管的限制,计时最长时间为60分,之后会清零重新计,但这并不影响功能。即使通话时间超过1小时,依然可以根据显示自己算出通话时间*/module freqDiv_1Hz(in_50MHz,out_1Hz);/*分频模块,把输入的50MHz系统时钟信号变成1Hz的秒脉冲信号*/input in_50MHz;output out_1Hz;reg out_1Hz;reg 31:0cnt;/*下

21、面体现了分频原理,变量cnt以系统脉冲计数,当记到cnt=25000000时刚好需要0.5秒时间,此时令cnt清零,输出out_1Hz取反,就得到了周期为1秒钟的脉冲信号*/always(posedge in_50MHz)beginif(cnt 32d24999999)begincnt = cnt + 1b1;endelsebegincnt = 32b0;out_1Hz =1)money=money-1;/当秒时间为8h01且钱数足够时进行扣费,其他case原理相同 end 3b001: begin if(second=8h01&money=10)money=money-10; end 3b010: begin if(second=8h01&money=20)money=money-20; end 3b011: begin if(second=8h01&money=16)money=money-16; End/*以上各种模式的计费都是题目要求的十倍,原因是Verilog语言难

温馨提示

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

最新文档

评论

0/150

提交评论