在嵌入式系统中经常采用iis(inter-ic sound)总线连接专用音频器件以实现音频输入输出。不少嵌入式处理器带有专用的iis总线,通过操作特殊功能寄存器实现对外接音频器件的操作,但也有一些嵌入式处理器没有扩展iis总线,如arm7芯片s3c4510b。近年来,fpga技术发展迅速,现已成为可编程片上系统(sopc)的硬件载体。采用fpga实现iis总线及与总线相关的接口控制,一方面可以用硬件的方法实现iis总线操作,使嵌入式系统很容易扩展音频功能;另一方面由于fpga可以实现大量的组合逻辑和时序逻辑,还可以用来实现dsp算法,增加了系统的灵活性。
1 基本原理
1.1 系统方案
嵌入式处理器采用samsung公司的arm7芯片s3c4510b;音频芯片使用philips 公司开发的uda1341ts,这是一款适用于minidisc(md)、pda等便携式设备的高性能低功耗的经济型音频编码解码器;fpga芯片则使用 xilinx公司的spartan-ii 系列芯片xc2s100。系统示意图如图1。
图1中fpga负责连接s3c4510b和uda1341ts,为此需要按照访问uda1341ts的时序要求实现iis总线和l3接口,同时要按照s3c4510b总线时序要求,实现按存储器方式操作的特殊功能寄存器,并将对uda1341ts的操作转换成对特殊功能寄存器的操作。这样s3c4510b便可以直接访问fpga实现的特殊功能寄存器,从而实现对uda1341ts的控制。
1.2 iis和uda1341ts简介
iis又称i2s, 是philips公司提出的串行数字音频总线协议,专用于芯片间进行高速高效的音频数据传输。iis总线只处理声音数据,其他信号必须单独传输,如控制信号。iis总线包括3 个信号线,即1个双向数据传输线sd(serial data)、一个声道选择线ws(word select)和1个时钟线sck(serial clock)。在数据传输过程中,发送端和接收端具有相同的时钟信号,发送端作为主装置(master)时,产生位时钟信号和声道选择信号,接收端被动响应。为了实现全双工传输模式,一些iis实现时使用了dout和din两个数据线。
uda1341ts片内集成了立体声adc、dac以及模拟输入通道,其中模拟输入通道包括可编程增益放大器(pga)、数字自动增益控制(agc)、 数字声音处理(dsp)等。uda1341ts的重放过程也具有可编程的dsp功能,如去加重、音量控制、低音增强、高音增强以及软件配置静音等。
根据串行音频数据输入输出格式和每声道字长的不同,uda1341ts支持4种操作模式,分别是:(1)字长不超过20位的iis总线模式;(2)字长不超过20位的最高位对齐(msb-justified)模式;(3)字长为16、18或20位的最低位对齐(lsb-justified)模式;(4)输出采用最高位对齐,输入采用字长为16、18或20位的最低位对齐模式。其中iis总线模式和最高位对齐模式操作时序如图2所示。二者具有相同的信号线,但左右声道控制电平和位延迟不同,对于iis总线,声道控制电平改变后,最高位推迟一个时钟周期才发送。
对uda1341ts的所有功能控制和状态获取均通过3线串行接口l3实现。该接口包含3个信号线,分别是串行数据线l3data、接口模式选择线l3mode和串行时钟线l3clock。l3接口操作有两种模式,即地址模式和数据传输模式。地址模式用于选中后续操作所要访问的芯片及其内部寄存器,被地址模式选中的芯片和寄存器一直保持有效,直到uda1341ts收到一个新的地址模式命令字节。数据传输模式用于将音频处理和系统控制参数写入uda1341ts并可以读取回放的音频数据的峰值电平。l3mode为低电平时操作为地址模式,高电平时操作为数据传输模式。
地址模式下由主器件按标准时序送出8位地址,其中高6位表示uda1341ts芯片地址000101,最低2位选择要访问的该芯片内部寄存器,分别是data0、data1和status,由此产生下面的3种寄存器操作模式。
(1)status操作模式可以控制芯片复位、系统时钟频率、数据输入格式、dc滤波器、输入增益、输出增益、adc和dac极性控制、倍速播放和功率控制等。
(2)data0操作模式又分为两种:直接地址模式和扩展地址模式。数据最高2位非‘11’时为直接地址模式,在这种模式下,可以直接控制音量、低音增强、高音增强、峰值检测位置、去加重、静音等功能;数据最高2位为‘11’时为扩展地址模式,可以通过3位选择6个5位的扩展寄存器,分别控制通道混合增益、mic灵敏度、自动增益控制、输入放大器增益器等。
(3)data1操作模式用于读取音频数据重放时的峰值电平。
2 fpga设计及功能仿真
如图1所示,fpga负责连接s3c4510b和uda1341ts,需要实现s3c4510b总线接口、iis总线和l3接口等。采用模块化设计思想,划分几个功能相对独立的模块,并将各个功能模块封装成元件(component),分别设计、仿真、测试、验证各元件,最后在顶层调用各元件,并将元件信号与实际输入输出信号关联,实现整体功能。实际实现了4个元件,如图2所示。
图2中,元件arm_interface负责实现与s3c4510b接口,主要是实现几个可以映射成存储器的地址单元,并提供这些单元与其他元件的接口。其中左右声道单元为16位,在内部分别与2个fifo相连接,以便音频数据以选定的速率回放;iis_out元件负责产生iis总线或msb对齐模式时序;l3_3b_mod元件实现uda1341ts数据传输模式中的data0扩展地址模式,共需传输3个字节;l3_2b_mod元件则负责uda1341ts其余的操作模式,只需传输2字节,即1字节地址和1字节数据。采用这种元件模块设计的方法主要考虑到fpga容易实现并行操作,但对复杂条件操作和逻辑判断则不如处理器编程实现方便。因此并行实现多个元件,再由简单逻辑和条件及输入参数控制选定的元件工作,以实现需要的功能,这是fpga设计的主要思想。
2.1 嵌入式处理器接口实现
此模块主要负责处理与嵌入式系统的数据传输接口。主要输入信号包括全局时钟gclk、片选信号ncs、写信号nwbe0、读信号noe以及地址信号addr[4..0],其中地址信号确定相对于片选地址的偏移地址,5位地址信号最多可寻址32个16位地址单元。所有总线数据操作与全局时钟同步。根据需要,实际设计实现了7个寄存器,分别是data0直接地址寄存器、data0扩展地址寄存器、data1寄存器、status寄存器、左声道音频数据缓存器、右声道音频数据缓存器、fpga控制寄存器,它们的偏移地址分别是0x00100、0x00110、0x01000、0x10100、0x00000、0x00010、0x01100。上述寄存器中,只有左右声道音频数据缓存器为16位,其余均为8位,因此只能实现不超过16位的iis总线和msb对齐模式。
测试本元件时,首先应测试单元的读写特性,通过arm仿真器直接对编程单元进行读写即可验证扩展的正确性。对于内建16x8的fifo的左右声道数据缓存器,可以通过读写多次测试其满空状态,并通过1个接在fpga的i/o口线上的led直接观察。测试无误后,该元件便可使用。
2.2 iis总线实现
iis总线通过iis_out元件来实现,其接口信号如图3所示。输入信号是arm_interface提供的左右声道音频数据,输出信号是iis总线要求的3个串行信号,即bclk、sync和dout,分别与sck、ws和sd对应,这3个信号通过fpga的i/o口线与uda1341的bck、ws以及datai与datao信号线相连。iis 格式的信号无论有多少位有效数据,数据的最高位(msb)总是被最先传输,在ws 变化后的第2 个sck脉冲处,因此最高位拥有固定的位置,而最低位的位置则依赖于数据的有效位数。实际设计的数据有效位是16位,低于16位数据时高位填充‘0’,处理器将数据以16位方式写入左右声道音频数据缓存器时,自动进行高位填充。
实现iis总线时序时,关键是要正确处理各种时钟信号之间以及生成的iis总线3个信号之间的时序关系。要依据音频信号的采样速率选择fpga系统时钟和uda1341时钟选项,同时要合理使用计数器并正确读取左右声道音频数据缓存器,最终实现音频数据通过iis总线的正确传输。
设计实现的iis时序仿真图如图4所示。
图4显示的是iis_out元件将左右声道音频数据缓存器内2个16位数据由iis总线输出的时序仿真结果。bclk信号的上升沿数据dout稳定有效,在bclk为低电平时dout才变化。当左右声道控制信号sync为低电平时,传输左声道数据‘0111011101110111’;当sync为高电平时,传输右声道数据‘1010101010101010’。从仿真波形可知,每声道数据反映在dout波形上是从sync电平变化后的第2个bclk周期开始的。
图2所示的最高位对齐模式与iis使用相同的信号,很容易在iis总线的基础上修改实现。实际实现的最高位对齐模式仿真时序正确,在此不再详述。
2.3 l3接口实现
由于iis总线只处理声音数据,其他信号必须单独传输,所以为了控制uda1341ts而设计了l3接口。在fpga实现l3接口时,根据uda1341ts操作模式的不同,设计了两个元件。图3中元件l3_2b_mod用于只需传输1字节地址和1字节数据的情况,而l3_3b_mod则用来传输1字节地址和两字节数据。
为了便于控制,在元件arm_interface中专门设置了一个控制寄存器来控制l3接口的工作模式,该寄存器偏移地址为0x01100,其高4位有定义。最高位为接口允许位trans_en,为‘1’时l3接口启动工作,为‘0’时停止;次高位为l3接口工作模式选择位transmode,为‘0’时选择l3_2b_mod,为‘1’时选择l3_3b_mod;接下来的二位用于选择寄存器。
实际设计实现的元件l3_3b_mod时序仿真图见图5。
图5显示的是l3接口data0扩展地址模式时序图,共传输了3字节数据,即1个地址字节、2个数据字节。地址字节的高6位为uda1341ts地址,低2位选择data0操作模式,紧接着的数据字节最高两位为‘11’选择扩展地址模式,这意味着该字节后面还要传输1字节数据。图5中的3字节分别为0x14、0xc4和0xf0,该命令将打开输入通道的自动增益控制。l3接口要求串行数据的低位在前传输,这一点与iis有所不同。
实现l3_3b_mod元件时引入了一个参考时钟ref_clk,由一个5位计数器对该时钟信号计数,根据l3接口在3字节操作时的时钟信号图案,控制由ref_clk生成l3clock,得到l3clock之后,l3接口的操作均以此时钟信号来同步。
元件l3_2b_mod设计及仿真结果与l3_2b_mod类似。
3 测试方法及结果
在以s3c4510b为核心的嵌入式系统中,根据存储器配置情况,选择一段未用的存储空间,将fpga实现的寄存器映射成s3c4510b在该段存储空间中的存储单元,这样就可以用c语言编程来访问这些存储单元,从而实现对uda1341ts的控制。实际选择了s3c4510b的可重定位片选信号nrcs1作为fpga实现的寄存器基地址选择信号,并将该片选地址定位为0x12000000,这样各寄存器的实际地址如表1。
根据uda1341ts命令列表,在hitool for arm support μclinux软件开发环境下,编写c语言程序,测试status操作和data0操作功能及结果。程序运行之前需要用jtag下载电缆将ise开发环境下生成的bit文件下载 到fpga芯片中,以实现要求的功能。
经实际测试,通过fpga实现的iis总线和l3接口,s3c4510b可以控制uda1341ts芯片完成各种操作,实现status操作模式和data0模式的各种控制功能,并可用data1操作模式获取音频数据重放时的峰值电平。
编写测试程序,输出1khz正弦信号,并控制声道、音量、静音等变化,示波器观察和耳机听到的结果正确。
编写测试程序,读入麦克风音频信号,分时由左右声道输出,测试结果正确。
本设计采用音频接口专用芯片uda1341ts,并通过fpga实现了iis总线和l3接口,使得基于s3c4510b的嵌入式系统可以方便地扩展音频功能,实验结果正确。
在本文工作的基础上,可以进一步发挥fpga的灵活性。如可以利用fpga实现dsp功能,从而提供音频dsp处理或编码解码;也可以与sopc相结合,作为音频接口模块,为片上系统提供音频接口。
CTV管道检测机器人检查管网内部 成为排污建设的关键一环
基于Chebyshev函数的同轴腔体双工器的设计
可编程控制器的功能有哪些
区块链技术的特性将有利于解决医疗数据处理流程中碰到的很多难点
iPhone8什么时候上市:iphone8无边框设计+OLED曲面屏,任是果粉梦寐以求的他
IIS接口的FPGA实现
简单组合时序电路设计
全球CIS营收将恢复强劲的高增长势头
八类屏蔽模块得到普及了吗
“热饼”取暖器原理,NE555取暖器电路图
涡旋电磁波在无线通信系统中的应用
小松工厂更换氢化植物油致力整个工程建设、矿山行业实现碳中和
一文解读智能医疗公司普遍所面临的困境
实现低于高于75W应用的绿色适配器解决方案
浅谈电瓶修复技术,电池物质脱落故障的症状及原因
直流电机将什么能转换为什么能输出?直流电机能量转化详解
2-Wire Controlled Digital DIP
容栅旋转编码器原理及应用[图]
字谜技术和STREAMUNLIMITED BLUETIGER
十大高音质真无线蓝牙耳机排名,性能颜值均兼顾