电子技术课程设计报告电话计费卡的设计姓名:廖远清2010年3月目录一、课设课题及要求……………………………………………………………………1二、系统框图及模块分配……………………………………….………….……….1.三、各个模块的具体实现……………………………………….……….………….21)六十进制模块…………………………………………………....………….22)分计时模块……………………………………………………………….…..33)计费模块………………………………………………………………….……44)通话类型模块……………………………………………………….…….115)显示模块……………………………………………………………….…….116)分频模块………………………………………………………………..……12四、顶层模块调用…………………………..……………………………..…………12五、引脚分配…………………………………………………………………….……..14六、心的体会……………………………………………………………………….…..15七、程序代码…………………………………………………………………………..16一、课设课题及要求电话计费卡的设计①能够通过选择增减的方式快速设定卡内的余额(最大显示200元)②能设定通话的种类(1~4,按键选择),并能根据打电话的种类和通话时间进行金额的扣除:1为市话(0.1元/分钟),2为国内长话(1元/分钟),3为国际长话(2元/分钟),4为特殊种类电话(1.6元/分钟)③能进行余额不足的报警:市话低于0.5元报警;国内长话低于5元报警;国际长话低于10元报警;特殊电话低于8元报警,并且当余额不足以通话一分钟即停止通话二、系统框图及模块分配分析课设题目要求可以大致将该系统分为计时,计费两个大的模块,其中计费模块为本程序的核心部分,系统框图如下所示:秒计时器顶层调用余额计费管理分计时器通话类型模块报警数码管显示数码管显示显示模式选择分频模块图1系统框图各个模块的功能简要介绍如下:顶层调用模块:调用各个子模块,使各个子模块相互协调工作;秒计时器:进行通话计时,是扣除话费的重要依据;分计时器:调用秒计时器的进位信号,和秒计时器一起完成计时功能;余额计费管理模块:本系统的核心模块,涉及到充值时余额的变化、正常通话时话费的扣除、余额不足以相应类型通话五分钟的报警信号以及余额不足时的强制停止通话通话类型模块:根据输入完成相应的通话类型显示显示模式选择:由于数码管的数量有限,故需要将秒个位于通话类型分时共用一个,显示模式用以实现该功能。三、各个模块的具体实现1)、六十进制的实现:当总使能有效、通话开始时进行时,产生两个进位信号分别用于分计时以及余额扣除。当通话结束时,若不足六十秒,分进位信号不变,计费进位信号置1,实现不足一分钟按一分钟计算。具体实现代码及注释如下:modulecounter60(clk,secH,secL,cout,coutt,state,rs_n,start);inputclk,state,rs_n,start;//clk为时钟频率,state用于结束通话,即计时器停止计时,//rs_n为总的清零信号,start为计时开始信号,为高电平的时候开始计时,为低电平是将//计时器清零;outputcout,coutt;//进位信号,其中cout用于话费支付时的信号(60秒为单位),//coutt用于秒向分的进位信号。Output[3:0]secH,secL;//计时器的十位个位输出。Reg[3:0]secH,secL;regcout,coutt;always@(posedgeclkornegedgers_nornegedgestartorposedgestate)beginif(!rs_n){secH,secL}=8’b0;//总开关为低电平,计数器清零elseif(!start){secH,secL}=8’b0;//通话开关电平为低,计数器清零elseif(state==1’b1)//若通话结束,不足一分钟按一分钟处理,计数器计//数保持不变;计费进位信号为一,计时进位信号不变。Beginif(secH!=4’b0||secL!=4’b0)cout=1;{secH,secL}={secH,secL};endelsebeginif(secH==4’d5&&secL==4’d9)//计时器满六十,计时计费进位信号为一begincout=1;coutt=1;{secH,secL}=8’b0;endelsebegincout=0;coutt=0;if(secL==4’d9)beginsecL=4’b0;secH=secH+1’b1;endelsebeginsecL=secL+1’b1;endendendendendmodule波形仿真结果如下图所示:图2六十进制计时与暂停仿真由结果可以看出,当使能信号、通话开始信号有效时,计时正常,当通话结束完成是计时器保持不变,计费进位信号cout跳变一次;图3六十进制进位与清零仿真由仿真结果可以看出,当计数到59时,下一cp到来,cout,coutt跳变一次,当总使能为低电平时,计数清零。由以上两个仿真图可知该模块实现了预期要求;2)、分计时模块的实现,该模块可以直接调用秒计时模块,但由于其要实现的功能较为单一,并且实现简单,因而独立出来。其具体实现如下:moduletimecount(cp,tH,tL,rs_n,start);//分计时模块,cp为时钟信号,tH,tL分别为分计时输出高低位,rs_n为总的使能信号,//start为清零信号。inputcp,rs_n,start;output[3:0]tH,tL;reg[3:0]tH,tL;always@(posedgecpornegedgers_nornegedgestart)beginif(!rs_n){tH,tL}=8'b0;//使能信号或者清零信号为低时计数清零elseif(!start){tH,tL}=8'b0;elsebeginif(tL==4'd9&&tH=4'd4)begintH=tH+1'b1;tL=4'b0;endelseif(tL==4'd9&&tH==4'd5)begintH=4'd0;tL=4'b0;endelsetL=tL+1'b1;endendendmodule仿真结果如下所示:图4分计时与清零仿真由仿真结果可知,当通话开始信号为低电平时计时器清零,这样便于不同通话类型之间切换后计时从零开始。3)、计费模块:因电话卡的核心功能是有该模块实现的,因而该模块的实现较为繁琐。由于要实现快速充值,因而充值cp与计费cp是分时复用;不同通话类型切换时余额不变;不同通话类型,话费扣除数目不一样,因而需要不同的算法;余额不足时要产生报警信号等等。其具体实现如下:modulemoney(clk,cin,charge_a,charge_s,mH,mL,decide_kind,warn,cut,rs_n);//计费模块,此模块为本次课设的核心部分,clk为时钟信号,,cin为通话开始的信号//charge_a,charge_s分别为充值类型信号,mH,//mL为余额数目,decide_kind通话类型信号,warn余额不足五分钟时报警信号,cut余额不足一//分钟时信号,rs_n清零信号inputclk,cin,charge_a,charge_s,rs_n;input[1:0]decide_kind;outputwarn,cut;output[7:0]mH,mL;reg[7:0]mH,mL;regwarn,cut;always@(posedgeclkornegedgers_n)beginif(!rs_n){mH,mL}=16’b0;//清零时,余额数变为零elsebeginif(charge_a&&(!cin))//充值加begincut=0;if(mH[7:4]=4’d2)beginmH[7:4]=4’d2;mH[3:0]=4’d0;mL[7:0]=8’d0;//最高话费余额为200.0元endelseif(mL[7:4]==4’d9)beginif(mH[3:0]==4’d9)beginmH[7:4]=mH[7:4]+1’b1;//充值最小单位为元mH[3:0]=4’b0;mL[7:4]=4’d0;endelsebeginmL[7:4]=4’b0;mH[3:0]=mH[3:0]+1’b1;endendelsebeginmL[7:4]=mL[7:4]+1’b1;endendelseif(charge_s&&(!cin))//充值减begincut=0;warn=0;if({mH,mL}==16’d0)begin{mH,mL}=16’d0;end//最低余额为〇elsebeginif(mL[7:4]==4’d0)beginif(mH[3:0]==4’d0)beginmH[7:4]=mH[7:4]-1’b1;//最小单位为元mH[3:0]=4’d9;mL[7:4]=4’d9;endelsebeginmL[7:4]=4’d9;mH[3:0]=mH[3:0]-1’b1;endendelsemL[7:4]=mL[7:4]-1’b1;endendelseif(cin)//扣费begincase(decide_kind)//判断通话类型,执行相关的扣费额度2’b00:if({mH,mL}16’d5&&{mH,mL}=16’b1)//余额不足五分钟时,报警信号有效,通话继续进行beginwarn=1;mL=mL-1'b1;cut=0;endelseif({mH,mL}=16'd5)//余额大于五分钟时,通话正常进行begincut=0;warn=0;if(mL[3:0]==0)//余额角位为零,向元个位借位beginif(mL[7:4]==0)//元个位为零,向元十位借位beginif(mH[3:0]==0)//元十位为零,向元百位借位begin//即为整百时的扣费mH[7:4]=mH[7:4]-1'b1;mH[3:0]=4'd9;mL[3:0]=4'd9;mL[7:4]=4'd9;endelsebegin//整十时的扣费mH[3:0]=mH[3:0]-1'b1;mL[7:4]=4'd9;mL[3:0]=4'd9;endendelsebeginmL[7:4]=mL[7:4]-1'b1;mL[3:0]=4'd9;end//整元时的扣费endelsebeginmL[3:0]=mL[3:0]-1'b1;endend//通话类型为1时,余额不会出现大于0小于1的情况2'b01:if({mH[7:0],mL[7:4]}12'd5&&{mH[7:0],mL[7:4]}=12'd1)beginwarn=1;mL[7:4]=mL[7:4]-4'd1;cut=0;end//余额不足五分钟时报警信号有效,通话正常进行elseif({mH[7:0],mL[7:4]}=12'd5)begincut=0;warn=0;if(mL[7:4]==4'd0)beginif(mH[3:0]==4'd0)begin//余额元部分为整百是的扣费方法mH[7:4]=mH[7:4]-1'b1;mH[3:0]=4'd9;mL[7:4]=4'd9;mL[3:0]=4'd9;endelsebegin//余额元部分为整十是的扣费方法mL[7:4]=4'd9;mH[3:0]=mH[3:0]-1'b1;mL[3:0]=4'd9;endendelsebeginmL[7:4]=mL[7:4]-1'b1;endendelsecut=1;//余额不足一元时,通话强制结束2'b10:if(mH[7:0]8'd1&&{mH[7:0],mL[7:4]}=12'd2)//余额不足五分钟时报警信号有效,通话正常进行