周鼎舜,覃秋荣,王颖
(大连理工大学城市学院,辽宁大连,116000)
关键字:FPGA;Verilog HDL;电话计费器
随着社会经济的快速发展,电话计费器在相关通信领域以及社交场景具有广泛的使用需求,历史上对于电话计费功能还不完善,现在的需求不满足,所以本文进行电话计费器的设计。
FPGA简 介:FPGA(Field Programmable Gate Array)即现场可编程门阵列,于1985年由xilinx创始人之一Ross Freeman发明,虽然有其他公司宣称自己最先发明可编程逻辑器件PLD,但是真正意义上的第一颗FPGA芯片XC2064为xilinx所发明,它具有可编程可随时修改设计、开发周期短、灵活、风险小且成本低等优点,使用非常广泛。用FPGA验证IP核,可以随时修改设计,大大降低了成本,减少了风险,同时FPGA工艺不断进步,性能也不断提高,除了极少数对速度、功耗非常高的集成电路(如当今主流的通用处理器)外,一般都可以用FPGA来验证或实现。一般而言,FPGA的基本结构由以下几个部分构成:(1)可编程逻辑功能模块(Configurable Logic Blocks,CLB); (2)可编程输入输出模块(Programmable Input/Output Blocks,IOB);(3)可编程内部互连资源(Programmable Interconnection PI)。
Verilog简介:Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
包括外部输入、内部处理和输出显示等部分。其中,LED报警信号和数码管输出为输出信号,其余为输入信号。Reset使系统复位清零,EN信号作为系统的使能信号;Menu用于菜单和功能的选择,Call End是通话结束的按键,相当于挂机键,Add和Sub作为各种功能的调节键,实现了复用;数码管可以按照预先定义的输出方式,输出菜单和相应的信息,报警信号作为余额不足时的提示信号。
主控模块:telephone菜单模块,完成各个子模块的协调工作和相互之间的数据传输。
时间模块:调用下属的计数器模块,使得整体结构较好,方便调试和修改。同时,可以将调节小时和分钟的信号分别接到add和sub上,以实现资源合理利用。而counter10,counter24和counter6相同,三个模块实现了10进制,24进制和6进制的计数器制作。
菜单模块:四进制计数器实现了menu的状态转换,用这个计数器来控制整个系统的工作。
翻译显示模块:对计费系统显示的文字做至少两种语言以上的翻译并显示。
通话种类模块:该模块实现通话种类的选择,实际上是实现了一个四进制的计数器,同时根据计数器的值来确定一个通话种类,最终计数器的数值是通话种类的代号。十进制计数器仿真波形图是满十进一的过程,communicate是实现了对于通话过程的模拟即话费的计算。
图2 设计模块图
图3 软件设计图
设置通话模块:这部分实现了对于通话过程的模拟,程序中,实现了花费的计算,考虑到实际情况是在1s的时候开始减少的,所以当second=1的时候,话费才算做1minute之内。
LED调试模块:这个模块主要是在我们调试的时候用来模拟一下各个LED的显示状况是不是符合系统预先设定的情况。在这个调试的过程中,将输出的32位调到十六进制,就能够模拟在真实的实验开发板上面的状况。
分频模块:分频可以合理地进行各单元功率分配,使各单元之间具有恰当的相位关系以减少各单元在工作中出现的声干涉失真。
由系统框图和相应的输入输出,结合相应的条件,可以得到系统的ASM图。
(1)能够通过选择增减的方式设置卡内余额(最大显示为200元 )。
(2)能够设置通话的种类(1~4),并能够根据电话的种类和通话时间进行金额的扣除:1为市话(0.1元/分钟),2为国内长途(1元/分钟),3为国际长途(2元/分钟),4为特殊电话(1.6元/分钟)。
(3)能够进行余额不足的报警:市话低于0.5元报警,国内长途低于5元报警,国际长途低于10元报警,特殊电话低于8元报警。然后返回菜单进行相应的话费充值。
部分模块的电路模块图和波形仿真图如下。
图4 系统的部分模块设计
说明:
(1)counter6模块是实现了六进制计数器的操作,从0~5反复循环计数。
(2)counter10模块是实现了六进制计数器的操作,从0~9反复循环计数。
(3)counter24模块是实现了六进制计数器的操作,从00~23反复循环计数。
(4)clock模块是时间模块,其调用了下属的counter6、10、24这三个计数器模块用来显示时间为:
时时:分分:秒秒
即00:00:00到23:59:59的轮回计时方式
这使得整体结构较好,方便调试和修改。同时,调节小时和调节分钟的信号分别连接到add和sub上面,实现了资源的合理利用。
(5)counter4是菜单模块,这四进制计数器实现了menu的状态转换,用这个计数器来控制整个系统的工作。当该计数器为4’b0000时控制了clock时间模块工作,为4'b0001时控制了SetBalance设置余额模块工作,为4'b0010时控制了SetFee设置通话种类模块工作,为4'b0011时控制了communicate通话模块工作。
(6)trad_1是分频模块,可以通过硬件描述语言进行时钟分频。通过该分频器设计可以实现节省锁相环资源,达到对系统时钟操作的目的。
(7)SetBalance设置余额模块,能够通过选择增减的方式设置卡内余额(最大显示为200元)。
(8) communicate通话模块,实现了对通话过程的模拟,在程序中,实现了话费的计算,考虑到实际情况话费是在1s的时候开始减少的,所以当second=1的时候,话费才算做一分钟之内的。
(9)SetFee设置通话种类模块,该模块实现了通话种类的选择,在这个模块中,实际上是实现了一个四进制的计数器,同时根据计数器的值来确定一个通话种类,最终计数器的数值是通话种类的代号。sort是8’d1为市话、是8'd2为国内长途、是8'd3为国际长途、是8'd4为特殊电话。
(10)led调试模块,这个模块主要是在调试的时候用来模拟各个led的显示状况是不是符合预先设定的那种情况,在调试的过程中,将输出的32位调到十六进制,就能够模拟在真实的实验板子上面的状况。Menu=4’b0000显示时间,Menu=4’b0001实现调整话费的显示,Menu=4'b0010实现通话种类的选择显示,Menu=4’b0011实现通话过程中的时间和余额的显示,Menu= default默认显示时间。
(11)SEG7_LUT翻译显示模块,实现4位十六进制和8位二进制之间的转换,便于通过led部分显示。
图5 communicate通话模块的仿真波形图
说明:
包含余额、时钟信号、菜单、分钟信号、秒钟信号、报警信号、返回信号、清零信号的波形。
图6 SetFee设置通话种类模块仿真波形图
说明:
包含时钟信号、使能信号、菜单、价格、种类、加、减、清零信号的波形。
图7 counter10模块波形仿真图
说明:
包含时钟信号、使能信号、Q寄存器计数、清零信号波形。
报警说明: 能够进行余额不足的报警:1市话低于0.5元报警,2国内长话低于5元报警,3国际长话低于10元报警,4特殊电话低于8元报警。
(元) 种类 序号 时间(分钟)充值(元) 报警 余额(元)0 市内0.1元/分钟 1 0 0 报警 0<0.5 1 市内0.1元/分钟 1 3 0.3 不报警 0.7>0.5 5 国内长途1元/分钟 2 2 2 报警 3<5 10 国内长途1元/分钟 2 3 3 不报警 7>5 20 国际长途2元/分钟 3 7 14 报警 6<10耗费
100 国际长途2元/分钟 3 10 20 不报警 80 30 特殊电话1.6元/分钟 4 15 24 报警 6<8 200封顶特殊电话1.6元/分钟 4 20 32 不报警 168
经过实践操作,以及系统的研究,本设计实现了以下功能。对我们的生活具有一定的使用价值和推广意义。(1)能够通过选择增减的方式设置卡内余额(最大显示为200元)。(2)能够设置通话的种类(1~4),并能够根据电话的种类和通话时间进行金额的扣除:1为市话(0.1元/分钟),2为国内长话(1元/分钟),3为国际长话(2元/分钟),4为特殊电话(1.6元/分钟)。(3)能够进行余额不足的报警:市话低于0.5元报警,国内长话低于5元报警,国际长话低于10元报警,特殊电话低于8元报警。
通过本次设计,从系统设计,代码的编写和程序的调试,波形仿真到最终硬件电路图实现全过程。使我对Verilog HDL语言有了更加进一步的掌握,同时对程序的调试能力和耐心都得到了很大的锻炼。深入了解到FPGA功能的强大,以及对软件熟练程度有进一步提升。