您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 会议纪要 > FPGA数字音频开发平台构建
杭州自由电子科技第2页共25页FreeDevFPGA音频开发环境和平台构建自由电子本文通过“自由电子科技”FreeDev音频开发板和数字应用开发板上的音频部分实现的分析,详细叙述了在AlteraFPGASOPC架构下结合NIOSII软核技术,实现数字音频处理的过程和方法。是一个非常典型的FPGA平台上软硬件协同设计的案例。在此架构的基础上能非常方便的融合各种音频处理IPcore,使各个IPcore组件之间相互独立又能协同工作,是一个非常理想并且开放的音频测试、开发环境。系统架构在系统框图中蓝色的组件为系统以实现的部分,白色的为可以加入的模块。TLV320AIC23介绍TLV320AIC23是TI公司的一款立体声数字音频编解码器,支持8K~96KHz采样频率,I2C配置接口,I2S兼容的数字音频接口。Tlv320aic23具有性能优异的音频ADC/DAC,在FreeDev数字应用开发套件中通过I2CIPCORE和NIOSII驱动软件的配合,通过I2C接口NiosIICoreDMAControlAVALONBUSFLASHInterfaceSdramControlSramInterfaceFreeDevAudiomoduleAudioCompressunCompreFirfillterIICcontrolTLV320AIC23SRAMSDRAMFLASH杭州自由电子科技页进行各种配置(具体请查看器件数据手册和开发套件提供的程序代码,这里不再详细叙述)。我们选择了USB取样模式,MCLK是12MHz,支持下表所列的采样率:在USB模式下音频接口有5个信号,LRCIN/LRCOUT分别是输入输出左右声道控制信号,BCLK是时钟信号,DIN/DOUT分别是输入输出串行信号,其时序图如下:我们在FPGA内部实现的音频采集模块就需要依据这个时序图来进行数据接收和发送。音频采集模块实现音频采集模块是一个双时钟域模块,它的一端是avalon总线的从设备,时钟频率为avalon总线频率。另一端是上面描述的aic23的数据时钟BCLK。两个时钟域之间我们用infifo和outfifo隔离。音频采集模块的框图如下:杭州自由电子科技音频采集模块编写通过上述框图的描述,我们再来看具体的实现模块就纲举目张了,下面是freedev_aic23.v的相关代码说明://---------------------------------------------------------//杭州自由电子科技TLV320AIC23音频模块//电话:0571-85084089//网址:邮件://开发日期://简要说明://1、向上连接Avalone总线,设置为Slave设备//2、向下连接TLV320AIC23数字音频接口DSP模式数据//格式。//3、两个时钟域之间用FIFO隔离。//---------------------------------------------------------modulefreedev_aic23(clk,rst_n,irq,cs_n,rd_n,wr_n,addr,rdata,wdata,lrcin,din,lrcout,dout,bclk);inputclk;//masterclkAvalon从设备总线接口逻辑模式、命令、控制、状态寄存器输入FIFO输出FIFO中断生成逻辑I2S接收串并转换模块I2S发送串并转换模块引出到FPGA外部的信号LRCIN/LRCOUT,BCLK,LRIN/LROUT杭州自由电子科技[2:0]addr;//addressoutput[31:0]rdata;//outdatainput[31:0]wdata;//indatainputlrcin;//aicmastermode,fromAIC23tofpgaoutputdin;//toDACinputlrcout;//aicmastermode,fromAIC23TOfpgainputdout;//fromADCinputbclk;//bclkfromAIC23//=============clk时钟域:avaloneslave接口部分==============//寄存器定义reg[31:0]mode_reg;//模式寄存器address000reg[31:0]command_reg;//命令寄存器address001reg[31:0]irq_mask;//中断屏蔽寄存器address010//FIFO状态寄存器address011//inFIFO计数寄存器address100//outFIFO计数寄存器address101//未使用address110//FIFO数据address111regrirq,wirq;reg[31:0]out_data;//outdatareg[31:0]test_count;//testcounter//模块软件复位wires_rst=command_reg[0];wirestart=command_reg[1];//总线读信号wirewacc=~cs_n&~wr_n;//总线写信号wireracc=~cs_n&~rd_n;//写寄存器杭州自由电子科技@(posedgeclkornegedgerst_n)if(!rst_n)beginmode_reg=#132'h0;command_reg=#132'h0;irq_mask=#132'h3;//默认屏蔽中断endelseif(wacc)begincase(addr)3'b000:mode_reg=#1wdata;//写模式寄存器3'b001:command_reg=#1wdata;//写命令寄存器3'b010:irq_mask=#1wdata;//写中断屏蔽寄存器default:;endcaseendalways@(posedgeclk)beginif(racc)case(addr)3'b000:out_data=#1mode_reg;3'b001:out_data=#1command_reg;3'b010:out_data=#1irq_mask;3'b011:out_data=#1{26'h0,,wirq,rirq,infifo_rdempty,infifo_rdfull,outfifo_wrempty,outfifo_wrfull};3'b100:out_data=#1{23'h0,infifo_rdusedw[8:0]};3'b101:out_data=#1{23'h0,outfifo_wrusedw[8:0]};3'b110:out_data=#1test_count;default:;endcaseend//中断信号生成(有读或写中断)assignirq=rirq|wirq;always@(posedgeclk)if(!rst_n)beginrirq=#11'b0;wirq=#11'b0;endelsebegin杭州自由电子科技页//读中断生成条件:读中断屏蔽位0,并且输入队列数据400或输入队列满rirq=#1((irq_mask[0]==1'b0)&&(infifo_rdfull||(infifo_rdusedw400)))?1'b1:1'b0;//写中断生成条件:写中断屏蔽位0,并且输出队列数据112或输出队列空wirq=#1((irq_mask[1]==1'b0)&&(outfifo_wrempty||(outfifo_wrusedw112)))?1'b1:1'b0;end//读寄存器或读FIFO数据assignrdata=(addr==3'b111)?infifo_rdata:out_data;//跨时钟域异步控制信号wirebypass_mode=mode_reg[1:0]==2'b00?1:0;//复位默认是数字旁路wiredma_mode=mode_reg[1:0]==2'b01?1:0;//DMA传输模式wirefifo_mode=mode_reg[1:0]==2'b10?1:0;//Fifo环路模式//==========================================FIFO============================================//Fifo环路模式FIFO读请求生成wirefifo_loop_req=(~infifo_rdempty)?1:0;//输入FIFO相关定义wire[31:0]infifo_rdata;reg[31:0]infifo_wdata;wire[8:0]infifo_rdusedw;wire[8:0]infifo_wrusedw;wireinfifo_rdfull;wireinfifo_rdempty;wireinfifo_wrfull;wireinfifo_wrempty;//infifo_rd读信号//读3'b111时FIFO读请求信号有效wireread_addr7=(addr==3'b111)&&(rd_n==1'b0)&&(cs_n==1'b0);wireinfifo_rd=read_addr7?1:0;reginfifo_wr;//输出FIFO相关定义wire[31:0]outf
本文标题:FPGA数字音频开发平台构建
链接地址:https://www.777doc.com/doc-5592745 .html