卡式电话计费器实验报告.docx
- 文档编号:14129731
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:15
- 大小:141.07KB
卡式电话计费器实验报告.docx
《卡式电话计费器实验报告.docx》由会员分享,可在线阅读,更多相关《卡式电话计费器实验报告.docx(15页珍藏版)》请在冰点文库上搜索。
卡式电话计费器实验报告
卡式电话计费器实验报告
1实验目的
1了解卡式电话计费器的工作原理
2掌握卡式电话计费器的设计方法
2实验目的
1设计一个卡式电话计费器,可以实现如下功能:
1)计费器在电话卡插入后能将卡中的余额读出并显示出来;在通话过程中根据话务种类计费并将话费从卡中扣除,卡值余额每分钟更新一次,能对通话时间进行计时
2)当卡中余额不足时产生警告信号扬声器发声警告声音,当告警时间达到15s时切断当前通话。
通话时间最长59分钟,卡内余额最大50角。
话务分为3类市话,长话,特话。
市话按每分钟3毛钱计费,长话按每分钟6毛钱计费,特话不收费。
当卡中余额不足时产生警告信号扬声器发出警告声音,当警告时间达到15s时则切断当前通话,家丁通话时间最长是59分钟,卡内余额最大是59角。
3)要求利用数码管显示通话时间和卡值余额,利用发光二极管显示读卡信号,写卡信号,告警信号,切断通话信号,接通信号,和话务种类信号。
3实验原理
卡式电话计费器的接口示意图如图1卡式电话计费器原理所示,当用户将卡插入计费器时产生高电平的卡插入信号,然后读卡信号变高,此时可以读卡,同时显示卡内余额。
然后用户开始拨打所需的电话号码,则从电话局反馈回来的接通信号,高电平表示电路已经接通,低电平表示电路未被接通。
一旦接通满一分钟,则根据电话局反馈回来的话务种类信号按照计费标准进行计费,若卡中余额不足则产生警告信号,当告警时间达15s时产生切断通话信号,通知电话局切
图1卡式电话计费器原理
断当前通话,然后告警信号消失;若卡中余额充足,则产生写卡信号,将花费从卡中扣除,并显示当前余额。
同时计费器开始对通话时间进行计时,并显示。
当用户拔出卡之后,卡插入信号变为低电平。
4实验设计思路
该实验由两个模块组成:
核心模块是计费计时子模块,完成读卡显示卡内余额,计费,计时,告警等功能。
另有一个分频子模块,将试验箱中的20MHZ系统时钟分频为1KHZ和4HZ,作为扬声器发声的时钟信号以及计时子模块的输入时钟。
1实验模块
核心模块我们将它命名为:
account.v。
在account.v中首先采用assign语句和条件运算符实现:
只要电话卡一插入则显示卡内余额,并完成读卡信号,否则不显示卡内余额,读卡信号为0.然后采用3个always块分别完成产生分时钟,通话计时,设置卡内金额初值以及电话机费的功能。
1输入输出信号定义
clk1KHz,clk4hz:
时钟信号,频率分表示卡未插入别为1KHz和4Hz
on:
接通信号,高电平表示电路接通,低电平表示电路未接通
card:
卡插入信号,高电平表示卡插入,低电平表示卡未插入
category[1:
0]:
表示话务种类,01表示市话,10表示长话,11表示特话
set_money_low,set_money_high:
分别是设置卡内金额的地位和高位每按一下加1
clr:
清零信号
disptime[7:
0]:
显示本次通话时长,单位为分钟
dispmoney[7:
0]:
显示卡内余额
read:
当卡插入时变为高电平
write:
其下降沿到来时写卡
warn:
当卡中余额不足时产生告警信号
cut:
切断当前通话
speaker:
告警信号驱动扬声器发声
中间变量
reg[7:
0]money用于计费,高四位和低四位分别采用BCD码计数器
regmin_clk分时钟,写卡的时刻
integercnt1对通话时间计数
integercnt_warning用于计告警时间
2核心代码分析
1分时钟信号的产生
计数器cnt1以clk4hz为时钟进行计数,计到59s时,计数器清零,并产生分时钟信号min_clk。
代码如下:
always@(posedgeclk4hz)
begin
if(cnt1>=59)//当计时满59后,计时器清零且产生时钟信号。
表示满一分钟
begincnt1<='d0;min_clk<='b1;end
else
begin
min_clk<=0;
cnt1<=cnt1+1;
end
end
2通话计时
在插卡信号和接通信号同时有效的情况下,当分时钟有效是,计时加1。
但是在实验中我们将disptime的低位和高位分别与7段数码显示管连接,故,必须对disptime进行分段加1计数。
代码如下:
always@(negedgeclk4hzorposedgeclr)
begin
if(clr)disptime<=8'd0;
else
if(card&&on)//插卡
if(min_clk)
begin
if(disptime[3:
0]==9)//末位满9,则清零高位加1
begindisptime[7:
4]<=disptime[7:
4]+1;disptime[3:
0]<=3'b0;end
else
disptime[3:
0]<=disptime[3:
0]+1;
if(disptime[7:
4]==9)
disptime[7:
4]<='b0;
end
else
disptime<=disptime;
else
disptime<='d0;//插卡信号或接通信号无效
end
3设置卡内金额初值及计费
最重要的模块。
clr信号为清零信号,当clr信号到来时money清零。
否则,进行卡内初额设置和电话计费。
set_money_high,和set_money_low分别为设置卡内金额的地位和高位,每高电平一次,高位和地位分别加1。
当分时钟信号有效时,根据话务种类进行扣钱。
当金额不足时,产生warn信号,同时cnt_warning进行计时,当计时达15s时,产生cut信号,并挂断通话。
代码如下:
always@(negedgeclk4hzorposedgeclr)
begin
if(clr)
beginmoney<=8'd0;end
else
begin
if(set_money_low)money[3:
0]<=money[3:
0]+1;
if(set_money_high)money[7:
4]<=money[7:
4]+1;
if(money[7:
4]>='d5&&money[3:
0]>='d0)
begin
money[7:
4]<='d5;
money[3:
0]<='d0;
end
if(card&&on)
begin
if(min_clk)//通话时间够一分钟开始扣钱
case(category)
2'b01:
//通话为市话扣3毛钱==
begin
if(money<3)
begin
warn<='b1;
write<='b0;
end
else
begin
if(money[3:
0]<3)
begin
money[3:
0]<=money[3:
0]+'d7;
money[7:
4]<=money[7:
4]-'d1;
end
else
money[3:
0]<=money[3:
0]-3;
end
write<='b1;
warn<='b0;
end
2'b10:
//通话为长话,扣除6毛钱==
begin
if(money<6)
begin
warn<='b1;
write<='b0;
end
else
begin
if(money[3:
0]<6)
begin
money[3:
0]<=money[3:
0]+'d4;
money[3:
0]<=money[3:
0]-'d1;
end
else
money[3:
0]<=money[3:
0]-6;
end
write<='b1;
warn<='b0;
end
2'b11:
begin
write<='b1;
warn<='b0;
end
default:
beginwarn<='b0;write<='b0;cut<='b1;end
endcase
else//通话时间不到一分钟
begin
write<='b0;
if(warn)//开始计时达到15s后cut切断通话==
begin
if(cnt_warning==15)//警告时间达15s
begin
cut<='b1;//切断通话
cnt_warning<='b0;//警告时间复位
warn<='b0;//使warn为0停止发声
end
elsecnt_warning<=cnt_warning+1;
end
else//没有警告信号
begin
cnt_warning<='b0;
cut<='b0;
end
end
end
else//拔出卡片或是线路未接通
begin
money<='d0;
write<='b0;
warn<='b0;
end
end
end
核心模块最后生成的.bdf文件如图2顶层模块.bdf文件所示:
图2顶层模块.bdf文件
3时钟分频电路
代码如下:
输入clk为试验箱的20MHz系统时钟信号,经过分频将其分为频率为1KHz和4Hz的时钟信号,分别用clk1KHz和clk4hz表示。
moduleclk_div(clk,clk1KHz,clk4hz);
inputclk;
outputclk1KHz,clk4hz;
reg[14:
0]count1;
reg[22:
0]count2;
regclk1KHz,clk4hz;
always@(posedgeclk)
begin
if(count1>='d20000)
beginclk1KHz<=~clk1KHz;count1<='d0;end
else
count1<=count1+1;
if(count2>='d5000000)
beginclk4hz<=~clk4hz;count2<='d0;end
else
count2<=count2+1;
end
endmodule
其中可以通过修改count1和count2进行变化时的值修改时钟信号的频率。
该模块产生的.bdf文件如图3时钟分频电路.bdf文件
图3时钟分频电路.bdf文件
4顶层文件生成
图4顶层文件
顶层文件如图4顶层文件所示
2仿真波形
account.v的仿真波形如图5category=01的情况,图6category=10时的情况,图7category=11时的情况
图5category=01的情况
图6category=10时的情况
,下午
图7category=11时的情况
5实验感想
实验报告是1月18号,晚上才开始写的,因为之前要准备考试,而第二天就要回家,下午要收拾东西。
所以没有时间。
交作业会有些迟,希望老师原谅。
实验是在实验开放的前一个周五我用了一个下午的时间把代码和波形弄好,本以为波形对了,实验就没问题了,但是第一天到了实验室却发现根本没有任何现象。
因为试验箱的数码管是互相关联的,虽然有4个7段数码显示管,但是每次只能亮一个,要使4个全部亮必须利用时间延续。
于是就开始在同学的帮助下写利用时钟延续使4个数码管同时亮的代码,以及使7段数码管显示的代码。
代码如下
moduletransform(disptime,dispmoney,disptimehigh,disptimelow,dispmoneyhigh,dispmoneylow);
input[7:
0]disptime,dispmoney;
output[7:
0]disptimehigh,disptimelow,dispmoneyhigh,dispmoneylow;
reg[7:
0]disptimehigh,disptimelow,dispmoneyhigh,dispmoneylow;
always
begin
case(disptime[3:
0])
4'b0000:
disptimelow=7'b0111111;
4'b0001:
disptimelow=7'b0000110;
4'b0010:
disptimelow=7'b1011011;
4'b0011:
disptimelow=7'b1001111;
4'b0100:
disptimelow=7'b1100110;
4'b0101:
disptimelow=7'b1101101;
4'b0110:
disptimelow=7'b1111101;
4'b0111:
disptimelow=7'b0000111;
4'b1000:
disptimelow=7'b1111111;
endcase
case(disptime[7:
4])
4'b0000:
disptimehigh=7'b0111111;
4'b0001:
disptimehigh=7'b0000110;
4'b0010:
disptimehigh=7'b1011011;
4'b0011:
disptimehigh=7'b1001111;
4'b0100:
disptimehigh=7'b1100110;
4'b0101:
disptimehigh=7'b1101101;
4'b0110:
disptimehigh=7'b1111101;
4'b0111:
disptimehigh=7'b0000111;
4'b1000:
disptimehigh=7'b1111111;
endcase
case(dispmoney[3:
0])
4'b0000:
dispmoneylow=7'b0111111;
4'b0001:
dispmoneylow=7'b0000110;
4'b0010:
dispmoneylow=7'b1011011;
4'b0011:
dispmoneylow=7'b1001111;
4'b0100:
dispmoneylow=7'b1100110;
4'b0101:
dispmoneylow=7'b1101101;
4'b0110:
dispmoneylow=7'b1111101;
4'b0111:
dispmoneylow=7'b0000111;
4'b1000:
dispmoneylow=7'b1111111;
endcase
case(disptime[7:
4])
4'b0000:
dispmoneyhigh=7'b0111111;
4'b0001:
dispmoneyhigh=7'b0000110;
4'b0010:
dispmoneyhigh=7'b1011011;
4'b0011:
dispmoneyhigh=7'b1001111;
4'b0100:
dispmoneyhigh=7'b1100110;
4'b0101:
dispmoneyhigh=7'b1101101;
4'b0110:
dispmoneyhigh=7'b1111101;
4'b0111:
dispmoneyhigh=7'b0000111;
4'b1000:
dispmoneyhigh=7'b1111111;
endcase
end
endmodule
但是这样做了之后,出现了两个问题:
1引脚绑定的时候,dispmoney的高位和低位以及disptime的低位和高位有可能不是出现在相邻的位置。
2下载之后,数码管的显示并不稳定,显示的数字不清晰。
这样对数码管研究了一个晚上之后,那个晚上无功而返。
结束之后,通过询问其他做完实验的同学,我发现,老师会提供另外一种数码管让数字的显示变得非常简单。
第二天晚上我继续去实验室,用了老师提供的数码管,经过简单的修改,实验结果出现了!
这个结果让我非常惊喜!
因为我做了两个晚上加一个下午才做好的。
虽然期间有别人的帮助和XX的帮助,但是这里的代码都是我经过思考完全理解之后才写的。
在老师检查的时候,由于做的人太多,老师都没有看现象,其实我是有点失望的。
因为毕竟是我做了那么长时间的结果,也许有的人真的有抄代码的现象,但我真的是自己写的。
不过遗憾的是没有经过任何改进,因为,考期压力比较大,去重新思考这些问题,可能会占用我复习的时间,所以没有经过改进,这是我的失误,请老师原谅。
在此感谢老师几个月来的指导,并祝老师新年快乐。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 卡式 电话 计费 实验 报告