FPGA模拟电话计费器设计.docx
- 文档编号:14168532
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:21
- 大小:239.63KB
FPGA模拟电话计费器设计.docx
《FPGA模拟电话计费器设计.docx》由会员分享,可在线阅读,更多相关《FPGA模拟电话计费器设计.docx(21页珍藏版)》请在冰点文库上搜索。
FPGA模拟电话计费器设计
《可编辑器件及应用》
期末综合设计报告
题目:
电话计费系统
学号:
姓名:
完成时间:
2015年07月07日
摘要
FPGA芯片的集成度越来越高,极大地满足用户的要求,可以用到生活中的各个领域。
现在的可编程逻辑器件稳定性高,代码容易编写和修改。
如verilogHDL代码程序(硬件描述语言),verilog的部分语法是参照C语言的语法设立的(但与C有本质区别),因此,具有很多C语言的优点,从形式表述上来看,verilog代码简明扼要,使用灵活,且语法规定不是很严谨,容易上手。
本系统采用50MZH的脉冲作为内部时钟脉冲,因此要进行分频作为秒脉冲(1HZ)用于计时;本系统还涉及到按键问题,因此要进行按键消抖,我们采用延时的方法作为简单的消抖处理。
关键字:
可编程逻辑器件;verilogHDL;脉冲;消抖
第一章绪论
1.1FPGA发展及现状
随着先进科技的发展,计算机仿真与应用技术也在发生着日新月异的变化。
在计算机技术实现重大飞跃的同时,复杂可编程逻辑器件(FPGA)的应用逐步渗透到生产与生活各个方面,给人们生活带来了极大方便。
因其性能的不断提高,应用范围也越来越广。
1.2电话计费器相关背景
在商品经济迅猛发展中,人们对电话的需求日益增长,大力发展和普及公用电话,以满足人们日常生活以及流动人口办理业务之需已成为当前市场趋势。
在公用电话业务发展中,由于诸多原因,计费不准的现象屡见不鲜,相关管理混乱,给人们生活带来极大不便。
为了使电话计费更加准确,本文将介绍一种采用FPGA设计实现电话计费器的方法。
1.3基于FPGA实现电话计费器的方案设计基本原则
本文将针对自动计费电话机为例,给出方案设计基本原则如下:
能够通过选择充值金额的方式快速增加卡内的余额;能够设计通话的种类(如按1键选择),并能够根据打电话的种类和通话时间进行金额的扣除:
1为市话(0.15元/分钟),2为国内长途(1.5元/分钟),3为国际长途电话(3元/分钟);能进行余额不足的报警:
市话低于0.3元、国内长途低于3元报警、国际电话低于6元报警,led闪烁报警;当余额不足以通话一分钟即停止通话,并且蜂鸣器拉响。
因为在设计中只对电话机的计费系统进行设计,而没有涉及到电话通话的信令过程,因此通话类型必须由外部输入。
1.4论文主要完成的工作
本文主要完成对电话计费系统的FPGA设计,其中包括系统组成框图、相关程序设计、系统仿真三大部分。
设计语言采用Verilog_HDL硬件描述语言。
第二章系统的硬件设计
2.1电话计费器的控制要求
为了使电话计费器能够正常稳定运行,在设计时应考虑到如下几点:
在插入电话卡的同时,电话计费器的控制模块开始工作;电话计费控制器与正常通话计费、计时模块相连,以实现整个系统的计费计时功能;如果卡内余额不足,报警模块将实现报警功能,报警模式采用声光报警;计费计时模块与显示模块相连,显示模块应实现对通话时间以及对话费余额的显示功能。
其计费一般过程可概括为:
用户插入电话卡(按键)→整个系统开始运行→显示卡内余额。
由于没有信号接受器,该系统将由按键设置输入通话类型(市话、国内/国际长途)。
如果选择通话,计费系统将话费余额与所选通话类型计费率进行比较。
如果话费余额小于费率值,则禁止通话且报警提示;如果话费余额大于等于通话二分钟门限,是正常通话状态,通话指示灯亮;如果话费余额大于或等于费率值并且小于通话二分钟门限,则进入通话指示灯闪烁;通话时间不足一分钟,通话指示灯闪烁且声音报警。
根据电话计费器的工作过程,本系统采用分层次化、分模块的方式设计,本系统设计的系统组成框图如图1所示三个模块:
控制与计费模块、显示模块和报警模块。
如图中虚线框所示。
控制与计费模块完成计费功能并产生控制信号,控制另外两个模块。
显示模块动态显示通话时间与通话余额计费等信息。
报警模块是根据通话中出现的报警信息,及时给出声、光或者声光同时报警。
图1
电话计费控制器
时钟
正常通话计费计时模块
显示方式
通话计时显示
话费余额显示
余额不足声光报警
插入电话卡
2.2方案设计
2.2.1按键分配
本系统采用按键对插入电话卡、选着充值金额、确认充值、通话类型、拨打/挂断、接通/挂断的模拟,这里时间和费用计数器均采用十进制表示。
按键分配如下:
key[0]:
有卡或无卡
key[1]:
选择充值金额(5元、10元、50元)
key[2]:
查余额(check=0)/上次通话时间(check=1)
key[3]:
选择通话模式(市话、国内长途、国际长途)
key[4]:
确定充值(在key[1]选择后)/拨打或挂断(在key[3]选择后)
key[5]:
接通/挂断
2.2.2按键消抖原理
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。
而靠软件编程来识别的称为非编码键盘。
在一般嵌入式应用中,用的最多的是非编码键盘,也有用到编码键盘的。
非编码键盘有分为:
独立键盘和行列式(又称为矩阵式)键盘。
如图2.1所示,按键在闭合和断开时,触点会存在抖动现象。
在按键按下或者是释放的时候都会出现一个不稳定的抖动时间,如果不处理好这个抖动时间,我们就无法处理好按键编码,所以我们的设计中必须有效消除按键抖动。
图2.1按键波形
2.2.3按键消抖原方法
为了得到稳定的信号,必须去掉抖动信号,因为抖动时间一般为20ms左右,所以我们采用了按键按下延时20ms的方法。
即当按键按下时,用一个寄存器cnt统计脉冲clk上升沿的次数(50MHZ),在主程序中检测条件当cnt=1000000(20ms)时,表示有按键按下,否则表示无按键按下。
代码如下:
always@(posedgeclk)//消抖
begin
if(key)cnt<=0;
elsecnt<=cnt+1'b1;
end
如图2.2所示,4个独立按键一端接地,另一端在上拉的同时连接到CPLD的I/O口。
当I/O口(SW0/SW1/SW2/SW3)的电平为高时,说明按键没有被按下,当I/O口的电平为低时,说明按键被按下了。
图2.2独立按键接口
2.3各功能的设计和实现
2.3.1控制与计费模块
该模块的主要功能是控制电话的计费和报警,是整个设计的核心。
控制与计费模块输入信号有:
插卡输入信号enable(准备通话)、t1[2:
0](通话类型选择)、count1(系统工作的秒脉冲时钟信号)。
具体工作过程为:
初始化显示上次卡内的余额,且enable为无效电平,当用户按下enable键,使之成为有效电平时电路进入工作状态。
首先判断通话类型t1[2:
0](市话、国内长途、国际长途)。
若t1[2:
0]=3’b0xx,表示进入通话状态,每分钟balance=balance-fee;计费系统将余额与所选取的通话类型计费率(每分钟所收取的费用fee)进行比较。
如果话费余额balance小于费率fee值,则禁止通话且声光报警;如果话费余额balance大于等于门限2*fee(只能通话二分钟门限),是正常通话状态,通话指示灯亮;如果话费余额balance大于等于费率fee值并且balance小于2*fee,则进入通话报警状态,表示通话时间不足二分钟。
通话报警灯亮,通话指示灯闪烁且声音报警。
计费过程:
当下一分钟到来且电路工作在限制通话或正常工作状态,则在秒脉冲的上升沿通话时间发生改变,并将改变后的值输出至显示模块。
2.3.2模块的设计
1分频功能
Clk是50MHZ的脉冲信号,因此要将其分频为秒脉冲(1HZ),如图所示:
代码如下:
always@(posedgeclk)
begin
count=count+1'b1;
if(count==24'd25000000)begincount1=~count1;count=0;end
end
2显示模块
该模块的主要功能是实时显示通话时间、话费余额、充值金额、通话模式。
利用动态扫描6位7段数码管显示,即位选对应段选输出,每一位的有效状态为0~9;
3通话计时模块
当en=1(拨通电话)后,re_en=1(接通电话),即进入通话中,则启动计时功能,计时框图如下所示:
程序如下:
always@(posedgecount1)
if(re_en)//通话中
begin
if(miao==1'b1)
balance=balance-fee;//费用,不足一分钟按一分钟计
end
4报警模块
该模块的功能是产生声光报警信号,提示用户卡内余额不足。
控制与计费模块允许输出信号on,报警输出warn及整个系统的输入允许信号enable作为该模块的控制信号,当报警条件满足时,通话指示灯闪烁或声音提示。
程序如下:
if(balance<=fee)beginwarn=count1;en=0;re_en=0;end
assignled[2]=(balance<=fee)?
count1:
(en?
(balance<=2*fee?
count1:
en):
0);//通话led长亮,余额少于2分钟led闪烁
2.4控制系统的实现
整个系统各模块设计仿真实现后,分别创建成元件符号,将各个模块用Verilog_HDL语言或者图形的方法连接起来,形成顶层模块。
然后创建工程,经过输入、调试、综合、适配、仿真后,确认能够实现系统所有功能后,进行编程下载,最终实现对整个系统的控制。
第三章系统的软件设计
3.1软件整体设计
本系统设计的系统组成框图如图1所示。
包括三个模块:
控制与计费模块、显示模块和报警模块。
如图中虚线框所示。
控制与计费模块完成计费功能并产生控制信号,控制另外两个模块。
显示模块动态显示通话时间与通话余额计费等信息。
报警模块是根据通话中出现的报警信息,及时给出声、光或者声光同时报警。
本系统采用Verilog_HDL硬件描述语言进行设计。
3.2主要模块软件设计
显示余额与充值模块流程图
显示模块流程图
报警模块流程图
3.3引脚分配
六个按键引脚分配:
LED引脚分配:
第四章总结
本文介绍了一种全新的电话计费系统的FPGA设计方法,如果结合到实际改变设计中计费要求,就可以应用到各种自动电话计费系统中。
通过对本学期《数字系统设计与VerilogHDL》这门课的学习,我初步了解了EDA和数字系统设计的相关知识,其中包括EDA技术、FPGA/CPLD器件、VerilogHDL硬件描述语言等。
此门课以QuartusⅡ软件为平台,以可综合的设计为重点,并通过老师对已经过大量实践验证的数字设计实例的讲解,使我们在学习过程中培养了兴趣,增长了知识,并且能够对简单的系统进行设计与实现。
随着计算机技术和微电子技术工艺的发展,现代数字系统的设计和应用进入了新的阶段。
电子设计自动化技术(EDA)在数字系统设计中起的作用越来越重要,新的工具和新的设计方法不断推出,可编程逻辑器件不断增加新的模块,功能越来越强,硬件设计语言也顺应了形势,推出新的标准,更加好用,更加便捷。
为了顺应时代潮流的发展,越来越多的数字系统将采用硬件描述语言来进行设计,作为一个从事数字系统设计开发的工程师,必须至少熟练掌握一种HDL语言。
为了巩固学习效果和实践动手能力,杜绝死记硬背,充分巩固对在课程学习的相关知识,采用课程设计的方法有利于考查我们综合应用的能力,提高其动手和分析能力,为今后的学习和就业提供帮助。
这次课程设计,不仅使我巩固了Word2010的用法,同时也锻炼了我的综合应用能力。
在设计过程中,通过查找相关资料,培养了我搜索信息的能力,提高了动手和分析能力。
总之,我在这次课程设计中受益匪浅。
第五章源程序代码
modulesystem(clk,sm_bit,sm_seg,key,led,warn);
inputclk;
input[5:
0]key;
outputwarn;
output[3:
0]led;
output[5:
0]sm_bit;
output[7:
0]sm_seg;
regwarn;
reg[5:
0]sm_bit;
reg[7:
0]sm_seg;
reg[24:
0]count;
reg[36:
0]cnt0,cnt1,cnt2,cnt3,cnt4,cnt5;
reg[16:
0]balance='d500,balan,fee,money;
regcount1,enable,en,re_en,check,b,s,s1;
reg[2:
0]t,t1,a;
reg[4:
0]shi,y_shi;reg[5:
0]fen,y_fen;reg[5:
0]miao,y_miao;reg[3:
0]bufr;
always@(posedgeclk)
begin
count=count+1'b1;
if(count==25'd25000000)
begincount1=~count1;count=0;end
end
always@(posedgeclk)//消抖
begin
case(key)
6'b111110:
cnt0<=cnt0+1'b1;
6'b111101:
cnt1<=cnt1+1'b1;
6'b111011:
cnt2<=cnt2+1'b1;
6'b110111:
cnt3<=cnt3+1'b1;
6'b101111:
cnt4<=cnt4+1'b1;
6'b011111:
cnt5<=cnt5+1'b1;
default:
begincnt0<=0;cnt1<=0;cnt2<=0;cnt3<=0;cnt4<=0;cnt5<=0;end
endcase
end
always@(posedgeclk)
begin
if(cnt0=='d1000000)enable=~enable;//使工作或不工作
if(enable)//通信正常工作
begin
if(balance<=fee&&en)begina=1;en=0;re_en=0;end
if(balance<=fee)warn=count1;
if(balance>fee)warn=1;
if(cnt1=='d1000000)//选择充值金额
begin
a='d2;
t=t+1'b1;if(t==3'd4)begint=1;end//数码管显示money
if(t)
case(t)
3'b001:
money<='d500;//5元
3'b010:
money<='d1000;//10元
3'b011:
money<='d5000;//50元
endcase
end
elseif(cnt4=='d1000000&&t)//确定充值
begin
s=1;
t<=0;
a=1;
end
elseif(cnt2=='d1000000)//查余额,数码管显示balance,上次通话时间
begin
check=~check;
a=1;
t=0;
t1=0;
end
elseif(cnt3=='d1000000)//选择通话模式
begin
a='d3;
t1=t1+1'b1;b<=1;
if(t1==3'd4)begint1=1'b1;b<=0;end//数码管显示fee
if(t1)
case(t1)
3'b001:
fee='d15;//本地0.15元/分
3'b010:
fee='d150;//国内长途1.5元/分
3'b011:
fee='d300;//国际长途3.0元/分
endcase
end
elseif(cnt4=='d1000000&&b)//拨通或挂断
begin
t1<=0;
a='d5;
en=~en;
if(en==0)beginb<=0;re_en<=0;a=1;end
end
elseif(cnt5=='d1000000&&en)//接通或挂断
begin
a='d4;
re_en=~re_en;
if(re_en==0)beginen<=0;b<=0;a=1;end
end
elseif(t&&t1)begint<=0;t1<=1;b<=0;check<=0;a<=1;end
elseif(t&&check)begint<=0;check<=0;a<=1;end
elseif(t1&&check)begint1<=0;b<=0;check<=0;a<=1;end
elseif(s1)s<=0;
end
elsebegint<=0;t1<=0;b<=0;check<=0;warn=1;end
end
assignled[3]=enable;
assignled[2]=enable?
((balance<=fee)?
count1:
(en?
(balance<=2*fee?
count1:
en):
0)):
0;//l通话led长亮,余额少于2分钟led闪烁
assignled[1:
0]=0;
always@(posedgecount1)
begin
if(miao==1'b1)
balance=balance-fee;//费用,不足一分钟按一分钟计
if(s)
beginbalance=balance+money;s1=1;end
elseif(s==0)s1<=0;
end
always@(posedgecount1)
begin
if(re_en)
begin
miao=miao+1'b1;
if(miao==6'd60)fen=fen+1'b1;
if(fen==6'd60)shi=shi+1'b1;
if(miao==6'd60)miao=0;
if(fen==6'd60)fen=0;
if(shi==5'd24)shi=0;
y_miao<=miao;
y_fen<=fen;
y_shi<=shi;
end
if(!
re_en)
begin
miao<=0;
fen<=0;
shi<=0;
end
end
always@(posedgeclk)
begin
if(enable)
case(count[15:
13])//位选
3'b000:
beginsm_bit=6'b11_1110;end
3'b001:
beginsm_bit=6'b11_1101;end
3'b010:
beginsm_bit=6'b11_1011;end
3'b011:
beginsm_bit=6'b11_0111;end
3'b100:
beginsm_bit=6'b10_1111;end
3'b101:
beginsm_bit=6'b01_1111;end
3'b110:
beginsm_bit=6'b11_1111;end//消隐
endcase
elsesm_bit=6'b111111;
end
always@(clk)
begin
case(sm_bit)
6'b11_1110:
begin
if(!
check&&a==1)bufr=balance%'d10;
elseif(check)bufr=y_miao%4'd10;
elseif(t&&a=='d2)bufr=money%'d10;
elseif(t1&&a=='d3)bufr=fee%'d10;
elseif(re_en&&a=='d4)bufr=miao%4'd10;
end
6'b11_1101:
begin
if(!
check&&a==1)bufr=balance/4'd10%4'd10;
elseif(check)bufr=y_miao/4'd10;
elseif(t&&a=='d2)bufr=money/'d10%'d10;
elseif(t1&&a=='d3)bufr=fee/4'd10%4'd10;
elseif(re_en&&a=='d4)bufr=miao/4'd10;
end
6'b11_1011:
begin
if(!
check&&a==1)bufr=balance/'d100%'d10;
elseif(check)bufr=y_fen%4'd10;
elseif(t&&a=='d2)bufr=money/'d100%'d10;
elseif(t1&&a=='d3)bufr=fee/'d100%'d10;
elseif(re_en&&a=='d4)bufr=fen%4'd10;
end
6'b11_0111:
begin
if(!
check&&a==1)bufr=balance/'d1000%'d10;
elseif(check)bufr=y_fen/4'd10;
elseif(t&&a=='d2)bufr=money/'d1000;
elseif(t1&&a=='d3)bufr=0;
elseif(re_en&&a=='d4)bufr=fen/4'd10;
end
6'b10_1111:
begin
if(!
check&&a==1)bufr=balance/'d10000%'d10;
elseif(check)bufr=y_shi%4'd10;
elseif((t||t1)&&(a=='d2||a=='d3))bufr=0;
elseif(re_en&&a=='d4)bufr=shi%4'd10;
end
6'b01_1111:
begin
if(!
check&&a==1)bufr=balance/'d100000;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 模拟 电话 计费 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)