基于fpga的ic卡电话计费系统的设计内容摘要:

pwrite=39。 039。 reset_ena=39。 139。 else if(money(3 downto 0)0110) then money(3 downto 0)=money(3 downto 0)+4。 if(money(7 downto 4)/=0) then money(7 downto 4)=money(7 downto 4)1。 else money(7 downto 4)=1001。 money(11 downto 8)=money(11 downto 8)1。 end if。 else money(3 downto 0)=money(3 downto 0)6。 end if。 长话计时 if(ptime(3 downto 0)=9) then ptime(3 downto 0)=0000。 if(ptime(7 downto 4)=9) then ptime(7 downto 4)=0000。 ptime(11 downto 8)=ptime(11 downto 8)+1。 else ptime(7 downto 4)=ptime(7 downto 4)+1。 end if。 第 8 页 else ptime(3 downto 0)=ptime(3 downto 0)+1。 end if。 warn=39。 039。 pwrite=39。 139。 reset_ena=39。 039。 end if。 when others= 拨打的是特殊号码时,不计费用 money=money。 ptime=ptime。 end case。 else pwrite=39。 039。 写完一次卡 end if。 else ptime=000000000000。 warn=39。 039。 reset_ena=39。 039。 pwrite=39。 039。 end if。 end if。 end process。 监测余额是否足够 process(clk) begin if(clk39。 event and clk=39。 139。 ) then if(warn=39。 139。 ) then temp=temp+1。 else temp=0。 end if。 if(temp=15) then cut=39。 139。 第 9 页 temp=0。 pcut=39。 139。 end if。 reset_ena 保证用户在余额足够时不会因干扰而掉话 if(card=39。 039。 or reset_ena=39。 039。 or state=39。 039。 ) then cut=39。 039。 temp=0。 end if。 end if。 end process。 with card select dispmoney = money when 39。 139。 , 000000000000 when 39。 039。 disptime= ptime。 pwarn=warn。 end IC_Core。 该模块的程序包含 3 个进程模块,第一个进程是一个 60 进制计数器,在时钟周期的上升沿触发,主要用于判 断是否计满一分钟,以便开始读写 IC 卡,对其进行扣费和计时。 第 二 个进程是一个整个通话计费器的主要进程, 其在时钟周期的下降沿触发, 它主要完成在用户插卡并拨通电话后,根据用户所进行的话务种类进行相应的扣费,并计算用户的通话时间。 另外,最主要的是还能实时监测用户卡内余额是否足以 继续进行通话,如果余额不足,将 warn 信号置 1,即发出告警信号提醒用户,并将在 15 秒后强行切断通话。 另外此进程里面还包括当用户插入卡后,便开始读取用户卡内余额并装载到系统进行初始化,还包括对余额充足的情况下对正常通话进行保护 (reset_ena 信号 )。 第三个进程是用于当用户余额不足时,系统发出提示信号后, 在一定时间后便 开始强制中断通话。 源程序中,输入信号 clk 是标准系统时钟信号; card 信号为用户插卡信号,这里为了便于说明,可将其一直设置为有效状态 —— ‘1’; state 信号为电话接通信号,同样的将其设置为一直有效; decide 信号为用户当前拨打的话务种类,这里假设用户当前拨打的电话类型是“长途电话” ,decide=“ 10”,另外假设用户的IC 卡上当前拥有 3 元的余额,即设置 remaining=“ 030”。 在此条件下对计费计 第 10 页 时模块进行波形仿真 ,其结果如图 32 所示。 (a) 计费计时模块的波形仿真图 (b) 计费计时模块的元件符号图 图 32 IC 电话计费系统的计费计时模块仿真 如图 32(a)所示,用户通话前其卡内初始余额为 3 元,当用户摘机后并拨 通 电话,即 card=1, state=1,由于当前用户拨打的是长途电话,即每通话一分钟需要扣除 元的话费,因此当通话时间计满一分钟后,即系统在时钟周期上升沿发出一个读 read 信号,在下降沿时发出一个写 write 信号,便开始对用户的 IC卡进行读写扣费, 当通话到一定时间后,用户卡内余额不足 元时,系统便开始发出告警信号 warn=1 提醒用户,如果用户仍然不挂机或者继续通话,系统将在数个脉冲周期后强制切断本次通话,即 cut=1。 由于用户卡内只有 3 元,如果用户拨打的是长途电话 ( 元 /分钟 ),故用户一共只能通话 5 分钟,因此其仿真结果是正确的。 第 11 页 译码显示模块 该模块主要用于将用户的卡值余额信息和当前通话时间通过 LED 数码管实时的显示出来。 由于 8 位数码管需要采用动态扫描显示,以便不同的各个数码管显示的数据各自不同,因此该模块需要包含 数据选择器、 38 译码电路 、模 8 计数器 、 LED 显示译码器 4 个子模块。 显示模块框图如图 33 所示。 图 33 显示模块的系统方框图 ① 在外部时钟 clk_1k 的作用下,八进制计数器的输出从 000 到 111 依次循环变化,输出信号为三位数据宽度的 sel,信号 sel 经过 38 译码电路选通一个 LED数码管,同时它还作为数据选择器的选择信号,用来选择对应位的数据并将其转换为 4 位矢量,最后将数据选择器的输出 dout[3..0]送到 七 段显示译码电路的输入端口,将其转换成用来点亮 LED 数码管的 de_segment 信号。 8 进制计数器的VHDL 代码 ()如下: library ieee。 use。 use。 entity IC_count8 is port(clk_1k: in std_logic。 sel: out std_logic_vector(2 downto 0))。 end IC_count8。 architecture count8 of IC_Count8 is signal sel_tmp: std_logic_vector(2 downto 0)。 beg。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。