




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于FPGA的音频编解码芯片控制器设计 摘要 现如今随着可编程逻辑器件及相关技术的不断发展和完善,其技术在现代 电子技术领域表现出的明显技术领先性,具有传统方法无可比拟的优越性。近 儿年,嵌入式数字音频产品受到越来越多消费者的青睐。在MP3、手机等电 子产品中,音频处理功能已成为不可或缺的重要组成部分,而高质量的音效是 当前发展的重要趋势。 数字语音集成电路与嵌入式微处理器相结合,既实现了系统的小型化、低 功耗,乂降低了产品开发成本,提高了设计的灵活性,具有体积小、扩展方便 等诸多特点,具有广泛的发展前景。 本设计基于SOPC技术,利用Verilog HDL硬件描述语言开发的基于FPGA 的音
2、频编解码芯片控制器,以实现对音频编解码芯片WM8731的控制。并根 据Verilog HDL可移植性和不依赖器件的特点。经过适当的修改,该控制器可 以移植到各类FPGA中,以控制兼容FC和FS总线的音频编解码芯片。避免 了重复开发,这样既缩短了设计周期乂降低了设计成本,可大大提高设计的效 率。系统在功能扩展上具有极大的潜力,有很好的应用前景和科研价值。 关键词:WM8731, FPGA, FC总线,音频控制器 The design of audio codec chip controller based by FPGA Abstract Nowadays, with the programma
3、ble logic devices and related tech no logies continue to develop and improve its technology in the field of moder n electronic tech no logy was demonstrated technology leadership, has in comparable superiority of traditi onal methods .In recent years, embedded digital audio products are more and mor
4、e con sumers of all ages .In MP3, mobile phones and other electronic products, audio processing features have become an indispensable part of the current development of high-quality audio is an important trend. Digital voice in teg rated circuits and embedded microprocessors, which not only realized
5、 the systems small size, low power consumption, and reduced product development costs and improve design flexibility, small size, easy expansion, and many other features, a broad prospects for developme nt. The design is based on SOPC technology, the use of Verilog HDL hardware description Ianguage
6、developed FPGA-based audio codec chip controller, to achieve the WM8731 audio codec chip control. Verilog HDL based on portability and does not rely on the device characteristics After appropriate modifications, the controller can be ported to a variety of FPGA, to control I2C and I2S bus compatible
7、 audio codec chip. Avoid duplicati on of development, then it will shorten the design cycle and reducing design cost, can greatly improve design efficiency. Extensions on the system has great potential, there are good prospects, and scientific value. Keywords: WM8731, FPGA,卩C Bus, Audio controller 1
8、 绪论1 1.1研究的背景及意义1 1.2本设计的主要目的2 2器件介绍3 2.1语音编/解码芯片WM87313 2.2 FPGA 器件 EP2C35F672C64 3协议介绍6 3.1 FC 总线6 3.1.1 FC总线的数据的有效性6 3.1.2 FC总线的数据格式及时序7 3.1.3 FC总线的寻址方式7 3.2 FS 总线8 3.1.1 FS总线的数据格式及时序8 3.1.2 FS总线的数据釆样率9 4 硬件设计10 4.1 硬件方框图10 4.2 ED-2 开发板II 4.3 语音芯片 WM8731外围电路11 5硬件模块设计与实现12 5.1开发环境12 5.1.1 Quartus
9、 II12 5.1.2 Verilog HDL12 5.2硬件模块设计框图13 5.3功能模块的实现14 5.3.1顶层控制器模块14 5.3.2 时钟分频模块15 5.3.3 FC时序接口模块17 5.3.4 FC控制字配置模块20 5.3.5 IS时序接口及音频数据处理模块27 5.3.6 IS串行数据转并行数据模块29 6系统调试31 结论32 致谢33 参考文献34 附录36 附录1 电路图36 附录2源代码37 AUD_TOP .v37 set_wm873 l.v39 i2c_com.v45 I2S_com.v49 I2S_data.v53 clkdivz .v55 外文资料翻译(附
10、原文)错误!未定义书签。 II 1绪论 1.1研究的背景及意义 FPGA (Field Programmable Gate Array),即现场可编程lJ阵列,它是在 PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用 集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的 不足,艾克服了原有可编程器件门电路数有限的缺点。 tl前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过 简单的综合与布局,快速烧录下载至FPGA上进行测试,是现代IC设计验 证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路或者更 复杂一些的组合功能
11、比如解码器或数学方程式。在大多数的FPGA里面,这 些可编辑的元件里也包含记忆元件例如触发器(Flip flop)或者其他更加完 整的记忆块。 系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接 起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA 的逻辑块和连接可以按照设讣者而改变,所以FPGA可以完成所需要的逻辑 功能。 可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之 一。现如今随着FPGA技术的飞速发展,儿十万门乃至儿白万门的可变成逻 辑阵列使用起来越来越普遍。其技术在现代电子技术领域表现出的明显技术领 先性,具有传统方法无可比拟的优越
12、性。 再者近儿年,嵌入式数字音频产品受到越来越多消费者的青睐。在MP3、 手机等消费类电子产品中,人们对于这些个人终端的要求早已不限于单纯通话 和简单的文字处理,音频处理功能已成为不可或缺的重要组成部分,而高质量 的音效是当前发展的重要趋势。 相对于模拟语音系统而言,数字化语音系统抗干扰能力强,数据传输可靠, 开发周期较短,调试容易,便于讣算机存储和处理。而专用的语音芯片是数字 化语音系统的核心。 正是基于上述优点,数字语音集成电路与嵌入式微处理器相结合,这样既 实现了系统的小型化、低功耗,乂降低了产品开发成本,提高了设计的灵活性, 具有体积小、扩展方便等诸多特点,具有广泛的发展前景,如电脑语
13、音钟、语 音型数字万用表、手机话费查询系统、排队机、监控系统语音报警以及公共汽 车报站器等。 1.2本设计的主要目的 本设计是针对音频编解码芯片WM8731,基于FPGA器件利用Verilog HDL硬件描述语言实现对该芯片的控制,设计出基于FPGA的音频编解码芯 片控制器。该控制器只要进行适当的修正,更改寄存器的地址和数据,就可实 现控制电路的移植。 其主要内容包括对音频编/解码芯片WM8731的FC总线配置模块的设计 方法、FS总线数据传输的实现等。将FPGA与数字语音系统的优点相结合, 设计出一个高质量、易操作、易于移植的语音录放系统。 2器件介绍 本设汁主要用到 Wolfson Mic
14、roelectronics公司生产的一款低功耗咼品 质双声道数字信号编/解码芯片WM8731,以及控制该语音芯片工作的FPGA 器件 EP2C35F672C6。 2.1语音编/解码芯片WM8731 WM8731是一款低功耗的高品质双声道数字信号编/解码芯片,其高性能 耳机驱动器、低功耗设计、可控采样频率、可选择的滤波器使得M8731芯片 广泛使用于便携式MP3、CD播放器。其结构框图如图2.1所示。 W83 X-I0S zos so MICWAS RLtEIP4 Micm AvrD VMIO AGMO CCKTRCt IMTFQFACE ADC 6必 OAC WW731 HPVDD HPGII
15、D DIGITAL FlLTEfiS LLIHFIM 12CO-34S SRAM等存储器,标准MIC、 Line-in. Line-out接口,Video-in和VGA等音频视频接口,以及各种输入输 出设备。利用该开发板能方便设计开发,以利于后续的功能扩展。 4.3语音芯片WM8731外围电路 ED-2开发板上已集成了语音芯片WM8731o并连接标准MIC、Line-in. Line-out接口以连接麦克风和耳机等外部设备。其电路图如图4.2所示。 8.端 口定义 assign led=rst_n; assign MCLK=cO; 复位按钮连接一个LED灯,显示按钮状态 / 18.432MHz
16、主时钟输入 set_wm8731 (clock_50m(clock_50m), /I2C控制字配置模块端口连接 14 .i2c_sclk(sclk)vi2c_sdat(sdat)vreset_n(rst_n),.key 1 (key 1), .key2(key2),.led 1 (led I),.led2(led2),.sw l(sw I),.sw2(sw2); I2S_com(.clockef(cO), / I2S时序接口及音频数据处理模块端口连接 dacclk(dacclk),.bclk(bclk),.dacdat(dacdat),.reset_n(rst_n), 时钟分频模块端口连接 a
17、dcclk(adcclk),.adcdat(adcdat),.data(data); clkdivz (inclk0(clock_50m),c0(c0); endmodule 5.3.2时钟分频模块 由于要使WM8731工作,必须给其提供一个主时钟频率。此主时钟频率 依照该芯片工作的不同模式有12.288MHz、18.432 MHz、11.2896 MHz以及 16.9344 MHz这4中频率可选。 在本设计中,选择WM8731工作在普通模式(Normal mode)下,并选择 18.432 MHz为其主时钟频率。该频率可以通过XTI和XTO端口,山晶振提供。 但本设计利用FPGA自带的锁相环
18、(PLL)和全局时钟网络,将DE2开发板 上自带的50MHz品振分频得到。因此本模块主要运用Quartus II环境下的Mega Wizard定制功能自动生成的。但由于50MHz不能精确地分频到18.432MHz, 所以采用了一个能分到一个最接近的频率,即18.421053MHzo 如图5.3所示,该模块以50MHz的时钟为输入,输出18.432MHz分别连 接到MCLK以及I2S时序接口及音频数据处理模块的时钟输入。 15 图5.3时钟分频模块 mclkO k肝厅MCLK :ckxck 50m inst clkdivz Clk Ratio Ph (dg : cO -152/3125 0.00
19、 50.00 incIkO frequency: 50.20 MHz Operation Wode: Normal Cyclone II 该模块Verilog HDL描述的设计关键代码如下: module clkdivz ( /端口定义 inclkO、 / 50MHz时钟输入 c0); / 18.432MHz时钟输出 altpll altpll_component (.inclk (sub_wire3),/ 调用 altpll IP 核 .elk (sub_wiwO), vcounderrange (); defparam altplLcomponent.clkO_divide_by = 31
20、25, 16 altpn_component.clkO_duty_cycle = 50, altpll_component.clkO_miiltiply_by = 1152, altplLcomponent.clkO_phase_shift = altpH_pensate_clock = HCLK0H, altpll_component.inclkO_input_frequency = 20000, altplLended_device_family = Cyclone IF endmodule 5.3.3 FC时序接口模块 该模块主要实现对FC时序的模拟,控制SCL
21、KC数据时钟)和SDATC数 据线)将存放在i2c_data中的24位控制字串行发送给WM8731,该模块例化 于FC控制字配置模块之中,以实现对该芯片的控制字写入。 如图5.4所示,在此模块中i2c_data为24位控制字写入;reset_n为复位输 入:clock_i2c为I2C接口传输时钟;start为传输开始标志输入;ack为卩C时 序中3位应答位进行或操作合并为一个应答位的输出;tr.end为传输结束信号 输出;i2c_sclk为I2C接口数据时钟输出;i2c_sdat为I2C接口串行数据输出。 PC时序接口模块时序仿真,如图5.5所示。此处以i2c_data中24位数据 17为 0
22、111 0011 10000100 11000111 为例,当 start 信号拉低后,i2c_sclk 开始传 输串行数据时钟。这里I2c时序采用33个FC时钟周期进行,其中4-11位、 13-20位、22-29位传送数据,12、21、30为应答位。传输状态时,数据高位 在前低位在后,24位数据每8位为一字节,每发送1个字节的数据,就应返 回一个应答信号将i2c_sdat状态拉高。空闲状态时,i2c_sdat为高阻态,i2c_sclk 为高电平状态。 么.7 、九 c4t rwt_n Cl4Tt c 3 0 r.t ICO 120 a c 40 ? *C ruuuy一ruunummuyiru
23、iTL AO AO KliajUTaj ruutruuuLnjTJTjtrLj 图5. 5 I2C时序接口模块时序仿真 该模块的Verilog HDL i2i|s关键代码如下: module i2c_com(clock_i2c,reset_n,ackj2c_data,start,tr_end,i2c_sclkj2c_sdat); assign ack=ackllack2lack3;/ 应答信号 assign i2c_sclk=sclkl(cyc_count=4) /数据时钟 assign i2c_sdat二rejsdat?lbz:O;/ 串行数据线 always(posedge clock_i
24、2c or negedge reset_n) 模拟 PC 传输数据时钟 begin if(!reset_n)/ 复位 cyc_count=6,b 111111; else begin 18 if(start=O) cyc_count=0; else if(cyc_count6*b 111111) cyc_cou nt=c yc_cou nt+1; end end always(posedge clock_i2c or negedge resetn) / 模拟卩C 传输吊行数据 begin if(!reset_n)/ 复位 begin else case(cyc_count)/ I2C 时钟周期
25、赋值 0: begin ack 1 = 1 ;ack2= 1 ;ack3= 1 ;tr_end=0;sclk= 1 ;reg_sdat= 1; end 1:reg_sdat=0;/ 开始传输 10:reg_sdat=i2c_data 16; 11: reg_sdat= 1;应答信号 1 12:begin reg_sdat=i2c_data 15;ack 1 =i2c_sdat;end 19 应答信号2 19: reg_sdat=i 2c_d ata8; 20:reg_sdat=l; 21:begin reg_sdat=i2c_data7;ack2=i2c_sdat;end 28: reg_sd
26、at=i2c_data0; 29:reg_sdat=l;应答信号 3 32:begin reg_sdat= 1 ;tr_end= 1 ;end endcase end endmodule 5.3.4 FC控制字配置模块 该模块是基于FC时序接口模块之上的控制单元。如图5.6所示,该模块 主要实现对语音芯片WM8731的初始配置、生成FC控制时钟、输出音量控 制以及输出模式选择等功能。以下将以实现的功能为单位来介绍该模块。 20 # :set_wm573t 图5. 612C控制字配置模块 (1)初始配置 初始配置功能是本模块要实现的主要功能。该部分主要是对i2c时疗; 接口模块例化,并向该模块写
27、入预设定的控制字以及开始信号、等待结束 信号、校验应答信号,以实现I2C设置过程。针对语音芯片WM8731的 10个控制寄存器预设控制字,并逐个周期将预设定的控制字写入该芯片。 该部分关键Verilog HDL代码如下所示。 i2c_com u 1 (.clock_i2c(clock_20k),.reset_n(reset_n),.ack(ack), .i2c_data(i2c_data),.start(start),.tr_end(tr_end),.i2c_sclk(i2c_sclk), i2c_sdnt(i2c_sdat); / 例化 I2C 时序接 口模块 always(posedge
28、clock_20k or negedge reset_n)/ 配置过程控制 begin if(!reset_n) begin else 卩C i殳置过程 21 begin if(reg_indexl 1) begin case(config_step) O:begin i2c_data= 8h34,reg_data写入地址与控制字 start=l;/写入开始信号 config_step= 1; end l:begin if(tr_end)/等待结束信号 begin if(!ack) /校验应答信号 config_step=2; else config_step=0; start=0; end
29、end 2:begin reg_index=reg_index+l; config_step=0; 22 always (reg_index) begin /I2C配置预设数值 case(reg_index) O:reg_data= 16*hO 11 f; 10:reg_data=left; defau 11: reg_d ata= 16h001 a; endcase end (2)生成I2C控制时钟 该部分是主要功能是产生I2C控制时钟,山于WM8731允许的I2C控 制时钟在400KHz内有效,所以无法直接用外设的50MHz的晶振频率。 出于简单、易分频的原则,本设计选用20KHz作为FC
30、总线的控制时钟。 该部分关键代码如下: always(posedge clock_50m or negedge reset_n) / 产生 I2C 控制时钟-20KHz begin if(!reset_n) begin else if(clock_20k_cnt2499) 计数到 2500 跳变一次 clock_20k_cntv二clock_20k_cnt+1; else begin clock_20kv=!clock_20k; 23 clock_20k_cnt Side Tone和DACSEL 三种模式,因此在预设控制字代码段中加入了模式选择控制。 SIDETONE 图5. 7 WM8731
31、模式示意图 通过读取开关Swl和Sw2的值来改变预设控制字,以达到模式切换 的功能。其Verilog HDL代码如下所示: 4: if (swl=l ) reg_data= 1611080a;/ Bypass 模式 else if(sw2=l) reg_data= 16110825;/ Side Tone 模式 24 else regdata= 16110810;/ DACSEL 模式 (4)输出音量控制 该部分主要是实现通过按键来增大或减小音量的功能。山于存在利用 按键改值的要求,所以去抖动是必不可少的。因此该部分主要涉及两个方 面的程序。 按键计时检测程序 在这一部分的程序中,主要是利用供
32、给I2C总线的20KHz的时钟 频率,计时每20ms检测一次按键值。如果两次相邻时间的键值不同, 则可判断有按键按下,进而触发音量增减程序。具体程序代码如下所 示: always (posedge clock_20k or negedge reset_n) /按键汁时程序 begin if (!reset_n) cnt=cnt+Tbl; end always (posedge clock_20k) begin if(cnt=10*d400)/ 每隔 2OMs 检测一次按键 begin keyl_f=keyl; 25 key2_f=key2; end key 1 _f_wv 二 key l_f;
33、 key2_f_w=key2_f; end wire key l_ctrl = key l_f_w / 检测两次相邻时间键值, wire key2_ctrl = key2_f_w / 若不同则改变 Ctrl 的值 音量增减程序 若有按键按下,则变量keyl (2) .Ctrl的值将置为一,进而触发 对应的音量增减程序。以增加音量为例,当有Keyl按键按下时, keyl-ctrl的值变为1,此时对应控制音量的预设值会增加一个音量档 位。若多次增加音量以至于超过最大音量,预设值将以最大音量送入 语音芯片,则音量不会继续增大,减小音量与之类似。具体程序代码 如下所示: else if (keyl_c
34、trl)/ 按键增加音量 begin left= 16h057f) begin left=16h057f; end reg_index=(CLOCK_REF/(CLOCK_SAMPLER* 17*2)-1) begin bclkv=bclk; always(posedge clock_ref or negedge reset_n) /生产 48KHz 的 DAC 时钟 dacclk begin if(!reset_n) else if(dacclk_cnt=(CLOCK_REF/(CLOCK_SAMPLE*2) 1) begin dacclk=(CLOCK_REF/(CLOCK_SAMPLE*
35、2)-l) begin adcclkv=adcclk; assign dacdat二adcdat; / 将 ADC 的数据直接从 DAC 输出 always(negedge adcclk)/生成宙并变换的起始标志 begin if(!reset_n) else if (bclk) state=0; else state= 1; end endmodule 5.3.6 PS串行数据转并行数据模块 该模块已例化在FS时疗:接口及音频数据处理模块之中。其功能是逐位将 adcdat串行输入的音频数据转化成并行数据山data端口输出,在整个系统中并 行data输出端口为后续开发的预留端口。 29 mod
36、ule I2S_data(bclk. adcclk, adcdat, data, state); always (posedge bclk or posedge state) begin if(sta/开始转化标志 begin mjmv=5h0; end else if(!adcclk) 随着bclk的变化逐位转化 begin num=num+rbl; end end always (num) 串并转化 case(num) 1: data_reg 15=adcdat; 17:data=data_reg; /转化完成赋值给端口 default:data Side Tone和 DACSEL三种模式
37、的切换。三个按钮式按键用以实现增大或减小音量,以及 复位的功能。 在测试中,上述功能均已实现,并能正常控制WM8731输出预期的音频 数据。 31 结论 随着可编程逻辑器件及相关技术的不断发展和完善,人们越来越多的利用 EDA技术进行数字系统的设计和开发。本设计方案基于SOPC技术,将I2C 总线控制器、音频数据处理I2S总线模块和各个数字控制模块都设计在FPGA 内部。极大地提高了系统的集成度和稳定性。 利用Verilog HDL硕件描述语言开发的基于FPGA的音频编解码芯片控制 器,经过验证功能完整正确,可以实现对音频编解码芯片WM8731的控制。 不仅如此,根据Verilog HDL可移
38、植性和不依赖器件的特点,经过适当的 修正该控制器可以移植到各类FPGA中,以控制兼容I2C和FS总线的音频编 解码芯片。避免了重复开发,这样既缩短了设计周期乂降低了设计成本,可大 大提高设讣的效率。系统在功能扩展上具有极大的潜力,有很好的应用前景和 科研价值。 32 致谢 经过将近一个学期的努力,终于如期完成了本次毕业设讣。首先我要感谢 我的毕设导师杨扬老师,在整个完成毕设的过程中,杨老师给予了我很大的帮 助,在一些关键点上给我思路和技术上的点拨,以使我少走了很多的弯路。从 杨老师那里我不仅学习到了知识,更重要的是他严格要求,精益求精,严谨求 实的治学态度给我留下深刻印象,这定会让我受益终身。
39、在此,我特别要向杨 老师表达我深深的谢意。 感谢信息工程学院所有帮助过我、指导过我的老师,是他们细心的指导和 耐心的教诲,让我学到了很多,懂得了很多。 另外还要感谢通信07A-4班的所有同学。在与他们共同学习,共同生活的 四年里,我们一同经历了四年的风风雨雨,与他们的交流和讨论,扩展了我的 思路,锻炼了我的能力,对论文的完成颇有益处。 最后,再次对关心、帮助我的老师和同学表示衷心地感谢。 33 参考文献 1 王杰玉,杜炜,潘红兵.基于FPGA的音频编解码芯片接口设计.现代电子 技术,2009, (05). 2 徐峰,叶辉.音频解码芯片在嵌入式系统中的应用.黑龙江科技信息, 200 input
40、clock_50m; input rst_n; output sclk; inout sdat; inout dacclk; output dacdat; inout bclk; input adcdat; inout adcclk; input keyl,key2; output ledl ,led2Jed; output MCLK; input swl,sw2; output 15:0 data; assign led=rst_n; assign MCLK=cO; 37 set_wm8731 (clock_50m(clock_50m), i2c_sclk(sclk), .i2c_sdat(
41、sdat), reset_n(rst_n), key 1 (key 1), key2(key2), .led 1 (led 1), .Ied2(led2), .swl(swl), sw2(sw2); I2S_com(clock_ref(cO), .dacclk(dacclk), bclk(bclk), dacdat(dacdat), reset_n(rst_n), .adcclk(adcclk), adcdat(adcdat), .data(data); clkdivz (inclk0(clock_50m), cO(cO); 38 endmodule set_wm8731.v module s
42、et_wm8731 (clock_50m、i2c_sclk,i2c_sdat jeset_n,key 1 ,key2Jed 1 Jed2,sw 1 ,sw2); input clock_50m; input reset】; output i2c_sclk; inout i2c_sdat; input keyLkey2; output ledl Jed2; input swl,sw2; reg clock_20k; reg 15:0clock_20k_cnt; reg l:0config_step; reg 3:0reg_index; reg 23:0i2c_data; reg 15:0reg_
43、data; reg start; reg 9:0 ent; reg 15:0 left; reg 15:0 right; reg keyl_f.key2_f; 39 reg keyl_fLw,key2_fLw; assign Iedl=!keyl; assign Ied2=!key2; initial begin left=16hO55f; key 1 _fv=0;key2_fv=0; end i2c_com u l(.clock_i2c(clock_20k), .reset_n(reset_n), .ack(ack), i2c_data(i2c_data), start(start), .t
44、r_end(tr_end), i2c_sclk(i2c_sclk), i2c_sdat(i2c_sdat); always (posedge clock_50m or negedge reset_n) 产生 I2C 控制时钟-20khz begin if(!reset_n) begin 40 clock_20k=0; clock_20k_cntv=0; end else if(clock_20k_cntv2499) clock_20k_cntv 二 clock_20k_cnt+l; else begin clock_20kv=!clock_20k; clock_20k_cntv=0; end
45、end always (posedge clock_20k or negedge reset_n) /按键 讣时程序 begin if (!reset_n) cnt=10,d0; else cnt=cnt+rbl; always (posedge clock_20k) begin if (cnt=10*d400)每隔 2OMs 检测一次按键 20Khz 400 次 begin 41 keyl_f=keyl; key2_f=key2; end key 1 _f_w v二 key 1 _f; key2_f_wv=key2_f; end wire key 1 _ctrl = keyl_f_w wir
46、e key2_ctrl = key2_f_w always(posedge clock_20k or negedge resetn)配置过程控制 begin if(!reset_n) begin config_step=0; start=0: reg_index=0; left=16hO55f; end else if(keyl_ctrl)按键改音量 begin left= 16hO57f) begin 42 leftv=16b057f; end reg_index=4,b 1010; end else if(key2_ctrl) begin left=IefM6*h0008; if(left
47、 = 16h051f) begin leftv=16h051f; end reg_index=4,b 1010; end else/I2C设置过程 begin if(reg_indexl 1) begin case(config_step) 0:begin i2c_datav= 8*h34,reg_data; start=l; config_step= 1; end 1: begin 43 if(tr_end) begin if(!ack) config_step=2; else config_step=0; start=0; end end 2:begin reg_index=reg_ind
48、ex+1; config_step=0; end endcase end end end always(regjndex)/I2C 配置数值 begin case(reg_index) 0:reg_data=16,h01 If; 1: reg_data= 16h021 f; 2:reg_data= 16bO55f; 44 3:reg_data= 16*h065f; 4:if(swl=l) reg_data= 16fh080a; else if(sw2=l) reg_data= 16*hO825; else reg_data= 16*h0810; 5:reg_data= 16hOaO 1; 6:
49、reg_data= 16h0c00; 7:reg_data= 16*h0e 12; 8:reg_data= 16h 1002; 9:reg_data= 16h 1201; 10:reg_data=left; default:reg_data=4) assign i2c_sdat=reg_sdat? 1 bz:0; always(posedge clock_i2c or negedge reset_n) 根据 SCLK 模拟 I2C 传输位 时钟 46 begin if(!reset_n) cyc_count=6,b 111111; else begin if(start=O) cyc_coun
50、t=0; else if(cyc_count6b 111111) cyc_count=cyc_count+l; end end always (posedge clock_i2c or negedge reset_n) begin if(!reset_n) begin tr_end=0; ack 1=I; ack2=l; ack3v=l; sclk=l; reg_sdat= 1; end else case(cyc_count) 47 O:begin ack 1 = 1 ;ack2= 1 ;ack3= 1 ;tr_end=O;sclk= 1 ;reg_sdat= 1 ;end 1:reg_sd
51、at=0;开始传输 2:sclk=0; 3: reg_sdat=i2c_data23; 4:reg_sdat=i2c_data22; 5:reg_sdat=i2c_data21; 6:reg_sdat=i2c_data20; 7:reg_sdat=i2c_data 19; 8: reg_sd at=i 2c_d ata 18; 9:reg_sdat=i2c_data 17; 10:reg_sdat=i2c_data 16; 1 l:reg_sdat=l;应答信号 1 12:begin reg_sdat=i2c_data 1 习;ack 1 v二i2c_sdat;end 13 :reg_sdat
52、=i2c_data 14; 14:reg_sdat=i2c_data 13; 15 :reg_sdat=i2c_data 12; 16:reg_sdat=i2c_data 11 ; 17:reg_sdat=i2c_data 10; 18: reg_sdat =i 2c_d ata9; 19:reg_sdat=i2c_data 8; 应答信号2 20:reg_sdat=l; 48 21:begin reg_sdat=i2c_data7;ack2=i2c_sdat;end 22:reg_sdat=i2c_data6; 23:reg_sdat=i2c_data5 ; 24: reg_sdat=i 2
53、c_d ata4; 25:reg_sdat=i2c_data3; 26:reg_sdat=i2c_data2; 27:reg_sdat=i2c_data 1; 2 29:reg_sdat=l;应答信号 3 30:begin ack3=i2c_sdat;sclk=O;reg_sdat=O:end 31:sclk=l; 32:begin reg_sdat= 1 ;tr_end= 1 ;end endcase end endmodule I2S_com.v module I2S_com(clock_ref,dacclk,bclk,dacdat,reset_n,adcclk,adcdat,data);
54、 input clock_ref;/MCLK 输入时钟,1 input resetn; input adcdat; inout adcclk; inout dacclk; 49 output dacdat; inout bclk; output 15:0 data; reg dacclk; reg adcclk; reg 8:0dacclk_cnt; reg 8:0adcclk_cnt; reg bclk; reg 3:0bclk_cnt; reg state; I2S_data ul(.bclk(bclk), .adcclk(adcclk), adcdat(adcdat), data(dat
55、a), .state(state); parameter CLOCK_REF= 18432000; parameter CLOCK_SAMPLE=48000; always(posedge clock_ref or negedge reset_n) /生产 17 位数据传输时钟 bclk begin if(!reset_n) begin 50 bclk=(CLOCK_REF/(CLOCK_SAMPLE*2* 17*2)-1) begin bclkv 二bclk; bclk_cntv=O; end else bclk_cnt=bclk_cnt+1; end always(posedge cloc
56、k_ref or negedge reset_n) 生产 dac 时钟 48khz dacclk begin if(!reset_n) begin dacclk=0; dacclk_cnt=(CLOCK_REF/(CLOCK_SAMPLE*2)-1) begin dacclk=-dacclk; dacclk_cnt=0; 51 end else dacclk_cntv 二 dacclk_cnt+l; end always (posedge clock_ref or negedge reset_n)生产 ndc 时钟 48khz adcclk begin if(!reset_n) begin a
57、dcclk=0; adcclk_cnt=(CLOCK_REF/(CLOCK_SAMPLE*2)-1) begin adcclk=-adcclk; adcclk_cnt=0; end else adcclk_cnt=adcclk_cnt+l; end assign dacdat=adcdat; always (negedge adcclk) 52 begin if(!reset_n) begin state=0; end else if (bclk) state=0; else state(posedge bclk or posedge state) begin if(state) begin
58、num=5,h0; end else if(!adcclk) begin num=num+rbl; end end always (num) case(num) 1: data_reg 15=adcdat; 2:data_reg 14=adcdat; 3:data_reg 13=adcdat; 4:data_reg 12=adcdat; 5:data_reg 11 =adcdat; 6:data_reg 10=adcdat; 7:data_reg9=adcdat; 8:data_reg8=adcdat; 9: d ata_reg 7 =adcd at; 10:data_reg6=adcdat;
59、 54 11:data_reg5=adcdat; 12:data_reg4=adcdat; 13:data_reg3=adcdat; 14: data_reg 2 =adcdat; 15:data_reg l=adcdat; 16:data_reg0=adcdat; 17: data=data_reg; default :data= 16hO; endcase endmodule clkdivz .v module clkdivz ( inclkO, cO); inputinclkO; outputcO; wire 5:0 sub_wire0; wire 0:0 sub_wire4 = 1hO
60、; wire 0:0 sub_wirel = sub_wire00:0; wire cO = sub_wire 1; 55 wire sub_wire2 = inclkO; wire 1:0 sub_wire3 = sub_wire4, sub_wire2; altpll altpll_component ( inclk (sub_wire3), .elk (sub_wire0), activeclock (), .areset (TbO), .clkbad (), .clkena (6 lbl), .clkloss (), .clkswitch (TbO), configupdate (Tb
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物化学分子基础概念题库及解析
- 珠宝首饰行业设计大赛试题
- 药品进口代理协议
- 2025年经济师备考方法分享试题及答案
- 人员管理与绩效考核试题及答案
- 项目扩展及合作策略试题及答案
- 信阳市学法用法考试试题及答案
- 防钓鱼测试题及答案
- 急诊精神科的合作模式计划
- 购房贷款协议书
- 2025年中国对外文化集团公司招聘笔试参考题库含答案解析
- 2025年5月日历表(含农历-周数-方便记事备忘)
- 煤矿测量新手培训课件
- 幼儿园篮球教练员培训
- 专题02全等模型-一线三等角(K字)模型(原卷版+解析)
- 水利工程施工监理规范(SL288-2014)用表填表说明及示例
- 透析病人低血压护理查房
- 医疗行业诚信建设评估制度
- 新能源汽车充电桩施工与验收标准规范
- 口腔护理学基础-口腔四手操作技术
- 激光武器课件
评论
0/150
提交评论