电话计费器电子技术课程设计报告刘青松.docx
- 文档编号:8627819
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:34
- 大小:1.85MB
电话计费器电子技术课程设计报告刘青松.docx
《电话计费器电子技术课程设计报告刘青松.docx》由会员分享,可在线阅读,更多相关《电话计费器电子技术课程设计报告刘青松.docx(34页珍藏版)》请在冰豆网上搜索。
电话计费器电子技术课程设计报告刘青松
目录
一、系统设计3
二、硬件软件平台简介4
三、模块设计4
1.控制与通话计费模块5
2.报警模块9
3.显示模块11
4.时钟模块12
四、系统仿真13
1.控制与通话计费模块13
2.报警模块14
3.其他功能14
五、下载调试15
六、设计总结17
1.实验简评17
2.心得体会17
3.功能改进与扩展17
附录一:
系统设计要求18
附录二:
源代码18
一、系统设计
本文课程设计根据电话计费器的系统设计要求(具体要求参看后文附录一:
系统设计要求),基于FPGA设计实现了该电话计费器,系统设计框图如下图1.1所示。
包括控制与通话计费模块、报警模块,时钟模块和显示模块等四个模块。
图1.1电话计费器系统设计框图
该模拟电话计费器的工作过程为:
系统上电,用户打开全局使能开关(模拟用户插入电话卡)后,整个系统开始运行。
当用户此时没有拨通电话时(即系统处于挂断状态),用户可以选择通话类型或进行充值。
当用户拨通电话时(即系统处于通话状态),系统进行通话计时并根据通话的类型进行相应的扣费。
市话为0.1元每分钟,国内长话为1元每分钟,国际长话为2元每分钟,特殊种类电话为1.6元每分钟。
通话类型由用户外部输入。
通话时,系统不断将话费余额与当前所选的通话类型计费率进行比较。
如果当前话费余额不足以通话一分钟,则挂断通话且报警提示;如果话费余额足以通话一分钟但是小于设置的报警值时,系统报警指示灯亮。
否则用户可以正常通话。
话费充值模块为了模拟方便,设置了增减充值方式。
可以通过两个按键分别进行十元加减充值和一元加减充值。
显示模块用来在数码管上显示当前话费余额和已通话时间,通过一个拨动开关切换显示。
系统的主要输入是全局使能信号EN,通话挂断信号RunSet,通话类型Option,加减充值选择AM,切换显示Switch等,主要的输出信号有四个数码管,报警和挂断LED灯,以及通话类型的显示等
二、硬件软件平台简介
本课程设计的硬件平台选用的是Alter公司的DE0开发板,DE0的芯片为CycloneIIIEP3C16F484C6,板上资源还包括50MHz晶振,4个阴极显示数码管,拨动开关和LED灯各10个,3个按键开关等。
资源布局如下图2.1所示。
图2.1DE0开发板
集成开发环境选用QuartusIIVersion9.1实现。
QuartusIIVersion9.1内置了仿真功能,因此不需要再选用其他软件进行仿真。
三、模块设计
根据课设设计要求及电话计费器的工作过程,本系统采用分层次化、分模块的方式设计,主要包括四个模块:
控制与通话计费模块、报警模块,时钟模块和显示模块。
控制与计费模块根据输入的控制信号和系统运行产生的控制信号完成计费功能和充值功能,并向主模块返回参数值。
报警模块接收控制与通话计费模块的参数值,判断并产生报警和挂断信息,并点亮LED灯报警。
显示模块动态可通过一个拨动开关的控制,显示通话时间与话费余额等信息。
时钟模块实现系统计时要求,最大可计时到24小时59分钟59秒。
实现本系统的总体思路是,首先设计实现系统框图中的各子模块,然后由顶层模块调用各子模块实现整个系统。
1.控制与通话计费模块
该模块流程状态图如下图3.1所示。
图3.1控制与通话计费模块流程状态图
具体工作过程为:
系统上电后打开全局使能开关EN,系统进入工作状态。
若开关RunSet=0,即变量Set=1,系统初始化话费为程序设定值。
此时用户可以手动充值,加减充值的选择通过一个拨动开关AM实现。
随后用户可以在该模式先进行通话类型的选择(注意在通话过程中,不可以改变通话类型),选择方式是不断按ButtonOp键在四种方式中进行选择。
然后用户可以拨通电话。
若开关RunSet=1且Stop=0,即变量Run=1时,电话拨通,时钟开始运行。
系统先判断当前的通话类型(Option[2:
1]=0,1,2,3分别对应系统的四种通话方式),然后进入相对应的计费函数。
市话每分钟扣费0.1元,国内长途每分钟扣费一元,国际长途每分钟扣费两元,特殊电话每分钟扣费1.6元。
注意,所有的扣费都是在每分钟的开始,即每分钟的第一秒进行扣费。
本系统中,对话费余额进行记录使用四个变量,分别对应话费余额的十分之一位、个位、十位和百位。
处理方法上,对于第一种通话方式每次来一个分钟脉冲时十分之一位减一,若十分之一位为0,则向前借位。
该位变量加十减一。
若前一位也为0,则继续借位。
若此时所有的高位都已为0,则不再扣费。
实际由于报警功能的存在,可能不会出现全零的情况就已经将通话挂断。
其他计费方式与此类似。
其中特殊电话通话类型要对十分之一位和个位分别处理,每一位的处理方式类似。
通话时间和花费余额调用显示模块进行显示。
部分实验代码如下所示。
下面仅列出了充值的部分代码和方式4特殊电话扣费的部分代码,全部的代码参看附录三:
程序源代码。
以下是通过按键开关实现花费充值功能的源代码。
注意仅仅列出了加方式十位充值的代码。
if(Set&&AM&&(~BottonH))//当按键按下时有效,BottonH代表十位充值
begin;
if((MoneyT<9)&&(MoneyH<2))//当钱数小于200时,且十位不进位时,正常加十元充值
begin
MoneyT=MoneyT+1;
end
elsebegin//当十位需要进位时
if(MoneyH==0)begin//如果百位为0,即十位进位后钱数不超过200时,向百位进位
MoneyH=MoneyH+1;
MoneyT=0;
end
elseif(MoneyH==1)begin//如果百位为1,即进位后钱数会超过200元,进位的同时将低位全部置0
MoneyH=MoneyH+1;
MoneyT=0;
MoneyO=0;
OneTenth=0;
end
elsebegin//如果钱数已经为200元,则不再允许充值
MoneyH=2;
MoneyT=MoneyT;
MoneyO=0;
OneTenth=0;
end
end
end
以下是实现方式4通话类型的计费功能的源代码。
注意省略了其他通话方式的代码,全部代码参看附录三。
if(SecEN&&((Option[1:
0]==2'b11)&&((OneTenth<=5)||(MoneyO<=1))))begin//当通话方式为4,且满足十分之一位或者个位需要借位时
if((MoneyO<=1)&&(OneTenth<=5))//进一步判断如果十分之一位和个位同时需要借位时
begin
if(MoneyT==0)//判断十位是否为0,为0则十位不可借位
begin
if(MoneyH==0)//进一步判断百位是否为0,为0则百位不可借位,余额已不足,不再扣费
OneTenth[3:
0]=OneTenth;
elsebegin//百位不为0,从百位借位
OneTenth=OneTenth+4;
MoneyO=MoneyO+8;
MoneyT=9;
MoneyH=MoneyH-1;
end
end
elsebegin//十位不为0,从十位借位
OneTenth=OneTenth+4;
MoneyO=MoneyO+8;
MoneyT=MoneyT-1;
end
end
elsebegin
if((MoneyO>1)&&(OneTenth<=5))begin//进一步判断如果仅十分之一位需要借位时,直接从个位借位
OneTenth=OneTenth+4;
MoneyO=MoneyO-2;
end
if((MoneyO<1)&&(OneTenth>5))begin//进一步判断如果仅个位需要借位时
if(MoneyT==0)//判断十位是否为0,为0则十位不可借位
begin
if(MoneyH==0)//进一步判断百位是否为0,为0则百位不可借位,余额已不足,不再扣费
OneTenth[3:
0]=OneTenth;
elsebegin//百位不为0,从百位借位
OneTenth=OneTenth-1;
MoneyO=9;
MoneyT=9;
MoneyH=MoneyH-1;
end
end
elsebegin//十位不为0,从十位借位
OneTenth=OneTenth-1;
MoneyO=9;
MoneyT=MoneyT-1;
end
end
end
end
//其他通话方式
elseif(SecEN&&((Option[1:
0]==2'b10)&&MoneyO<=1))
…………
elseif(SecEN&&((Option[1:
0]==2'b00)&&OneTenth[3:
0]==4'b0000))
…………
elseif(SecEN&&((Option[1:
0]==2'b01)&&MoneyO==0))
…………
elsebegin//当不需要借位时,对每位正常扣费
if(SecEN&&(Option[1:
0]==2'b00))OneTenth=OneTenth-1;
if(SecEN&&(Option[1:
0]==2'b11))OneTenth=OneTenth-6;
if(SecEN&&((Option[1:
0]==2'b01)||(Option[1:
0]==2'b11)))MoneyO=MoneyO-1;
if(SecEN&&(Option[1:
0]==2'b10))MoneyO=MoneyO-2;
end
2.报警模块
报警模块流程状态图如下图3.2所示。
图3.2报警模块流程状态图
该模块实现的具体实现过程简介如下。
系统进入报警模块以后,会判断当前通话类型和话费余额,并根据每种通话方式的费率进行报警或者挂断通话。
由上面的流程图可以看出,在每种通话方式下,余额小于设置的阈值时就会产生报警信号,Warn=1,并且点亮LED灯(即LedAlarm=1)。
同时判断话费余额是否小于该通话类型下的费率,即话费余额是否不足以通话一分钟,如果不能通话一分钟则产生挂断信号,Stop=1,并且点亮挂断信号灯(LedStop=1)。
该报警模块采用实现报警设计,即不断检测话费余额,如果用户进行了充值,则报警信号与挂断信号随即消除,系统正常进行通话与扣费。
报警模块部分实现代码如下所示。
值的代码。
always@(posedgeCP)begin//检测时钟的上升沿
if(Run&&(Option==0))//保证报警模块在通话时有效
begin
//通话类型1报警挂断实现方式
if((MoneyT==0)&&(MoneyO==0)&&(MoneyH==0)&&(OneTenth<=1))
Stop=1;
elseif((MoneyT==0)&&(MoneyO==0)&&(MoneyH==0)&&(OneTenth<=4))
Alarm=1;
elsebegin//当余额足够时随时撤销报警与挂断信号
Stop=0;Alarm=0;
end
end
//通话类型2报警挂断实现方式
if(Run&&(Option==1))
begin
if((MoneyT==0)&&(MoneyO<1)&&(MoneyH==0))
Stop=1;
elseif((MoneyT==0)&&(MoneyO<5)&&(MoneyH==0))
Alarm=1;
elsebegin
Stop=0;Alarm=0;
end
end
//通话类型3报警挂断实现方式
if(Run&&(Option==2))
begin
if((MoneyT==0)&&(MoneyO<2)&&(MoneyH==0))
Stop=1;
elseif((MoneyT==0)&&(MoneyO<10)&&(MoneyH==0))
Alarm=1;
elsebegin
Stop=0;Alarm=0;
end
end
//通话类型4报警挂断实现方式
if(Run&&(Option==3))
begin
if((MoneyT==0)&&(MoneyO==0)&&((MoneyH==0)||((MoneyH==1)&&(OneTenth<6))))//考虑个位与十分之一位判断是否余额小于阈值
Stop=1;
elseif((MoneyT==0)&&(MoneyO<8)&&(MoneyH==0))
Alarm=1;
elsebegin
Stop=0;Alarm=0;
end
end
end
3.显示模块
本系统中设计了显示模块专门用于数码管的显示。
本次设计中使用的DE0开发板的数码管是阴极数码管,由于需要显示的变量是通话时间和话费余额,都是十进制数,因此在设计数码管显示模块是,需要将一个四位以上(本次设计选用四位)的变量变成数码管的八个引脚的高低电平。
本系统中通过一个Switch拨动开关实现通话时间与话费语文的切换显示。
当显示通话时间时,前两个数码管显示分钟,后两个数码显示秒。
当显示余额时,四个数码管分别显示钱数的百位,十位,个位和十分之一位。
用于切换显示的代码如下所示。
Show(Show1C[7:
0],Sec[3:
0]);//将通话时间的秒位的低四位变成数码管的八个引脚的高低电平
Show(Show2C[7:
0],Sec[7:
4]);//将通话时间的秒位的高四位变成数码管的八个引脚的高低电平
Show(Show3C[7:
0],Min[3:
0]);
Show(Show4C[7:
0],Min[7:
4]);
//下面将话费余额的各位数变成数码管的八个引脚的高低电平
Show(Show1M[7:
0],OneTenth[3:
0]);
Show(Show2Mb[7:
0],MoneyO[3:
0]);
Show(Show3M[7:
0],MoneyT[3:
0]);
Show(Show4M[7:
0],MoneyH[3:
0]);
assignShow2M[7:
0]=(Show2Mb[7:
0]&127);//用于小数点的显示
//下面实现在通话时间和话费余额之间的切换显示
assignShow1[7:
0]=Switch?
Show1C[7:
0]:
Show1M[7:
0];
assignShow2[7:
0]=Switch?
Show2C[7:
0]:
Show2M[7:
0];
assignShow3[7:
0]=Switch?
Show3C[7:
0]:
Show3M[7:
0];
assignShow4[7:
0]=Switch?
Show4C[7:
0]:
Show4M[7:
0];
4.时钟模块
时钟模块的流程图如右图3.3所示。
通过分频将50MHz的晶振产生的
时钟源分成1Hz(模拟1Hz,比真实的
1Hz频率要高),通过对脉冲的计数实
现计时功能。
计时到59秒时产生一个向分钟进
位的信号,计时到59秒时产生一个向
小时进位的信号。
本实验中只要求对分
钟进行计数,因此对小时的计数显示不
属于系统要求之内,属于扩展功能。
同时,该时钟模块还会在计时到1
秒时产生一个脉冲信号,用于计费模块
进行扣费,即在每个分钟的开始进行扣
费不足一分钟的按一分钟计算。
图3.3时钟模块流程图
时钟模块部分代码如下所示。
Counter60(Sec[7:
0],Run,Run,CP);//调用60进制计数器对秒钟循环计数
//产生向分钟进位的信号
assignSecEN=Run&&(Sec[7:
0]==8'b01011001);
//产生向小时进位的信号
assignMinEN=Run&&((Min[7:
0]==8'b01011001)&SecEN);
//在每一分钟的第一秒产生SecEN0信号,用于计费模块进行扣费
assignSecEN0=Run&&(Sec[7:
0]==8'b00000001);
Counter60(Min[7:
0],Run,SecEN,CP);//调用60进制计数器对分循环计数
Counter24(Hour[7:
0],Run,MinEN,CP);//60进制计数器对小时循环计数
四、系统仿真
本次系统仿真使用QuartusII9.1集成开发环境自带的仿真功能实现,直接设置输入量的参数,因此不需要编写testbench测试程序。
以下是对各模块进行分模块仿真的结果。
1.控制与通话计费模块
方式1计费仿真波形如下图4.1所示。
当一分钟的脉冲到来时,进行0.1元的扣费。
注意,反正波形中显示的扣费脉冲到来时间由于手动设置与实际略有不同,实际计费过程中,在每分钟的第一秒即产生扣费脉冲信号。
图4.1方式1通话类型计费仿真波形
方式2,方式3,方式4通话类型仿真结果如下图4.2,4.3,4.4所示。
图4.2方式2通话类型仿真波形
图4.3方式3通话类型仿真波形
图4.4方式4通话类型仿真波形
由波形中可以看出,系统在四种方式下,正确实现了每来到一个分钟信号进行一个费率的扣费(图4.1,4.4有标记)。
在方式3中,每次扣1.6元,即分别对个位和十分之一位扣1个单位和6个单位,如图4.4所示。
2.报警模块
报警模块的仿真结果如下图4.5所示。
下面只列出了方式4通话类型的仿真结果。
图4.5方式4通话报警仿真波形
3.其他功能
选择通话方式的实现原理上是一个四进制计数器,其功能的仿真如下图4.6所示。
图4.6选择通话方式功能仿真
由仿真结果可以看出,随着按键BottonOp的上升沿的到来,四种方式标志变量轮流置1。
实现了方式选择功能。
五、下载调试
以方式4通话类型为例,给出下载调试后的结果如下图5.1,5.2,5.3所示。
图5.1方式4通话类型正常通话下载调试
由上图所示,其中数码管显示的是当前的通话时间是14分04秒,通过拨动最右边的一个拨动开关可以再通话时间和当前余额之间切换。
图中亮着的最右边的LED灯表示当前通话类型是方式4。
以此向左的三个灯分别代表方式3,方式2,方式1,此时处于不亮的状态。
可以通过最右边的按键开关进行方式选择。
由于当前余额足够,因此,没有产生报警信号。
图5.2方式4通话类型报警功能下载调试
图中数码管显示的是当前余额6.6元,由于方式4下,余额小于8元即产生报警信号,因此LED灯中最左边的一个变亮,指示报警信号。
图5.3方式4通话类型余额不足挂断功能下载调试
图中数码管显示的是当前余额0.8元,由于方式4下,通话费率是1.6元,余额不足以通话一分钟,系统挂断通话,并给出指示信号,LED灯中的第二个变亮。
六、设计总结
1.实验简评
本系统设计上采用分模块、分层次的设计原则,基本的模块是时钟模块,其他模块都要基于此模块实现。
时钟模块的输入是从50MHz的晶振分频而来的1Hz脉冲输入,输出为秒钟向分钟的进位信号,用作计费时,其进位要在分钟的开始而不是在最后。
相对仅仅产生一个分钟脉冲来说,本系统对时钟模块的设计较为规范,小时,分钟,秒钟均规范设计。
控制与通话计费模块是本系统的核心模块,控制系统主体功能的实现。
由于该系统设计显示是十进制,因此计费时对百位、十位、个位、十分之一位单独计算,这样一方面方便实现各位的显示,一方面也比直接从最低位计数更高效。
报警模块在设计上采用实时监测的方法,可以做到实时报警,充值后实时撤销报警。
2.心得体会
3.功能改进与扩展
附录一:
系统设计要求
1.能够通过选择增减的方式快速设定卡内的余额(最大显示200元)
2.能设定通话的种类(1~4,按键选择),并能根据打电话的种类和通话时间进行金额的扣除:
1为市话(0.1元/分钟),2为国内长话(1元/分钟),3为国际长话(2元/分钟),4为特殊种类电话(1.6元/分钟)
3.能进行余额不足的报警:
市话低于0.5元报警;国内长话低于5元报警;国际长话低于10元报警;特殊电话低于8元报警,并且当余额不足以通话一分钟即停止通话
4.用Verilog语言对设计进行描述,并下载到实验板上调试成功,适当增加比较符合现实的控制限制。
附录二:
源代码
ModulePhone(LedAlarm,LedStop,LedOption,Show1,Show2,Show3,Show4,
EN,Clk,RunSet,Switch,AM,Fast,BottonH,BottonL,BottonOp,LedOther);
inputEN,Clk,RunSet,Switch,AM,Fast,BottonH,BottonL,BottonOp;
//输入分别是使能,时钟输入,通话挂断键,数码管切换显示开关,加//减充值选择,快速或正常计时频率选择开关,十位充值按键,个位充//值按键,通话类型选择按键
output[7:
0]Show1,Show2,Show3,Show4;//该输出对应四个数码管
output[7:
0]LedOther;//对应实验中未用到的LED灯,将其置0以避免不定态
output[3:
0]LedOption;//指示当前的通话类型的LED灯
outputLedAlarm,LedStop;//对应报警和挂断LED灯
wire[1:
0]Option;//两位的变量,存储通话类型
wireAlarm,Stop;//报警和挂断的标志变量
wire[3:
0]MoneyO,MoneyT,MoneyH,OneTenth;//对应话费余额的每一位
wire[7:
0]Sec,Min,Hour,//秒钟,分钟,小时变量
Show1,Show2,Show3,Show4,//数码管显示的中间变量
Show1M,Show2M,Show2Mb,Show3M,Show4M,//将分钟变量变成数码管的八个引脚的电平值
Show1C,Show2C,Show3C,Show4C;//将秒钟变量变成数码管的八个引脚的电平值
wireClk,CP,Run,Set,B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电话 计费 电子技术 课程设计 报告 青松