一种数字录音与回放系统实现方案
扫描二维码
随时随地手机看文章
关键词:闪速存储器 DSP 数字录音 回放
闪速存储器(FLASH)是可快速擦写的非易失性存储器,自Intel公司于1988年推出Flash Memory技术以来就得到了非常迅速的发展。FLASH 最大的特点是在不加电的情况下能长期保持存储的信息。此外,它还具有不需要存储电容器、集成度更高、制造成本低于DRAM、使用方便、读写灵活、访问速度快、功耗低等特点。我们结合实现课题,在一个以DSP为核心的语音处理系统中,从存储容量、存储时间、回放音质等衡量语音处理系统优越性的这些重要指标出发,选用FLASH作片外存储器,实现了语音数据的数字录音和回放,既保证了系统的高性能,又减少了系统成本。
1 系统组成
实际系统是一个以DSP为信心的总线型网络,每一个单元以TMS320F206数字处理芯片作微处理器,实现语音的传送、录音、存储和播放。框图组成如图1所示。
在系统中, 声卡采集的语音数据和从网卡传送过来的数据都可以存入FLASH。由于存储的是数字信息,数据不会丢失和失真,因此也不会引进任何噪声。本系统使用的存储器是两片4M位的FLASH,录音时间长达2分多钟。
2 DSP与FLASH的接口电路设计
2.1 芯片简介
系统使用的DSP为TMS320C2XX系列,是美国TI公司推出的16位定点运算数字信号处理器。它的性价比极高,目前已成为高档单片机的理想替代品,在通信、语音处理、军事、仪器仪表、图像处理等领域得到了广泛的应用。系统使用的存储器是AMD公司生产的FLASH芯片,型号为Am29F040B。其容量为512K×8bit,提供的存储时间有55、70、90、120及150ns几种,因此高速微处理器(如DSP)对其进行操作时基本上不需要等待时间。为避免总线竞争,该器件有独立的片选、写使能与输出使能控制,器件命令集符合JEDEC单电源供电的Flash标准,用标准微处理器写时序写 Flash命令寄存器就可以控制其基本操作。Am29F040B具有省电方式,在FLASH没有被使用时进入此方式可以大大降低功耗。Am29F040B 还可以分扇区进行操作,默认划分为8个扇区,每扇区容量64K字节。
2.2 接口电路设计
接口电路设计主要考虑的是存储器地址空间的分配以及写入和读出的时序要求。在系统中,共需要1M地址空间。我们使用了两片FLASH,而DSP的地址线只有 16根,最大只能提供64K的寻址空间,所以必须分页使用,才能合理分配地址空间。为此,我们将每一片存储空间分成32页,每页16K字节,片A每页地址从#8000h~#0bfffh,片B每页地址从#000~#0ffffh。基于上述分析,DSP与FLASH的接口电路如图2所示。
图中只现出了DSP与一片FLASH的接口电路,因为另一片大同小异,只是通过不同的译码得到不同的片选而已。DSP用D0~D4选择分页,A12~A15通过适当的译码来分配两片FLASH的寻址空间。
3 FLASH编程方法
通过把特定的命令或命令序列写入到FLASH命令寄存器就可对FLASH实现各种操作。表1给出了有效命令的定义,如果写入的地址和数据值不正确或者写入的顺序不对,则会使器件复位到读阵列数据状态。表中除xxx指任意值外,其它值皆为16进制数,RA指要读出的存储器地址,RD指读出的数据,PA指编程写入存储器的地址,PD指编程写入存储器的数据。编程时,地址在WE#或CE#的下降沿锁定,而数据在WE#或CE#的上升沿锁定,SA指扇区地址。
表1给出了所有操作命令的定义。在本系统中,DSP对FLASH的控制主要用到的读、刷新和编程操作,下面分别予以说明。
表1 Am29F040B命令定义表
命令序列 | 周期数 | 总 线 周 期 序 列 | ||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | |||||||||
地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | |||
读 | 1 | RA | RD | |||||||||||
复位 | 1 | xxx | F0 | |||||||||||
自动选择 | 厂商ID号 | 4 | 555 | AA | 2AA | 55 | 555 | 90 | X00 | 01 | ||||
器件ID号 | 4 | 555 | AA | 2AA | 55 | 555 | 90 | X01 | A4 | |||||
扇区保护确认 | 4 | 555 | AA | 2AA | 55 | 555 | 90 | SA X02 |
00 | |||||
01 | ||||||||||||||
编程 | 4 | 555 | AA | 2AA | 55 | 555 | A0 | PA | PD | |||||
芯片刷新 | 6 | 555 | AA | 2AA | 55 | 555 | 80 | 555 | AA | 2AA | 55 | 666 | 10 | |
扇区刷新 | 6 | 555 | AA | 2AA | 55 | 555 | 80 | 555 | AA | 2AA | 55 | SA | 30 | |
刷新悬挂 | 1 | xxx | B0 | |||||||||||
刷新继续 | 1 | xxx | 30 |
3.1 读阵列数据
读操作很简单,只需要一个总线周期,直接把FLASH相应单元的数据读出即可。上电后,器件自动处于读阵列数据状态;在完成刷新和编程操作后,器件也处于读阵列数据状态;给器件写复位命令也可以使器件复位到读阵列数据状态。读操作主要用于回放录音内容。
3.2 字节编程命令序列
编程命令要复杂一些,每一个单元的写入都需要四个总线周期。头两个解锁命令,紧接着是编程建立命令,最后才是要写入单元的地址和数据。图3是编程操作的基本流程。如何判断是否已经正确写入呢?器件内部提供了一个嵌入式编程算法,通过查询DQ7或DQ6位可以得知编程操作状态。嵌入式编程算法完成后,器件自动返回读阵列数据状态,地址不再锁定。字节编程命令是进行录音的基础。这里需要特别指出的是:编程时不能将存储单元的任一位从“0”改成“1”,只有刷新操作才可以。因此,在FLASH的某一段存储区已经录音后,如果不刷新,则这一段存储区不能再进行录音操作。
3.3 芯片刷新命令
芯片刷新操作需要6个总线周期。头两个依然是解锁命令,然后是刷新建立命令,接着两个附加解锁写周期,最后是芯片刷新命令。刷新操作与编程操作不同之处在于:刷新操作对整个芯片是一次性完成而编程则需要一个单元一个单元地写入。当然,如果不希望芯片全部刷新,可以采用扇区刷新命令。刷新完成与否也可以通过查询DQ7、DQ6或DQ2位来判断。图4给出刷新操作流程。
编程操作和刷新操作都需要进行数据查询,统称为写操作状态查询,用以判断写操作是否已经正确完成。Am29F040B提供了DQ2、DQ3、DQ5、DQ6以及DQ7几个位用于写操作状态查询,表2给出了这些位的功能。
表2 写操作状态
操 作 | DQ7 | DQ6 | DQ5 | DQ3 | DQ2 | |
标准方式 | 编程 | DQ7# | 0、1交替 | 0 | N/A | 不变化 |
刷新 | 0 | 0、1交替 | 0 | 1 | 0、1交替 | |
刷新悬挂方式 | 读刷新 悬挂扇区 |
1 | 不变化 | 0 | N/A | 0、1交替 |
读非刷新 悬挂扉区 |
Data | Data | Data | Data | Data | |
刷新悬挂编程 | DQ7# | 0、1交替 | 0 | N/A | N/A |
根据具体情况可以查询不同的位。需要注意的是:使用DQ7和DQ2查询状态信息时需要一个有效地址,而如果DQ5位读出为1则说明编程或刷新操作已经超出最大时序限制。在笔者的实际应用中,编程操作查询DQ7位。当读出DQ7位与写入的DQ7位一致时,则说明写入成功,可以继续写入下一单元;刷新操作时,则查询任一单元(一般取最后一个单元)是否已经是0FFh,如果是则刷新正确完成。
解决了DSP与FLASH的硬件接口电路和DSP对FLASH的软件编程方法后,通过适当的程序控制,就可以实现系统的数字录音与回放功能。既可以录下 DSP网络中接收到的语音数据,也可以通过声卡采样录下说话人的话音。该系统应用到语音教室,能顺利地实现学生机的跟读和复读,而且录音内容只要不刷新,即使掉电也不会丢失。在其它电子产品中,这种方法也可以得到有效的应用。