课程设计总结报告模板 - 图文

更新时间:2024-01-23 14:59:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

东北林业大学

单片机原理实验课程设计 二号黑体居中 间距约3cm 距上约5cm

总 结 报 告

6cm 间距约

字号:初号,黑体居中

小三号黑体 小三号楷体

设计项目: 基于Fusion单芯片的电话录音系统的设计 项目完成人: 张小海 、赵大海、王晓明 指导教师: 王 明 教授 学 院: 信息与计算机工程学院 专 业: 电子信息工程2007级1班

小三号黑体,本页最后一行 指导教师一栏填写指导教师姓名、职称 年 月 日

综合电子课程设计任务书

学生姓名 学生姓名 设计项目 学号 学号 专业(班级) 专业(班级) 设计内容 主要技 术指标 和要求 设计所用仪器设备 工作计划 参考资料 指导教师签字

基于Fusion单芯片的电话录音系统的设计

摘 要

三号黑体 摘要前必须有题目,小二黑体,居中放置

本设计主要研究一种基于数字通信的电话录音系统的设计方案。目前在国内已有现成的USB电话录音盒的产品,技术已经相当成熟,它是专门为小公司而设计开发的,具有经济、稳定、高效的特点。USB接口安装安装方便,即插即用,不需要其他配件就可以对电话进行录音。但是采用的都是专用解码芯片,为了提高运用PFGA的能力,本设计采用FPGA进行FSK来电显示解码,语音采集以及进行核心控制,实现单芯片系统的设计。

电话录音系统主要由上位机和下位机两部分组成。下位机由Actel公司的Fusion系列FPGA实现,主要负责来电号码识别,去电号码识别以及语音采样。来电的号码识别通过FPGA对FSK信号进行解码来完成,去电号码识别通过专用DTMF解码芯片MT8870完成,语音采样则由FPGA内部集成的ADC完成。上位机由VC6.0编写,程序用ODBC(开放数据库互连)连接了Excel作为数据库。通话的号码、时间、类型等信息都会被存储到数据库当中,通话的语音则以WAV文件的形式保存。上位机与下位机通过RS232接口通信。

本系统完成的功能是在有来电时,上位机软件能够从最小托盘处弹出,并显示来电号码,若此号码在数据库中有对应的联系人,将显示此联系人的姓名。若摘机,软件同样会自动弹出,显示去电号码,若有对应联系人,将显示姓名。并将所有通话记录以及通话语音进行存储,便于用户查询。

小四宋体,中文

关键词:Fusion;FPGA;来电显示;FSK解码;DTMF

摘要字数400左右

小四宋体加黑

Design for telephone recording based on Fusion single-chip

Abstract 英文题目,小二号Times New Roman加黑 This design mainly studies the precept of digital communication based on the telephone Times New Romanrecording. At present, there are ready-made in China USB telephone recording box of products, 三号加黑and the technology is already quite mature which is specifically designed for small companies to develop, economically, stable, high-performance characteristics. USB interface is easy to install, plug and play, no other accessories can be recorded on the phone. But the chips used are all dedicated decoder chips, in order to enhance the ability to use PFGA, the design uses FPGA to decode FSK caller ID, voice capture, as well as the core of control, to achieve single-chip solution.

Telephone recording system is mainly grouped with the upper and lower plane. Subordinate machine , implemented by Actel's Fusion family FPGA, is mainly responsible for CID, to identify dialed number, as well as voice sample.CID?s achievement is through the FSK?s decoding by FPGA. The identification of dialed numbers is completed by a dedicated DTMF decoder chip MT8870.Voice sampling is completed by the internal FPGA integrated ADC. PC is developed by VC6.0, procedures use ODBC (open database connectivity) to connect the Excel as a database. Calling number, timing, type and other information will be stored to the database, the voice of calls are to preserve the form of WAV files. Position machine is communicated with Subordinate machine through the RS232 interface.

The function of the function of the system is in a call, the host computer software to Office, from the smallest pop-up tray and displays caller ID, if the number in the database has corresponding contacts, will show the name of this contact. If the removable is drived, the software will automatically pop up, indicating to the power numbers, if the corresponding contact, the name will be displayed. All calls will be recorded, as well as voice calls for storage. Key words:Fusion; FPGA; CID; FSK Decoder; DTMF

Times New Roman小四,英文采用1.5倍行距 Times New Roman小四,加黑

目 录

一级题序用小四宋体加黑

三号黑体

摘要 Abstract Times New Roman小四号加黑,中、英文摘要不编页码。 1.1 课题研究的背景和意义 ........................................................................................................... 1 1 绪论 ........................................................................................................................................... 1 1.2 本设计的主要要求 ................................................................................................................... 1 1.2.1 基本要求 ............................................................................................................................... 1 1.2.2 扩展功能要求 ....................................................................................................................... 1 2

系统方案选择 ........................................................................................................................... 2 2.1 系统方案实现 ........................................................................................................................... 2 2.2 下位机核心控制 ....................................................................................................................... 2 2.2.1 器件选择 ............................................................................................................................... 2 二级以下(包括二2.2.2 控制方案选择 ....................................................................................................................... 3 2.3 来电号码识别 ........................................................................................................................... 3 2.3.1 来电数据的格式 ................................................................................................................... 3 2.3.2 来电数据的传输制式 ........................................................................................................... 3 2.3.3 来电数据的解调解码 ........................................................................................................... 4 2.4 去电号码识别 ........................................................................................................................... 4 2.5 语音记录方式 ........................................................................................................................... 5 2.5.1 WAV格式简介 ..................................................................................................................... 5 2.5.2 WAV文件头 ......................................................................................................................... 6 2.6 通信协议定义 ........................................................................................................................... 6 3

硬件设计 ................................................................................................................................... 8 小四宋体加黑

级题序)用小四宋体 3.1 系统硬件设计框图 ................................................................................................................... 8 3.2 电源设计 ................................................................................................................................... 8

3.3 FPGA最小系统设计 ............................................................................................................... 9 3.3.1 时钟和复位电路 ................................................................................................................... 9 3.3.2 FPGA电源和接地 ................................................................................................................ 9

3.3.3 FPGA数字和模拟IO分配 ............................................................................................... 10 3.3.4 JTAG下载电路 .................................................................................................................. 11 3.4 UART发送模块 ..................................................................................................................... 11 3.5 FSK前置提取电路设计 ........................................................................................................ 12 3.6 DTMF解码电路的设计 ........................................................................................................ 12 3.7 语音提取电路的设计 ............................................................................................................. 13 3.8 摘机检测电路的设计 ............................................................................................................. 13 4

FPGA程序设计 ..................................................................................................................... 14

4.1 总体结构设计 ......................................................................................................................... 14 4.2 核心控制模块设计 ................................................................................................................. 14 4.2.1 端口介绍 ............................................................................................................................. 14 4.2.2 工作原理 ............................................................................................................................. 15 4.3 通道选择模块设计 ................................................................................................................. 16 4.3.1 端口介绍 ............................................................................................................................. 16 4.3.2 工作原理 ............................................................................................................................. 17 4.4 UART发送模块 ..................................................................................................................... 18 4.5 FSK解码模块设计 ................................................................................................................ 18 4.5.1 端口介绍 ............................................................................................................................. 18 4.5.2 工作原理 ............................................................................................................................. 19 4.6 DTMF解码模块设计 ............................................................................................................ 19 4.7 A/D采样模块设计 ................................................................................................................. 19 4.7.1 端口介绍 ............................................................................................................................. 19 4.7.2 模块结构 ............................................................................................................................. 20 5

上位机软件设计 ..................................................................................................................... 21

5.1 功能概述 ................................................................................................................................. 21 5.1.1 主界面 ................................................................................................................................. 21 5.1.2 通话记录界面 ..................................................................................................................... 21 5.1.3 电话簿界面 ......................................................................................................................... 22 5.2 程序结构框图 ......................................................................................................................... 22

5.3 数据接收和信息记录 ............................................................................................................. 23 5.3.1 引导字符的识别 ................................................................................................................. 23 5.3.2 来电信息记录 ..................................................................................................................... 24 5.3.3 去电信息记录 ..................................................................................................................... 25 5.3.4 语音信息记录 ..................................................................................................................... 26 5.3.5 数据库操作 ......................................................................................................................... 27 5.4 其他 ......................................................................................................................................... 27 6

系统调试 ................................................................................................................................. 28

6.1 测试方案设计 ......................................................................................................................... 28 6.2 系统典型故障与分析 ............................................................................................................. 28 6.2.1 下位机上电复位 ................................................................................................................. 29 6.2.2 FSK解码 ............................................................................................................................. 29 6.2.3 上位机程序异常退出 ......................................................................................................... 29 6.2.4 上位机程序引导字符识别错误 ......................................................................................... 29 7

结论 ......................................................................................................................................... 30

参考文献 附录

参考文献、附录、致谢均不编页码

东北林业大学课程设计

基于Fusion单芯片的电话录音系统的设计 1 绪论 1.1 课题研究的背景和意义 来电显示,是近年来电信部门推出的一种新的业务:显示被叫方的电话号码和呼叫时在论文正文前,应阐述本课题研究间等信息。来电显示电话机和来电显示器产品应用已十分广泛,其技术也相当成熟。但传的目的、意义、对本研究国内外研究现正文二级标题统的来电显示信息电话仅将数据显示在自身的话机内,无法将数据提供给计算机或其他设状有针对性的简要综合评述和本论文用小三号宋体字,与备。因此开发来电显示电话与计算机的接口和相关的数据采集系统是十分必要的,也是有所要解决的问题等。三号宋体。论文标下文单倍行距 实用价值的。 题及第一层次题序距下文空一行. 来电显示助手通过送入电脑的来电显示,结合客户信息数据库,将传统的电话来电显示功能进行扩展,使得客户在来电时通过来电号码在客户数据中查询相关的信息,显示在电脑上,使得我们在第一时间获知客户端基本信息、业务发生情况,占据业务的先机,把握谈话的主动性,拉近员工与客户之间的距离、提升企业形象、提高工作效率。而电话录音功能又可以让员工对客户提出的问题以及我们当时提出的系统的设计进行进一步的记录,有助于我们总结问题,以便于员工对客户进行更好的服务。

小二号黑体居中放置。论文标题及第一层次题序距上下文空一行 1.2 本设计的主要要求

1.2.1 基本要求

(1) 解码FSK制式来电显示; (2) 能记录语音信息; 小四宋体 (3) 使用Fusion FPGA实现设计方案; 1.2.2 扩展功能要求

(1) 通过串口将来电号码送往PC并做记录; (2) 通过串口将语音信息传到PC并做记录; (3) 能记录去电号码及语音信息;

1

页面上边距2.5cm,下边距 2cm,左边距2.5 cm,右边距2cm,装订线位置选择左侧。 东北林业大学课程设计 2 系统方案选择 页眉为:东北林业大学课程设计,字体设置为小五号宋体居中,页眉以通档横线与正文间隔 2.1 系统方案实现 系统主要由硬件和软件两大部分构成,其中硬件又由前端电路,FPGA以及隔离模块三大部分构成,其中前端电路将电话线上的信号进行并行处理并接入FPGA的内部进行进一步的处理,通过检测到的忙音信号,振铃信号,摘机信号进行判断当前状态并对通道选择模块进行控制,将FSK解码,DTMF解码以及AD采样中的某一路与串口隔离模块相连,最后通过串口隔离模块后与PC机相连。

软件部分是由VC6.0编写的一个小型应用软件,具有良好的人机界面,便于使用。

前端电路忙音检测忙音检测忙音信号振铃信号振铃检测核心控制摘机信号电话信号摘机检测串 口隔离RS232接口Fusion FPGA隔离模块FSK提取FSK解码通道选择串口发送串口转USBPC机DTMF解码DTMF解码语音提取AD采样USB接口 图2—1 系统框图

2.2 下位机核心控制 2.2.1 器件选择 由于本系统要对语音信号进行采样,因此我们选择了Actel公司的Fusion系列FPGA作为核心控制器,针对本系统该系列FPGA提供了以下特点:

(1)片内集成了采样精度最高12位,采样频率最高600kps的ADC

2

正文三级标题用四号宋体字 东北林业大学课程设计

(2)片内集成了1.5V电压调整器,可以实现低功耗的睡眠模式 (3)基于Flash架构,配置数据掉电不丢失

基于以上的特点,我们选择了Fusion系列FPGA中AFS250来实现我们系统,不仅简化了外围电路的设计,同时还减小了PCB面积,有效实现了单芯片系统[1]。

2.2.2 控制方案选择

下位机有两种控制方案可供选择,分别是使用状态机和使用MCU软核。状态机占用的资源较少,运行也很稳定,然而当需要实现复杂的通信协议时,状态机的设计会变得异常复杂,需要花费大量的时间和精力才能完成。MCU软核则正好相反,它可以运行常规的C程序,从而能够高效的处理人机界面和进行协议转发,然而为了获得强大的功能,软核通常需要以占用大量的逻辑资源为代价,在一些小型设计中显得得不偿失。

本系统下位机的主要任务是对来电、去电信息进行解码并对语音信号进行采样,然后将这些数据上传给上位机,状态非常简单,其中并未涉及复杂的拆包、打包过程以及握手协议,因此我们使用了状态机来完成核心的控制。

2.3 来电号码识别

2.3.1 来电数据的格式

目前我国的来电显示主要有复合数据格式和单数据格式两种,复消息数据格式如表2—1所示。表中值定义一栏的M、N、O表示该字节的值不确定,?—?表示该串字节的值不确定[2]。

表 2—1 复合数据格式 字段位置 0 1 2 3 4~12 13 14 15~15+N 15+N+1

功能描述 复合数据格式标识字符 值定义 80H 表例子:“表2-1 复合数据格从该字节之后到BCC字节之间的数据长度 式”位于表的上方居中,M 五号呼叫时间消息类型标识 01H 表格内中文用小五宋体加黑,呼叫时间消息长度 08H 英文或其文字用小五号宋体,以ASCLL码表示的呼叫时间 — 号Times New Roman字体。 主叫号码消息类型标识 主叫号码消息长度

以ASCLL码表示的主叫号码 BCC校验字

02H N ˉ O

单数据格式的标识字符为04H,相对于复合数据格式,它省去了呼叫时间消息长度和

主叫号码消息长度两个参数,其它参数的定义与复合数据格式相同,在此不再赘述。

2.3.2 来电数据的传输制式

电话交换机是通过FSK调制波将来电信息发送给电话终端的,具体的调制特性如下所示:

(1) 调制方式: BFSK(相位连续二进制移频键控) (2) 逻辑 1: 1200Hz

页脚为页码,页码格式为阿拉(3) 逻辑 0: 2200Hz

伯数字,字体设置为小五号(4) 传输速率: 1200bps

Times New Roman字体居中 (5) 数据传送方式: 二进制异步串行方式 在挂机状态时,电话线上是50V左右的直流电平,当有电话呼入时,会有峰峰值为90V的振铃信号叠加到50V的直流电平上。承载着来电信息的FSK调制波会在第一声振3

东北林业大学课程设计

铃和第二声振铃之间发送给电话终端,具体波形如图 2—2所示[3]。

空闲时50V来电时50VFSK信号振铃信号振铃信号振铃信号通话时语音信号5V坐标图例子:横纵坐标必须标注量、单位,坐标名置于图的下方居中,五号宋体加黑 图 2—2 不同状态下的电话信号波形

2.3.3 来电数据的解调解码

对于FSK调制波,有很多种成熟的解调方案,如使用模拟或数字滤波器,或使用锁相环,然而这些方案在具体实现时都比较复杂。在本系统中,考虑到来电数据的传输速率较慢而且是单位传输,同时数据传输速率与载波频率的对应关系也较为单一,因此我们没有用传统的解调方案,而是将FSK调制波整形成矩形波后直接送入了FPGA,然后由FPGA根据波形的特性进行0、1判断,完成解调过程。

来电信息是用UART的方式以1200bps发送的,因此在数据解调完毕后几乎不需要额外的解码处理,解调模块可直接将输出通过RS232接口发送给上位机。

2.4 去电号码识别

电话终端是以DTMF(双音多频)的方式将呼叫号码发送给电话交换机的,为了获知用户拨出的号码,下位机需要完成DTMF解码。DTMF解码过程中需要完成对多种频率的识别,并将这些频率的组合方式译码成有效的数据,这一过程的实现非常复杂,因此在本系统中我们选用了专用的解码芯片MT8870[4]。

MT8870 能将DTMF 信号译为四位二进制码,表 2—2是该芯片的译码表。其中Digit为实际的按键,TOE是输出使能信号,Q1-Q4为4位数字输出,每当解码芯片检测到有效载波时,就会进行解码,解码完成后Q4~Q1的值会立即被更新,同时STD输出一个高电平信号,下位机可以根据STD的状态判断是否有按键,当检测到有按键按下时,通过读取Q4~Q1的值即可获得按键代码,从而识别用户拨出的电话号码。

4

东北林业大学课程设计

表 2—2 MT8870译码表

Digit ANY 1 2 3 4 5 6 7 8 9 0 * # A B C D A B C D

TOE L H H H H H H H H H H H H H H H H H H H H

INH X X X X X X X X X X X X X L L L L H H H H

STD H H H H H H H H H H H H H H H H H L L L L

Q4 Z 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0

没有检测到按键时Q4~Q1保持不变 STD返回低电平

Q3 Z 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0

Q2 Z 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0

Q1 Z 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

2.5 语音记录方式

本系统的语音采集工作,由下位机通过FPGA内部集成的ADC完成,下位机采样到的语音数据通过RS232接口发送给上位机,然后由上位机保存成WAV格式。

2.5.1 WAV格式简介

WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。WAV格式支持许多压缩算法,支持多种音频位数、采样频率和声道,采用44.1kHz的采样频率,16位量化位数,因此WAV的音质与CD相差无几,但WAV格式对存储空间需求太大不便于交流和传播[5]。

WAV来源于对声音模拟波形的采样。用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数(8位或16位)把这些采样点的值转换成二进制数,然后存入磁盘,这就产生了声音的WAV文件,即波形文件。该格式记录声音的波形,故只要采样率高、采样字节长、机器速度快,利用该格式记录的声音文件能够和原声基本一致,质量非常高,但这样做的代价就是文件太大。但电脑的存储空间很大,而且文件可以随时进行清理与删除,对于本设计文件大并不是问题,我们还可以进行进一步的改进,如将WAV文件进行压缩后再保存等。

由于只需要对声音进行采样,即将模拟信号送入FPGA的内部进行A/D采样后再经串口传给计算机,并以WAV格式进行保存,以这种方式我们就能将语音信号保存并进行播放,因此语音记录方式采用的是WAV格式文件。

5

东北林业大学课程设计

2.5.2 WAV文件头

为了创建标准的WAV文件,上位机程序用结构体定义了一个WAV文件头,程序如下。

typedef struct {

char RIFFID[4];

DWORD FileSize; char WAVEfmt[8];

DWORD sizeofPCM;

WORD WAVE_FORMAT; WORD Chanel;

DWORD SamPerSec; DWORD DatPerSec; WORD ALian;

WORD SamBitL; WORD SamBitH; char factID[4];

WORD factSizeL; WORD factSizeH; WORD factDataL; WORD factDataH; char dataID[4];

WORD dataSizeL; WORD dataSizeH;

} WaveHead;

文件头中包含了文件大小、采样速率、通道数等信息,其中有些成员的值是固定的,如采样速率SamPerSec和通道数SamPerSec,而有些成员的值则需要在程序运行过程中动态计算,如文件大小FileSize。关于WAV文件头中各个成员的进一步介绍,在此不再赘述。

2.6 通信协议定义

本系统的程序主要有下位机和上位机程序两大部分组成,下位机负责来电和去电信息的解码以及语音的采样,而上位机则负责对这些数据进行记录和管理。在系统的运行过程

6

东北林业大学课程设计

中,下位机共有三种类型的数据需要上传,分别是来电信息数据,去电信息数据和语音数据,为了让上位机能够将这些数据区分开来,需要定义一组简单的通信协议[6]。

下位对引导字符的发送和上位机对引导字符的识别是本系统通信协议的核心,具体的实现机制是,当下位机有数据需要上传时,首先要向上位机发送一段引导字符,上位机识别到引导字符后要根据引导字符的类型进入相应的数据接收准备状态。引导字符的定义如表 3—3所示。 表 3—3 引导字符定义 引导字符类型 1024个AAH 1024个BBH 1024个CCH

功能描述 拨号信息前导,指示上位机准备接收拨号信息数据 来电信息前导,指示上位机准备接收来电信息数据 语音数据前导,指示上位机准备接收语音数据

由表 3—3可以看出,下位机与上位机的通信过程非常简单,上位机只需要接收下位机发送的引导字符,然后根据引导字符的类型进入相应的状态并等待下位机上传的数据即可。协议中数据传输的结束是通过等待超时来实现的,当上位机在超过了规定的时间后还未接收到数据时则认为传输结束,然后会返回到空闲状态。

7

东北林业大学课程设计

3 硬件设计

3.1 系统硬件设计框图

如图 3所示,整个系统由Fusion FPGA和外围电路两大部分组成,其中外围电路又分为摘机检测电路、FSK提取电路、DTMF解码电路和语音提取电路四个单元。

摘机检测电路用于检测话机的状态,挂机时检测电路会输出高电平,摘机时检测电路会输出低电平。振铃检测及FSK提取电路用于提取振铃信号以及电话交换机发送的FSK来电信息,并将其处理为规则的矩形波信号,然后送由FPGA解码处理。DTMF解码电路用于解码用户的拨号的信息,当电路检测到有效的载波时,会自动对载波进行解码,并后将解码得到的数据通过一个四位总线并行输出。语音提取电路用于提取和处理通话过程中的语音信号,经过处理后的信号会被直接送至FPGA的ADC输入端口进行采样。

Fusion FPGA是整个系统的核心,它对外围电路的输入信号进行逻辑判断,然后执行对应的操作并完成所需的功能。

由于电话系统与PC机是共地的,因此当上位机与下位机通过RS232接口直接相连时,上位机会对下位机产生很大的干扰,如图3—1中的串口隔离模块用于实现上位机与下位机的电气隔离,从而有效避免干扰。

图 3—1 系统硬件框图

3.2 电源设计

系统的电源电路如图 3所示。外接电源通过线性稳压器7805和SPX1117-3.3后得到VCC_5和VCC_33两路电源,VCC_5用于对外围模拟电路供电,VCC_33则用于对FPGA的数字IO等供电。VCC_5通过DC-DC模块BS0505S隔离后得到UART_VCC,该路电源用于对UART发送模块供电。

Fusion系列FPGA内部集成了一个1.5V的电压调整器,通过它可以给FPGA的内核以及其它1.5V外设供电。集成电压调整器最大可以输出20mA的电流,为了使其具有足够的驱动能力,需要用一个三极管进行电流放大。在图 3—2中,Q1的基极和发射极分别连接到了FPGA的PTBASE和PTEM引脚,电压调整器会根据PTEM反馈的电压自动调整PTBASE电压,从而在Q1的发射极得到稳定的1.5V输出。

8

东北林业大学课程设计

VCC_15经过由R17、C14、C15组成的阻容滤波网络后生成PVCC,此路电源用于对FPGA内部的PLL供电。AGND、GND、PGND分别是系统的模拟地、数字地以及PLL地,为减少数字地对模拟地和PLL地的干扰,电路中用0Ω电阻对它们进行了隔离。

图 3—2 电源电路

3.3 FPGA最小系统设计

3.3.1 时钟和复位电路

系统时钟采用的是48MHz的有源晶振,为了使时钟电路能够输出稳定的电压波形,必须保证供电电压的稳定,因此在时钟电路的前端添加了LC滤波电路,如图3—3所示,电阻R6的作用是抑制高次谐波和实现阻抗匹配。

图 3中的C8和R5组成了上电自动复位电路,在上电瞬间C8的充电电流会将RST拉高,从而对系统进行复位。

图 3—3 时钟和复位电路

3.3.2 FPGA电源和接地

Fusion系列FPGA内部集成了ADC模块,是一个模数混合的系统,因此需要恰当的处理芯片的电源和接地。如图3—4所示,电路中为每个电源引脚都添加了去耦电容,同时遵循了将模拟电路与数字电路分开接地的原则。

9

东北林业大学课程设计

图 3—4 FPGA的电源和接地

3.3.3 FPGA数字和模拟IO分配

FPGA拥有丰富的IO资源,在本系统中我们只用到了少数几个。如图 3所示,其中CLK和RST是时钟和复位信号,它们需要连接到芯片的全局网络上,144引脚和142引脚位于芯片东边的时钟调整电路上,可以通过多路选择逻辑连接到全局网络,符合我们的需求。SOUND_IO是语音信号输入信号,可以分配到AV0~AV5中的任意一个,在此我们使用了AV0。图3—5中的其它信号均为来自外围电路数字信号,对IO分配没有特殊要求,在此是根据PCB布线情况分配的。

图 3—5 数字和模拟IO分配

10

东北林业大学课程设计

3.3.4 JTAG下载电路

如图 3所示,JP1即为JTAG插座,JTAG下载电路非常简单,只需要将对应引脚与下载插座相连即可。Fusion芯片内部集成的电压调整器是通过电荷泵工作的,因此需要外接电容C16。图3—6中的JP3是双排插针,它左边的端口直接与FPGA相连,右边的端口则与外围电路相连,左右两边的端口可以通过跳线连接起来,这样设计的好处是容易隔离故障,方便调试。

图 3—6 JTAG下载电路

3.4 UART发送模块

UART发送模块的电路如图 3—7所示,电路中用SP3232E完成TTL电平到RS232电平的转换,由高速光耦6N137实现电气隔离。

图 3—7 UART发送模块

11

东北林业大学课程设计

3.5 FSK前置提取电路设计

FSK前置电路如图3—8所示,电感L2、L3用于滤除电话信号上高频噪声,电容C42、C44用于隔直通交,三极管Q2与其外围的电阻构成了一个共射极放大电路。由于FSK信号是在第一声振铃和第二声振铃之间进行发送的,而且振铃信号的幅值比FSK信号的幅值高出很多倍,因此需要对振铃信号进行一定程度的衰减,图3—8中的C45,R25,C43,R26构成了一个简单的阻容带通滤波器,它一方面可以有效的衰减振铃信号的幅值,另一方面还可滤除电话信号中的噪声。比较器U7用于将电路提取得到的FSK波形整形成矩形波,它的输出会被直接送入FPGA的数字I/O进行解调和解码处理。电位器W1用于调整比较器的参考电压,从而调整输出信号高电平的宽度,在干扰较大的环境下可以将比较电压调节的稍高一些,这样可以有效滤除干扰信号。

图 3—8 FSK前置摘取电路

3.6 DTMF解码电路的设计

DTMF解码的实现比较复杂,在此我们直接使用专用解码芯片MT8870来完成。如图3—9所示,BG_OUT是电话线上的信号经过整流桥反极后得到的,可直接通过隔直电容耦合到MT8870当中,在检测到有效载波后,MT8870会将解码得到的数据并行输出到Q1~Q4上,然后置高StD信号,FPGA检测到StD信号的上升沿后即可从Q1~Q4上读取到有效的数据。MT8870的工作电压为5V,而FPGA端口的工作电平为3.3V,R9、R11~R14的作用是限制当Std或Q1~Q4为高电平时灌入FPGA端口的电流,从而保护FPGA的IO不被损坏。

图 3—9 DTMF解码电路

12

东北林业大学课程设计

3.7 语音提取电路的设计

语音信号是直接在电话线上传输的,因此语音提取电路的结构非常简单,如图 3—10所示,电话信号通过整流桥反极后被送到Q3的发射极,电路中的Q3和Q4组成了一个达林顿型三极管,当CTRL为低电平电时,光耦导通,达林顿三极管饱和,语音信号被耦合到下一级电路,当CTRL为高电平时,光耦截止,达林顿三极管截止,此时电话线上信号被切断。CTRL信号由FPGA控制,只有在启动录音时,该信号才会变为低电平,空闲状态下该信号为高电平。这样做一方面可以降低系统负载对电话线的影响,另一方面可有效防止高压振铃信号损坏后级电路。

图 3—10中,D4、D5的作用是对SOUND信号进行钳位。当由于系统异常导致振铃信号在CTRL为低电平时进入时,90V的振铃信号会直接耦合到FPGA的模拟IO端口,这有可能会对系统造成致命的损坏。电路中的钳位二极管会将SOUND的电平钳在-0.7V~+5.7V之间,可有效避免因振铃信号异常进入而导致的FPGA损坏。

图 3—10 语音提取电路

3.8 摘机检测电路的设计

在挂机情况下,电话线上的电压为50V左右,在摘机情况下电压会降低到6V左右,因此用电阻分压的方式即可实现摘机和挂机的检测,如图3—11所示,电路中二极管D6和D7的作用也是进行电压钳位,从而保护后级电路。

图 3—11 摘机检测电路

13

东北林业大学课程设计

4 FPGA程序设计

4.1 总体结构设计

FPGA程序的总体结构框图如图4—1所示,核心控制逻辑通过检测振铃和摘机信号来控制通道选择模块选择相应的传输通道,其中摘机信号由摘机检测电路产生,振铃信号由FSK解码模块产生。FSK解码模块、ADC采样模块和DTMF解码模块的数据输出时序与UART发送模块相匹配,它们通过通道选择模块相连。UART发送模块以115200 b/s的波特率发送数据,它的输入数据来自通道选择模块,通道选择选择模块则在核心控制模块的控制下将UART发送模块与FSK解码模块、ADC采样模块或DTMF解码模块接通。

核心 控制 振铃信号 FSK解码 AD采样 DTMF解码 通道 选择 UART 发送

图 4—1 总体结构框图

4.2 核心控制模块设计

4.2.1 端口介绍

图 4—2 核心控制模块端口结构图

核心控制模块的端口结构如图4—2所示,左边是输入端口,右边是输出端口,关于各个端口的功能描述请参见表 4—1。

14

东北林业大学课程设计

表 4—1 核心控制模块端口描述 名称 clk_48m reset ring hold std CS fsk_over adc_over dtmf_over ctrl

方向 输入 输入 输入 输入 输入 输出 输出 输出 输出 输出

宽度 1 1 1 1 1 3 1 1 1 1

功能描述 48MHz时钟信号 高电平有效的复位信号

振铃信号,当有振铃时该信号为变为高电平

摘机信号,摘机时该信号低电平,挂机时该信号为高电平 DTMF有效信号,解码芯片有数据输出时,该信号会被置高 通道选择信号,每个位对应着一个数据通道 用于结束FSK通道的标志信号 用于结束ADC通道的标志信号 用于结束DTMF通道的标志信号 语音提取电路的选通信号

4.2.2 工作原理

核心控制模块是一个米利型状态机,它根据hold、ring和std信号进行状态跳转并对CS、fsk_over等输出信号进行控制,核心控制模块的状态转移图如图4—3所示,关于各个状态的详细描述请参见表4—2所示。状态所对应的输出列中未描述的信号表示该信号的值与前一个状态相同。

图 4—3 核心控制模块状态转移图

15

东北林业大学课程设计

表 4—2 核心控制模块状态描述 状态 描述 循环检测hold_valid和ring信号,当发现hold_valid为0时则

IDLE

表明用户摘机拨号,状态跳转到DTMF,当发现ring信号为1时,则表明有电话呼入,状态跳转到FSK。

启动wait_cnt计数,用户的每次拨号都会使wait_cnt清零,当

DTMF

wait_cnt超过某值后则表明用户拨号结束,状态跳转到DTMF_idle

DTMF_idle DTMF_over

该状态用于使输出信号dtmf_over产生一个宽度为一个时钟周期的高电平信号

该状态用于使输出信号dtmf_over产生一个宽度为一个时钟周期的高电平信号,状态跳转到ADC

启动fsk_wait计数并检测hold_valid,fsk_wait超过某值后则表

FSK

明主叫方放弃呼叫,状态跳转到FSK_out,hold_valid为0表明用户摘机接听电话,状态跳转到ADC。

FSK_out FSK_over ADC ADC_over

该状态用于使输出信号fsk_over产生一个宽度为一个时钟周期的高电平信号

该状态用于使输入信号fsk_over产生一个宽度为一个时钟周期的高电平信号,状态跳转到ADC。

检测hold_valid信号,若为1则表明用户挂机,状态跳转到ADC_over

该状态用于使输出信号adc_over产生一个宽度为一个时钟周期的高电平信号

CS=2 ctrl=0 adc_over=1; fsk_over=1 fsk_over=1 CS=1 dtmf_over=1 dtmf_over=1 输出 fsk_over=0 dtmf_over=0 adc_over=0 ctrl=1 CS=0 CS=4

4.3 通道选择模块设计

4.3.1 端口介绍

图 4-4 通道选择模块端口结构图

通道选择模块的端口结构如图4—4所示,详细描述了各个端口的属性和功能。

16

东北林业大学课程设计

表 4—3 通道选择模块端口描述

名称 clk_48m reset txd_busy fsk_over adc_over dtmf_over CS FSK_data ADC_data

方向 输入 输入 输入 输入 输入 输入 输入 输入 输入

宽度 1 1 1 1 1 1 3 8 8 8 1 1 1 1 8

功能描述 48MHz时钟信号 高电平有效的复位信号

UART发送忙信号,高电平时表示UART模块正在发送数据 用于结束FSK通道的标志信号 用于结束ADC通道的标志信号 用于结束DTMF通道的标志信号

通道选择信号,每个位对应着一个数据通道 来自FSK解码模块的8位并行数据 来自AD采样模块的8位并行数据 来自DTMF解码模块的8位并行数据

当FSK_data上的数据有效时,该端口上会产生一个上升沿触发UART发送模块将数据发出

当ADC_data上的数据有效时,该端口会产生一个上升沿触发UART发送模块将数据发出

当ADC_data上的数据有效时,该端口会产生一个上升沿触发UART发送模块将数据发出

该端口直接与UART发送模块相连,当系统工作时它会被选择连接到FSK_tirg、ADC_trig或DTMF_trig上

该端口直接与UART发送模块相连,当系统工作时它会被选择连接到FSK_data、ADC_data或DTMF_data上

DTMF_data 输入 FSK_trig ADC_trig DTMF_trig txd_trig txd_data

输入 输入 输入 输出 输出

4.3.2 工作原理

通道选择模块也是一个米利型的状态机,它的状态转移图如图4—5所示。表中“—”表示该状态下的输出不是确定电平状态,而是一串序列。

图 4—5 通道选择模块状态转移图

17

东北林业大学课程设计

表 4—4 通道选择模块状态描述 状态 IDLE Pre_FSK FSK Pre_ADC ADC Pre_DTMF DTMF

描述 该状态循环检测CS的值,当CS为1时跳转到Pre_FSK,该状态发送1024个CCH前导,发送完成后跳转到FSK 该状态将输出与FSK解码模块相连,当检测fsk_over信号为1时跳转到IDLE

该状态发送1024个BBH前导,发送完成后跳转到ADC 该状态将输出与AD采样模块相连,当检测到adc_over信号为1时跳转到IDLE

该状态发送1024个AAH前导,发送完成后跳转到DTMF状态

该状态将输出与DTMF解码模块相连,当检测到dtmf_over信号为1时跳转到End_DTMF。

输出 txd_trig <= 0; —

txd_trig<=FSK_trig; txd_data<=FSK_data; —

txd_trig<=ADC_trig; txd_data<=ADC_data; —

txd_trig<=DTMF_trig; txd_data<=DTMF_data; —

当CS为2时跳转到Pre_ADC,当CS为4跳转到Pre_DTMF txd_data <= 0;

End_DTMF 该状态用于发送DTMF结束标志DDH

4.4 UART发送模块

UART发送模块的端口结构如图4—6所示,txd_start是发送触发信号,该端口上的

上升沿会触发UART发送模块将txd_data端口上的8位数据通过txd异步串行发出,在发送期间txd_busy端口会被置位成高电平。

图 4—6 UART发送模块端口结构图

UART发送模块取自Fusion StartKit开发板的例程,为了满足系统的需求,在此我们将它的发送波特率由9600bps改为了115200bps。

4.5 FSK解码模块设计

4.5.1 端口介绍

fre_inclkresetdecode_outring_outdecode_cr

图 4—7 FSK解码模块端口结构图

FSK解码模块的端口结构如图4—7所示,详细描述了各个端口功能和属性。

18

东北林业大学课程设计

表 4—5 FSK解码模块端口描述 名称 fre_in clk reset decode_out ring_out decode_cr

方向 输入 输入 输入 输出 输出 输出

宽度 1 1 1 1 1 1

功能描述 FSK信号输入端口,该端口直接与FSK前置提取电路的输出相连 系统时钟输入端口

高电平有效的复位信号输入端口

数据输出端口,格式为1200bps,8N1,UART 振铃输出端口,当有振铃时该端口输出高电平

数据有效端口,当模块解码到数据时,该端口输出高电平

4.5.2 工作原理

FSK解码模块首先对输入信号进行滤波,因为电话线上的信号难免会有一些干扰,我们首先要将这些毛刺滤除干净,否则会对后端的信号判断产生影响,因为在解码程序中我们都是在检测信号的边沿,然后通过窗口信号来检测信号的频率,从而判断是振铃信号还是FSK信号,如果是振铃信号,则将ring_out置1,并且一直检测后面是否有FSK信号;如果是FSK信号(通过判断是否有连续的175个1),则在连续的“1”之后同步1200hz的窗口信号,在此波特率下检测信号的边沿,若有4个边沿,则输出0,若有2个沿则输出1,若有三个沿,则计第一个沿到第三个沿之间的频率,如果在1200hz左右则输出1,若在2200hz左右则输出0,这样就将FSK信号解码输出了。没有信号的时候,输出高电平,因为在串口通信中高电平是认为没有数据的。

4.6 DTMF解码模块设计

DTMF解码模块的端口结构如图4—8所示,由于在外围电路中使用了专用的解码芯片MT8870,因此该模块仅仅需要完成接口逻辑的转换即可。图 4中的q和std端口直接与解码芯片的对应管脚相连,当解码芯片捕获到有效数据时,会在std管脚产生一个上升沿,解码模块检测到该上升沿后会将q端口上的数据读取到dtmf_data端口上,同时在dtmf_trig端口上产生一个正脉冲,后级的串口发送模块在该脉冲的触发下会将dtmf_data上的数据串行发送出去。

图 4—8 DTMF解码模块端口结构

4.7 A/D采样模块设计

4.7.1 端口介绍

A/D采样模块的顶层端口结构如图4—9所示,vol_in是模拟信号输入端口,它直接与外围语音提取电路相连,vref是参考电压输入输出端口,由于在本系统中我们使用了芯片内部的2.56V参考电压,因此vref为2.56V的输出端口。ADC_data端口是A/D模块采样得到的8位并行数据,ADC_trig端口用于输出触发信号,在每完成一次采样后,该端口会输出一个正脉冲触发UART发送模块将ADC_data上的数据串行输出。

19

东北林业大学课程设计

图 4—9 ADC采样模块顶层端口结构

4.7.2 模块结构

如图4—10所示,A/D采样模块由flash模块,ADC模块、PLL模块和接口逻辑四部分组成。flash模块中存储着ADC模块的配置数据,每次上电时它会自动将配置数据写入ADC模块中,PLL模块用于生成配置时钟。在配置完成后,ADC模块会以固定的采样频率对vol_in端口上的信号进行采样。接口逻辑的作用是连续对ADC的采样数据进行抽样,在每次抽样完成后它会将抽样得到的数据写到ADC_data,并在ADC_trig上生成一个正脉冲。

vol_inADC模块flash模块clk_48mPLL模块接口逻辑ADC_trigADC_data[7:0]

图 4—10 AD采样模块结构图

图4—10中的flash模块、ADC模块和PLL模块均为Fusion系列FPGA的集成外设,在Libero集成开发环境下可以通过向导生成,其中的配置逻辑也是由开发环境自动生成的,在应用时不需要考虑其实现细节。在Libero开发环境下,ADC模块的采样频是根据系统时钟自动计算的,不可以手动设置。在本系统中,软件计算的ADC的采样频率为83.9KHz,而我们需要的采样频率为8KHz,为了满足需求,接口逻辑需要以10为步长对ADC的采样结果进行间隔抽样。基于这种思路,实际获得的语音采样频率为8.39KHz,实测证明该采样频率下的语音采集效果良好。

20

东北林业大学课程设计

5 上位机软件设计

5.1 功能概述

本系统的上位机软件由VC6.0编写,可以实现通话录音和来电显示等功能,程序还通过ODBC连接了Excel数据库,能够方便的实现对对电话簿和通话记录的管理。 上位机软件共有三个界面,下面分别介绍。

5.1.1 主界面

图5—1是程序运行时的主界面,通过最小化到托盘按钮可以将程序隐藏在后台运行,当有电话呼入或用户摘机拨号时,程序界面会自动弹出。电话交换机是在第一声振铃后发送来电信息的,当上位机程序接收到来电信息后,会将来电号码提取出来并在数据库中查找对应的姓名,然后将姓名和号码分别显示到姓名栏和号码栏。用户摘机拨号时,上位机会将拨出的号码逐个捕获并显示在号码栏中,拨号完成后上位机根据拨出的号码从数据库中查询姓名并将其显示在姓名栏中,如果姓名未查到则显示未知。在程序的整个运行过程中,电话图标的状态会始终与系统的当前状态保持同步。

图 5—1 主界面

5.1.2 通话记录界面

通话记录界面如图5—2所示,程序运行过程中的所有来电和去电信息都会被记录在列表框中。通过查询选项可以对通话记录进行查询,如查询某人某时段的通话记录或查询某时段所有人的通话记录,也可以对通话类型进行筛选。程序的查询操作在后台是通过SQL语句实现的,查询通配符为“_”,如查询2009年4月的所有通话记录,可以在日期栏中输入“2009-04-__”,然后点击查询按钮即可。

通话的语音信息被记录在WAV文件中,双击某条通话记录或选中记录后点击播放按键即可播放对应的WAV声音文件。选中某一条或多条通话记录然后点击删除按钮,即可将其删除。

21

东北林业大学课程设计

图 5—2 通话记录界面

5.1.3 电话簿界面

电话簿界面如图5—3所示,在该界面下可以对电话簿进行添加、删除、查找和修改操作。它的操作方法非常简单,在此不再赘述。

图 5—3 电话簿界面

5.2 程序结构框图

上位机程序的结构框架如图5—4所示,其中的通话记录窗口、电话簿窗口和主界面窗口都是作为子窗口依托于应用程序存在的。

22

东北林业大学课程设计

ODBC 电话簿窗口 MSC控件 通话记录窗口 应用程序 后台数据库 下位机 主界面窗口

图 5—4 程序结构框架图

通话记录窗口在整个程序中的作用最为关键,它通过MSComm控件直接接收下位机发送的数据并根据数据类型将其记录到数据库中或存储为WAV声音文件。电话簿窗口的功能较为独立,它只对后台数据库的电话簿进行管理,不与程序的其它部分交互。主界面窗口需要显示来电姓名、号码以及系统的当前状态,而这些信息产生在通话记录窗口,主界面窗口由通话记录窗口间接控制。为了实现跨窗口的信息传递,通话记录窗口需要首先向父窗口发送消息,父窗口响应消息会通过主窗口对象调用其中对应的成员函数完成特定操作。

5.3 数据接收和信息记录

数据接收和信息记录工作是在通话记录窗口中完成的,具体流程如图5—5所示,空闲状态下MSC控件的RThreshold属性被设置为1024,也就是说上位机每接收到1024个字节的数据后才会产生MSC事件,当查询到MSC事件后,即表明有数据数据上传,上位机程序首先根据引导字符的类型设置状态标志,在随后的MSC事件中,程序会根据状态标志选择数据记录方式。数据接收完成后,状态标志会被设置为空闲,程序进入等待下次数据上传的状态。

MCS事件 N 状态为空闲 Y 识别引导字符 设置状态标志 状态为FSK Y 来电信息记录 N 状态为DTMF Y 去电信息记录 N 状态为语音 Y 语音信息记录 结束 状态复位

图 5—5 数据接收流程图

5.3.1 引导字符的识别

本系统定义的引导字符是1024个字节的0xAA、0xBB或0xCC,它的识别方式如下

23

东北林业大学课程设计

所示,MSC事件响应后,上位机程序接收到的数据被会被存储在数组rxdata中,为了提高识别效率,程序以32为步长抽样判断接收到的数据是否为有效引导字符,若接收到的数据中包含有非0xAA、0xBB或0xCC的字节,则表明系统出现了异常,程序会弹出“引导字符识别错误”对话框。引导字符识别成功后,状态标志state的值会被设置成引导字符的值,在随后的MSC事件中,程序会根据state的值来选择数据记录的方式。state为0xAA表示DTMF数据,state为0xBB表示语音数据,state为0xCC表示FSK数据,state为0表示空闲,只有state为0程序才会对引导字符进行识别。

if(state==0) { }

for(k=10;k<1024;k+=32) { }

state=rxdata[512];

if(rxdata[k]!=0xaa && rxdata[k]!=0xbb && rxdata[k]!=0xcc) { }

state=0;

AfxMessageBox(\引导字符识别错误!\return;

5.3.2 来电信息记录

当上位机程序识别到0xCC前导字符后会进入到FSK状态,该状态下的程序流程如图5—6所示。前导字符0xCC由下位机在检测到第一声振铃后发送,因此上位机只要进入FSK状态即表明有呼叫进入。在第一声振铃后,下位机会将承载着来电日期、时间和号码的FSK数据上传给上位机,为了逐个接收这些数据,上位机程序会在第一声振铃后将MSC控件的RThreshold属性设为1,至此,上位机程序已准备好接收FSK数据。

24

东北林业大学课程设计

FSK 状态 FSK超时 定时器超时 振铃超时 定时器超时 第一声振铃 Y 弹出用户界面通过消息向主界面窗口发送等待接听动画 N 接收FSK数据设置 FSK超时定时器 设置振铃超时定时器 提取来电号码 提取来电号码 查询来电者姓名 查询来电者姓名 识别语音向导 通过消息将号码和姓名发送给主界面窗口 将来电信息导入数据库,并将类型标示为未接 N 发现语音前导 Y 状态标示为语音 结束 结束 结束

图 5—6 来电信息记录流程图

在接收到FSK数据后,程序会设置一个FSK超时定时器和振铃超时定时器,FSK的超时表明下位机的FSK数据已经发送完毕,超时函数会从接收到的数据中提取出来电号码并从数据库中查询姓名,然后发送给主界面窗口显示。振铃的超时表明主叫方在呼叫无人接听的情况下终止了呼叫,超时函数根据来电号码查询出来电姓名,然后将来电信息记录到数据库中,同时会将号码和姓名发送给主界面窗口,并将主界面窗口状态标志为“未接来电”。

下位机在用户接听电话后会发送语音前导,以指示上位机开始录音,因此上位机在接收FSK的数据的过程中同时要检测语音前导,语音前导是1024个0xBB,然而此时MSC控件的RThreshold属性为1,因此在事件响应时不可能将1024个0xBB全部接收到,我们的实现方法是只要检测到5个连续的0xBB即会将状态标志为语音,在下次MSC事件中便会启动录音。

5.3.3 去电信息记录

去电信息的记录是在DTMF状态下完成的,该状态下的程序流程如图5—7所示。DTMF状态初次进入时,上位机程序的界面会自动弹出,同时MSC控件的RThreshold属性会被设置为1,以便逐个接收用户拨出的号码,此后用户的每次拨号都会产生一个MSC事件,事件被响应后,程序会设置拨号超时定时器并将号码逐个发送给主界面窗口,拨号超时后程序则认为拨号结束,拨号超时函数被执行。在拨号超时函数中程序会根据拨出的号码从数据库中查询出姓名并将其发送给主界面窗口显示,然后程序复位到初始状态。

程序复位到初始状态后,会不断的检测引导字符,若检测到0xBB语音前导,则开始

25

东北林业大学课程设计

录音。理想的处理情况是下位机在检测到对方接听电话后便向上位机发送语音前导,指示上位机开始录音,然而受电话业务的局限,对方的摘机信号并不会发送给主叫用户端,因此下位机只能通过拨号超时机制来向上位机发送语音前导的,这样做的坏处是可能会录到一些回铃音或彩铃音。

如果用户在拨号超时前就挂机停止拨号,下位机会向上位机发送一个0xDD结束标志,上位机在检测到该字节后也会复位到初始状态。

DTMF 状态 首次进入 Y 弹出用户界面 发送正在拨号动画 Rthreshold属性设为1 N 拨号超时 设置拨号超时定时器接收号码 查询姓名 将姓名发送给 主界面 有结束标志 N 将号码发送给 主界面窗口 Y 系统复位到 初始状态 系统复位到 初始状态 结束 结束

图 5—7 去电信息记录流程图

5.3.4 语音信息记录

语音信息的记录流程如图5—8所示,首次进入语音状态时,程序会以系统的当前日期和时间为名称创建一个文件,文件名的的格式为“XXXX_XX_XX XX_XX_XX.wav”。此时MSC控件的RThreshold属性为1024,也就是说程序每接收1024个字节的数据才会产生一次MSC事件,每次事件响应后,程序都会将接收到的数据添加文件的末尾。当用户挂机后,下位机即会停止向上位机发送数据,上位机等待超时后会执行语音超时函数,在该函数中程序会根据接收到的数据长度和当前系统时间计算WAV文件头和通话时长,并将相应信息写入到数据库中。

26

东北林业大学课程设计

语音 状态 语音定时器 超时 首次进入 Y 向主界面窗口发送 正在录音动画 N 计算WAV文件头 并将其写入文件 接收语音数据 并将其存入文件 获取系统时间 并计算时长 来电信息写入 根据系统时间计算 文件名并创建文件 设置语言 超时定时器 系统复位到 初始状态 结束 数据库 结束

图 5—8 语音信息记录流程图

5.3.5 数据库操作

为了方便对通话记录和电话簿进行管理,程序用ODBC(Open Database Connectivity,开放数据库互连)连接了Execl数据库。ODBC是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API函数,这些API利用SQL来完成其大部分的任务,同时ODBC也保留了对SQL语言的的支持,用户可以直接将SQL语句传递给ODBC。

程序中关于数据库的基本操作如记录的添加、删除和查找等在后台都是由SQL语句通过ODBC实现的,关于数据库编程不是本系统的重点,在此不再赘述。

5.4 其他

为了提供友好的用户界面,上位机程序添加了GIF动画显示的功能,该功能由免费的CPictureEx类实现,程序还用SkinMagicToolkit美化了界面的皮肤。

27

东北林业大学课程设计

6 系统调试

6.1 测试方案设计

系统的调试分为硬件调试和软件调试。硬件调试是系统调试的关键,即使硬件出现一个小小的问题,都会对以后的软件调试产生很大的影响。常见的硬件故障主要有:

(1) 焊接工艺不善,虚焊造成焊点接触不良,由于系统大量采用贴片元件,而且还有一片很大的FPGA,增加了焊接的难度,虚焊的问题更为常见。

(2) 元件管脚与焊盘不对应。焊接时,贴片元件管脚与焊点不对应,直插元件插接错误都会使电路不能工作,甚至导致元件永久损坏。

(3) 电路连接错误。在电路原理图绘制过程中可能会出现连线错误,而导致电路不能工作。

(4) 电路设计错误或不完善。电路设计的原理性错误或不完善会导致电路不能工作或不能达到预期功能。

(5) 元器件未经检查或筛选不严格,造成元器件失效。

(6) 电路布局不合理。常见的有对电源地的处理,如果处理不当,电源地会出现回路等问题,导致电路工作不稳定;一些高频信号的走线,若设计不符合规定对其它电路产生高频干扰;信号线之间的屏蔽问题,若走线不当,相互之间会产生串扰。

根据个人经验体会,硬件调试的一般方法有:

(1)在焊接电路时,确认元件没有损坏,对元件进行筛选,焊接时与焊盘对应,焊接完一个元件后用万用表测试一下焊点,保证焊接正确。 (2)在插芯片时,保证插接正确,防止元件损坏。

(3)如果碰到电路连接错误,常用方法就是用跳线进行更正。

(4)若电路设计错误或不完善,假如电路更改较容易实现的话就对电路进行改正,否则应该重新设计。

(5)电路布局不当出现的问题较不易发现,而解决此问题的方法也不容易。避免这些问题的最好方法是在设计之初时慎重考虑电路板布局。

软件调试是系统调试中最艰巨的任务了,调试开始时,软件开发者仅仅面对着错误的征兆,然而在问题的外部现象和内在原因之间往往并没有明显的联系,在组成程序的密密麻麻的元素中,每一个都可能是错误的根源。然而使用正确的高级的调试工具会使调试过程变的简单,从而加快开发速度。在调试FPGA程序时使用逻辑分析仪,可以很快定位错误出现在哪一个信号,首先通过软件的探针设置可以将任何一个内部信号引到外部IO,这样将逻辑分析仪的引线与FPGA的IO一一对应连接,在程序开始运行之后,通过一个信号触发逻辑分析仪开始工作,她可以将所有信号捕捉并存储,通过上位机软件我们可以清楚的观察到在任意时刻信号的变化情况,是否正常,从而迅速定位错误并进行修正,然后进行验证。

6.2 系统典型故障与分析

虽然系统的硬件电路不是很复杂,但是由于涉及到前端模拟电路,FPGA以及上位机软件三大部分,任何一个环节出现问题都会导致工作不正常,所以在调试过程中出现了很多故障,在这里对出现的典型故障进行解释说明,希望对以后的学习与教学实验有一定帮助。

28

东北林业大学课程设计

6.2.1 下位机上电复位

我们的上电复位电路是模仿单片机设计的,实践证明这种复位方式在 FPGA中效果很不好。通常FPGA中的各个子模块之间都互相牵扯,因此要求有特定的复位时序,如果复位时序处理不好,就会使某些状态机在上电后处于非空闲状态,从而导致下位机向上位机发送错误的数据。针对此问题,一方面要合理的设计外围复位电路,另一方面要设计专门的模块处理FPGA内各个模块之间的复位时序。

6.2.2 FSK解码

下位机对FSK信号的解码偶尔会出现错误,这与FSK提取电路的设计有很大关系,我们的FSK提取电路在将正弦波整形为矩形波时没有使用滞回比较器,这就导致了在波形的边沿有很多毛刺,为了正确的解码FPGA不得不对波形滤波后再做解码处理。如果毛刺持续的时间较长,那么滤波过程中波形参数的改变必然会超过解码模块所能承受的容限,从而导致解码错误,这一问题可以通过使用滞回比较器来解决。

6.2.3 上位机程序异常退出

上位机程序由C++编写,其中大量的使用了指针,指针是C++一把双刃剑,它的优点是灵活,可以巧妙的完成许多操作。缺点是它是直接操作内存的,不恰当的运用很容易造成内存错误,从而导致程序异常退出。

6.2.4 上位机程序引导字符识别错误

所有的数据数据传输都通过1024个前导字符识别,而对前导字符的识别发生在上位机的空闲状态,如果在上位机在空闲状态时下位机发送的不是引导字符而是有效数据,也就是说下位机与上位机失去了同步,此时就会出现引导字符识别错误的情况。这一问题可以通过完善通信协议来解决,比如将数据分包,这样上位机每接到一个数据包都可以与下位机进行一次同步。另外,当使用USB通信,偶尔也会出现引导字符识别错误的情况,通过用串口助手调试发现是通信本身出现了问题。我们的USB转UART电路是后期手工焊接的,不是很稳定,很容易因外界干扰而出现通信错误。

29

东北林业大学课程设计

7 结论

结论应该明确、精炼、完整、准确。是最终的、总体的结论,不是正文中各段小结的简

单重复。应认真阐述自己的创造性工作在本本设计采用FPGA技术实现了基于Fusion单芯片的电话录音系统的设计,主要解码领域中的地位和作用,自己的新见解的意义,FSK制式来电显示以及对通话过程进行录音。系统能够长期稳定的工作,它主要由上位也可以在结论中提出建议、研究设想、改进机和下位机两大部分组成。下位机又主要包括前端模拟电路和FPGA两大部分,其中FPGA意见、尚待解决的问题等。字号:三号宋体。 根据前端处理后的振铃信号,忙音信号,摘机信号等进行处理后由核心控制模块来判断当前的状态,然后控制通道选择模块选通FSK解码,DTMF解码或者语音提取中的一路与串口发送模块相连,从而将信号以串口通信的模式发送至上位机,进行下一步的处理。

在有来电时,上位机软件能够从最小托盘处弹出,并显示来电号码,若此号码在数据库中有对应的联系人,将显示此联系人的姓名。若摘机,软件同样会自动弹出,显示去电号码,若有对应联系人,将显示姓名。并将所有通话记录以及通话语音进行存储,可以进行查询、播放、删除等操作。

系统成功实现了所要求的所有的功能,解码来电号码以及去电号码,对通话过程进行录音。为了满足没有串口的用户的使用要求,在下位机中扩展了USB通信的功能,上位机中扩展了用数据库管理通话记录及通话语音的功能。受时间、精力和能力的限制,系统中还存在着一些不足,如通信协议的定义过于简单,没有任何的握手机制,不够优化;FSK的解码不够稳定,解码机制存在一定的缺陷,偶尔会出现解码错误。

若有机会将对系统做进一步的改进:例如制定一套完整的通信协议,带有握手机制,使用包协议,这样可以在一定程度上避免通信错误;前端模拟电路的FSK解码电路中使用滞回比较器,这样可以滤除一些毛刺,减轻后端滤除毛刺的负担;对解码程序进行优化,使之稳定解码。

30

东北林业大学课程设计

参考文献

普通图书引用例子 参考文献标题[1]周立功,Actel FPGA原理与应用——基于Fusion系列[M],广州致远电子有限公司,2007. 用四号宋体,正文[2]樊昌信,詹道庸,徐炳祥,等,通信原理(第 4 版) [M],北京:国防工业出版社,1995.

用五号宋体 [3]中国来电显示标准.邮电部,1997[S]. [4]七位编码字符集[S],GB 1988 – 89 [5] www.21ic.com.芯片技术手册[Z]

[6]Zhao Wanlun, Giannakis.Georgios.B., Delic,Hakan.. Space-time frequency-shift keying[J], Transactions on Comunications. 2004, pp346-349.

[7]王观坤.多功能电话检修手册[M],浙江科学技术出版社,1998,117~126. [8]张彪,电话机原理与维修[M],电子工业出版社,2000,84~127.

[9]Wei Xueye, Wang Xishi, & Ding Zhengting., The Design of Frequency-Shift Track Circuit Test System[J], Journal of the China Railway Society. 1996, pp. 63-68.

[10]孙肖子.模拟电子技术基础[M].西安电子科技大学出版社,2001,224~231.

[11]周立功,Actel FPGA实验教程——基于Fusion StartKit开发板[M],广州致远电子有限公司,2007. [12]黄建伟,Visual C++/Turbo C串口通信编程实践(第二版)[M],电子工业出版社,2007,63~105. [13]Xie Danfeng, Wei Xueye., Design of the Detection System of Subway Frequency Shift Signal[J], Computer Measurement & Control. 2002, pp. 782-791

[14]吴继华 ,王 诚.Altera FPGA/ CPLD 设计 (高级篇) [M].北京:人民邮电出版社 ,2005.

[15]Xing Xiaoyi, Zhong Xinli., A High Resolution Approach for Detecting FSK Signals, Journal of East China Jiaotong University, 2000, pp. 47-51

[16]Vitetta, G.m. M., Mengali,U., Taylor,D.P., Error probability of FSK incoherent diversity reception with fast rice fading, International Journal of Wireless information networks, 1999, pp. 107-118 [17] 陶仁骥.密码学与数学[J].自然杂志,1984,7(7):527.

连续出版物引用例子 31

附录A

FSK提取电路原理图UART电路原理图

DTMF解码电路原理图

对于一些不宜放入正文中、但作为毕业设计(论文)又不可缺少的组成部分,或有主要参考价值的内容,可编入毕业设计(论文)的附录中,例如,图纸、翻译外文资料、公式的推演、编写的算法、语言程序等。“附录”三号宋体,正文小四宋体。

摘机检测电路原理图

语音提取电路原理图

电源电路原理图

时钟及复位电路原理图

3

678900123451024231212102412163218876543211324575678912342212211411343658723910012111214141316152181712012121922212423181FPGA电路原理图 主板PCB图 21721212163115414513211917151311697531122220181614121078642118431092152361121233221041102211112201122

附录B

FPGA程序

/*============================================ File: analog.v

Function: 以8.3Kbps采样vol_in上的语音信号,并通过ADC_data端口输出 =============================================*/

module analog( clk_48m, reset, vol_in, vref, ADC_trig, ADC_data );

input clk_48m; // 系统输入时钟48M input reset; // 异步复位信号

input vol_in; // 模拟语音信号输入 output vref; // 参考电压输出

output ADC_trig; // 在此信号的上升沿,输出数据 output [7:0] ADC_data; // 采样后的8位并行数据

reg irq; // 在此信号的上升沿输出数据 reg [3:0] samp_div; // 数据抽样步长寄存器 reg [7:0] ADC_out; // ADC抽样输出 reg [7:0] ADC_temp; // ADC输出寄存 reg edge_detect1,edge_detect2; // 边沿检测寄存器

wire [11:0] ADC_result; // ADC输出

wire [8:0] init_data; // ADC初始化数据总线 wire [8:0] init_addr; // ADC初始化地址总线 wire [4:0] chanel; // ADC的采样通道号

wire assc_done; // ADC在此信号上升沿输出有效采样数据 wire edge_found; // 标识assc_done的上升沿 assign ADC_data = ADC_out; assign ADC_trig = irq;

//***************************************************************************** // 模块名称:边沿检测

// 功能描述:检测assc_done信号的上升沿

//***************************************************************************** assign edge_found=edge_detect1 && (~edge_detect2); always @(posedge clk_48m or posedge reset) begin

if(reset) begin

edge_detect1<=0; edge_detect2<=0; end else begin

edge_detect1<=assc_done; // 一级同步 edge_detect2<=edge_detect1; // 二级同步

end end

//***************************************************************************** // 模块名称:ADC抽样输出

// 功能描述:以10为步长抽样输出ADC的采样结果

//***************************************************************************** always @(posedge clk_48m or posedge reset) begin

if(reset) begin

samp_div <= 0; irq <= 0;

ADC_out <= 0; ADC_temp <= 0; end

else if(edge_found) begin

if(samp_div==9) // 抽样步长为10 begin

samp_div <= 0;

irq <= 1; // irq标识数据进行了更新 ADC_out <= ADC_temp; // 对采样结果抽样 end else begin

samp_div <= samp_div+1; irq <= 0;

if(ADC_result[11:4]!=0)

ADC_temp <= ADC_result[11:4]; // 经验表明ADC偶尔会将信号误采为0,

发生此情况时则舍弃数据

end end end

//***************************************************************************** // 模块名称:analog_flash_0 // 功能描述:初始化ADC

//***************************************************************************** analog_flash analog_flash_0 (

.INIT_CLK(acm_clk), .SYS_RESET(~reset), .INIT_POWER_UP(1'b1), .INIT_DONE(init_done), .INIT_DATA(init_data), .INIT_ADDR(init_addr),

.INIT_ACM_WEN(init_acm_wen), .INIT_ASSC_WEN(init_assc_wen), .INIT_EV_WEN(init_ev_wen), .INIT_TR_WEN(init_tr_wen) );

//***************************************************************************** // 模块名称:analog_fusion_0 // 功能描述:AD采样

//***************************************************************************** analog_fusion analog_fusion_0

(

.SYS_CLK(clk_48m), .SYS_RESET(~reset), .VAREF(vref),

.DATAVALID(datavalid), .in_vol(vol_in),

.ASSC_DONE(assc_done), .ASSC_WAIT(), .ASSC_CHSAT(), .ASSC_CHLATD(), .INIT_ADDR(init_addr), .INIT_DATA(init_data),

.INIT_ACM_WEN(init_acm_wen), .INIT_ASSC_WEN(init_assc_wen), .INIT_EV_WEN(init_ev_wen), .INIT_TR_WEN(init_tr_wen), .INIT_DONE(init_done),

.ADC_RESULT(ADC_result), .ADC_CHNUMBER(chanel), .ACMCLK(acm_clk) );

//***************************************************************************** // 模块名称:pll_fusion_0

// 功能描述:给AD采样模块提供2M的配置时钟

//***************************************************************************** pll_fusion pll_fusion_0 (

.POWERDOWN(1'b1), .CLKA(clk_48m), .LOCK(), .GLA(),

.GLB(acm_clk), .OADIVRST(1'b0) );

endmodule

/*============================================ File: top.v

Function: 电话录音系统顶层模块,用于将各个子模块连接起来 =============================================*

module top(

reset /* synthesis syn_noclockbuf = 1 */, clk_48m, vol_in, hold, q, std,

fsk_in, vref, pub,

phonesnd, vr_ok, txd, ctrl );

input reset; // 48MHz时钟信号 input clk_48m; // 异步复位信号 input vol_in; // 语音输入 input hold; // 摘机信号

input [3:0] q; // MT8870解码输出

input std; // MT8870数据有效标识 input fsk_in; // fsk信号输入 output vref; // 参考电压 input pub; // VR唤醒输入 input phonesnd; // 忙音输入

output vr_ok; // VR初始化完毕标识 output txd; // UART发送线

output ctrl; // 外部语音提取电路选通控制

wire [7:0] ADC_data; // ADC采样模块数据输出 wire ADC_trig; // ADC采样模块发送触发 wire [3:0] dtmf_data; // DTMF解码模块数据输出 wire dtmf_trig; // DTMF解码模块发送触发 wire [7:0] fsk_data; // FSK解码模块数据输出 wire fsk_trig; // FSK解码模块发送触发 wire [7:0] txd_data; // UART发送模块数据输出 wire [7:0] Dataout; // UART接收模块数据输出 wire [2:0] CS; // 通道选择控制信号

wire decode_out; // FSK解码模块bit流输出 wire ring_out; // 振铃信号

wire fsk_over; // FSK通道结束信号 wire dtmf_over; // DTMF通道结束信号 wire adc_over; // ADC通道结束信号 wire busy_snd; // 忙音信号

//***************************************************************************** // 模块名称:analog_0 // 功能描述:ADC采样

//***************************************************************************** analog analog_0 (

.reset(reset), // 高电平有效的异步复位信号 .clk_48m(clk_48m), // 48M时钟 .vol_in(vol_in), // 语音输入

.vref(vref), // 参考电压输出 .ADC_data(ADC_data), // AD采样输出 .ADC_trig(ADC_trig) // 发送触发 );

//***************************************************************************** // 模块名称:uart_txd_0 // 功能描述:UART发送

//***************************************************************************** uart_txd_0 ( .clk_48m(clk_48m), // 48MHz时钟 .reset(reset), // 复位,高有效 .txd_start(txd_trig), // 发送开始信号,上升沿有效 .txd_data(txd_data) , // 将要发送的的数据,字节

uart_txd

.txd(txd), // 发送线 .txd_busy(txd_busy) // 表示没有发送完毕,发送忙 );

//***************************************************************************** // 模块名称:Chan_Select_0

// 功能描述:处理通信协议,选择数据通道

//***************************************************************************** Chan_Select Chan_Select_0 (

.clk_48m(clk_48m), // 48M时钟输入 .reset(reset), // 高电平有效的异步复位信号 .txd_busy(txd_busy), // 发送忙标志

.fsk_over(fsk_over), // FSK通道结束信号 .adc_over(adc_over), // ADC通道结束信号 .dtmf_over(dtmf_over), // DTMF通道结束信号 .CS(CS), // 通道选择信号 .FSK_data(fsk_data), // FSK解码数据 .ADC_data(ADC_data), // AD采样数据 .DTMF_data({4'b0,dtmf_data}), // DTMF解码数据 .FSK_trig(fsk_trig), // FSK数据发送触发 .ADC_trig(ADC_trig), // AD采样数据发送触发 .DTMF_trig(dtmf_trig), // DTMF数据发送触发 .txd_trig(txd_trig), // UART发送触发

.txd_data(txd_data) // UART待发送8位并行数据 );

//***************************************************************************** // 模块名称:MT8870_0

// 功能描述:DTMF解码模块

//***************************************************************************** MT8870 MT8870_0 (

.clk_48m(clk_48m), // 48M时钟

.reset(reset), // 高电平有效的异步复位 .q(q), // MT8870解码输出 .std(std), // 解码有效标识信号 .dtmf_data(dtmf_data), // 解码模块数据输出 .dtmf_trig(dtmf_trig) // 数据发送触发 );

//***************************************************************************** // 模块名称:decoder_0 // 功能描述:FSK解码模块

//***************************************************************************** decoder_0 (

.fre_in(fsk_in), // FSK信号输入 .clk(clk_48m), // 48M时钟

.reset(reset), // 高电平有效的异步复位信号 .decode_out(decode_out), // 解码输出 .ring_out(ring_out), // 振铃信号 .decode_cr(), // 数据有效标识 .ring_up() // 振铃边沿 );

//***************************************************************************** // 模块名称:uart_rxd_0

decoder

// 功能描述:UART接收模块,用于将FSK解码模块的数据输出速率由1200改为115200

//****************************************************************************** uart_rxd uart_rxd_0 (

.reset(reset), // 高电平有效的异步复位信号 .clk(clk_48m), // 48M时钟输入 .Dataout(Dataout), // 8位数据输出 .RXD(decode_out), // 数据串行输入

.trig(trig) // 标识一个字节接收完毕 );

//***************************************************************************** // 模块名称:core_ctrl_0

// 功能描述:控制Chan_Select_0选择不同的数据通道

//***************************************************************************** core_ctrl core_ctrl_0 (

.clk_48m(clk_48m), // 48M时钟输入

.reset(reset), // 高电平有效的异步复位 .ring(ring_out), // 振铃信号 .hold(hold), // 摘机信号 .std(dtmf_trig), // 指示有拨号 .CS(CS), // 通道选择信号

.fsk_over(fsk_over), // FSK通道结束信号 .adc_over(adc_over), // ADC通道结束信号 .dtmf_over(dtmf_over), // DTMF通道结束信号 .ctrl(ctrl), // 语音采集电路选通信号 .busy_snd(busy_snd) // 忙音信号 );

//***************************************************************************** // 模块名称:vr_15_0

// 功能描述:产生1.5V的内核电压

//***************************************************************************** vr_15 vr_15_0 (

.PUB(pub), // 唤醒信号 .VRPU(1'b0), // 使能信号

.FPGAGOOD(vr_ok), // VR初始化完毕标识 .PUCORE() );

//***************************************************************************** // 模块名称:ring_send_0

// 功能描述:标识有振铃到来

//***************************************************************************** ring_send ring_send_0 (

.clk_48m(clk_48m), // 48M时钟输入

.reset(reset), // 高电平有效的异步复位信号 .ring(ring_out), // 振铃信号 .trig(trig), // 发送触发信号 .data(Dataout), // 8位并行数据

.fsk_data(fsk_data), // FSK解码数据输出 .fsk_trig(fsk_trig) // FSK数据发送触发 );

//*****************************************************************************

// 模块名称:busy_snd_0 // 功能描述:检测忙音

//***************************************************************************** busy_sound busy_snd_0 (

.clk(clk_48m), // 48M时钟输入

.reset(reset), // 高电平有效的异步复位信号 .phonesnd(phonesnd), // 忙音输入 .busy_snd(busy_snd) // 检测输出 );

Endmodule

/*============================================ File: uart_rxd.v

Function: uart的接收模块,接收采样率为波特率的16倍 =============================================*

module uart_rxd(reset,clk,Dataout,RXD,trig); input clk,RXD; // 时钟与数据输入 input reset; output trig; // 数据有效标志 output [7:0] Dataout; // 并行数据输出 reg StartF; // 开始与接收中断标志 reg [9:0] UartBuff; // 接收缓存区 reg [3:0] count,count_bit; // 位接收计数器 reg [15:0] cnt; // 时钟节拍计数器 reg [2:0] bit_collect; // 采集数据缓存区 reg edge_detect1,edge_detect2; reg RI;

wire clk_equ,bit1,bit2,bit3,bit4;// 连线

parameter cout = 2500; // 时钟是48M所以16*1200的分频数为2500,这里取整数 assign trig=edge_detect1 &&(~edge_detect2); always @(posedge clk or posedge reset) begin

if(reset==1'b1) begin

edge_detect1<=0; edge_detect2<=0; end else begin

edge_detect1<=RI;

edge_detect2<=edge_detect1; end end

/*************波特率发生进程****************************/ always@(posedge clk or posedge reset) // 时钟节拍计数器 begin

if(reset) cnt<=0; else

begin

if(clk_equ)

cnt <= 16'd0; else

cnt<=cnt+1'b1; end end

assign clk_equ = (cnt == cout);

assign bit1 = bit_collect[0]&bit_collect[1]; assign bit2 = bit_collect[1]&bit_collect[2]; assign bit3 = bit_collect[0]&bit_collect[2]; assign bit4 = bit1|bit2|bit3;

// 采样时钟

// 对采样数据进行判断 // 对采样数据进行判断 // 对采样数据进行判断

// 对采样数据进行判断,只要有两次相同就可以

always@(posedge clk or posedge reset) begin

if(reset) begin

StartF<=0; RI<=0;

UartBuff<=0; end else if(clk_equ) begin if(!StartF) // 是否处于接收状态 begin if(!RXD) begin count <= 4'b0; // 复位计数器 count_bit <= 4'b0; RI <= 1'b0; StartF <= 1'b1; End else

RI <= 1'b1; end else begin count <= count+1'b1; // 位接收状态加1 if(count==4'd6) bit_collect[0] <= RXD; // 数据采集 else if(count==4'd7) bit_collect[1] <= RXD; // 数据采集 else if(count==4'd8) begin bit_collect[2] <= RXD; // 数据采集 UartBuff[count_bit] <= bit4; count_bit <= count_bit+1'b1; // 位计数器加1 if((count_bit==4'd1)&&(UartBuff[0]==1'b1)) begin // 判断开始位是否为0 StartF <= 1'b0; // 标志开始接收 end RI <= 1'b0; // 中断标志位低

end else if(count_bit>4'd9) begin RI <= 1'b1; StartF <= 1'b0; end end end end

assign Dataout = UartBuff[8:1]; endmodule

// 检测是否接收结束 // 中断标志为高标志转换结束

// 取出数据位

本文来源:https://www.bwwdw.com/article/556o.html

Top