WM7831产生正弦波

上传人:ali****an 文档编号:111002565 上传时间:2019-11-01 格式:DOC 页数:20 大小:170.50KB
返回 下载 相关 举报
WM7831产生正弦波_第1页
第1页 / 共20页
WM7831产生正弦波_第2页
第2页 / 共20页
WM7831产生正弦波_第3页
第3页 / 共20页
WM7831产生正弦波_第4页
第4页 / 共20页
WM7831产生正弦波_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《WM7831产生正弦波》由会员分享,可在线阅读,更多相关《WM7831产生正弦波(20页珍藏版)》请在金锄头文库上搜索。

1、DE2实践之WM8731产生正弦波经历近三周的时间,终于搞定了wm8731产生1khz正弦波的那个DEMO。现在就将这三周来的收获做一个记录,希望大家与我共同分享,共同进步。 一.本DEMO 的目的 通过fpga控制音频编解码芯片wm8731产生一个1khz的正弦波,接上de2板上的耳机接口,试听此正弦波。 二.原理FPGA与wm8731共有5个接口,分别为SCLK,SDIN,DACLRC,DACDAT,BCLK.其中SCLK,SDIN为控制接口,DACLRC,DACDAT,BCLK为数字音频接口。由SCLK,SDIN配置wm8731的寄存器,由DACLRC,DACDAT,BCLK产生所需的正

2、弦波并输出到耳机接口。详细原理见代码中注释。代码如下1. sclk,sdin数据传输时序代码(i2c写控制代码)module i2c_com(clock_i2c, /wm8731控制接口传输所需时钟,0-400khz,此处为20khz reset_n, ack, /应答信号 i2c_data, /sdin接口传输的24位数据 start, /开始传输标志 tr_end, /传输结束标志 cyc_count, i2c_sclk, /FPGA与wm8731时钟接口 i2c_sdat); /FPGA与wm8731数据接口 input 23:0i2c_data; input reset_n; inpu

3、t clock_i2c; output 5:0cyc_count; output ack; input start; output tr_end; output i2c_sclk; inout i2c_sdat; reg 5:0 cyc_count; reg reg_sdat; reg sclk; reg ack1,ack2,ack3; reg tr_end; wire i2c_sclk; wire i2c_sdat; wire ack; assign ack=ack1|ack2|ack3; assign i2c_sclk=sclk|(cyc_count=4)&(cyc_count=30)?c

4、lock_i2c:0); assign i2c_sdat=reg_sdat?1bz:0; always(posedge clock_i2c or negedge reset_n) begin if(!reset_n) cyc_count=6b111111; else begin if(start=0) cyc_count=0; else if(cyc_count6b111111) cyc_count=cyc_count+1; end end always(posedge clock_i2c or negedge reset_n) begin if(!reset_n) begin tr_end=

5、0; ack1=1; ack2=1; ack3=1; sclk=1; reg_sdat=1; end else case(cyc_count) 0:begin ack1=1;ack2=1;ack3=1;tr_end=0;sclk=1;reg_sdat=1;end 1:reg_sdat=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_data19; 8:reg_sdat=i2c_data18;

6、9:reg_sdat=i2c_data17; 10:reg_sdat=i2c_data16; 11:reg_sdat=1; /应答信号 12:begin reg_sdat=i2c_data15;ack1=i2c_sdat;end 13:reg_sdat=i2c_data14; 14:reg_sdat=i2c_data13; 15:reg_sdat=i2c_data12; 16:reg_sdat=i2c_data11; 17:reg_sdat=i2c_data10; 18:reg_sdat=i2c_data9; 19:reg_sdat=i2c_data8; 20:reg_sdat=1; /应答信

7、号 21:begin reg_sdat=i2c_data7;ack2=i2c_sdat;end 22:reg_sdat=i2c_data6; 23:reg_sdat=i2c_data5; 24:reg_sdat=i2c_data4; 25:reg_sdat=i2c_data3; 26:reg_sdat=i2c_data2; 27:reg_sdat=i2c_data1; 28:reg_sdat=i2c_data0; 29:reg_sdat=1; /应答信号 30:begin ack3=i2c_sdat;sclk=0;reg_sdat=0;end 31:sclk=1; 32:begin reg_s

8、dat=1;tr_end=1;end endcase endendmodule这里需要关键注意的是i2c的写控制时序要把握准确:个人总结如下图: 说明:A:这里的i2c控制器采用33个i2c时钟周期进行,其中3-10,12-19,21-28传送数据,11,20,29为应答位。B:空闲状态时,sdat为高阻态,sclk为高电平状态。C:每发送1个字节的数据,就应返回一个应答信号将sdat状态拉低。D:实际传输时,24位的数据各部分为下:a 第1个字节的前7位为wm8731器件地址,第8位为读或写选择位,写为0,读为1.b 第2个字节的前7位为wm8731中寄存器的地址位,第8位为寄存器中9位数据

9、的最高位。c 第3个字节的8位数据为wm8731中寄存器中9位数据的低8位。 2. wm8731中寄存器的配置程序 module reg_config(clock_50m, i2c_sclk, i2c_sdat, reset_n); input clock_50m; input reset_n; output i2c_sclk; inout i2c_sdat; reg clock_20k; reg 15:0clock_20k_cnt; reg 1:0config_step; reg 3:0reg_index; reg 23:0i2c_data; reg 15:0reg_data; reg st

10、art; i2c_com u1(.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_sdat(i2c_sdat); always(posedge clock_50m or negedge reset_n) /产生i2c控制时钟-20khz begin if(!reset_n) begin clock_20k=0; clock_20k_cnt=0; end else if(clock_20k_cnt2499) clock_20k_cnt=clock_20k_cnt+1; else begin clock_20k=!clock_20k; clock_20k_cnt=0; end end always(posedge clock_20k or negedge reset_n) /配置过程控制 begin if(!reset_n) begin config_step=0; start=0; reg_index=0; end else begin if(reg_index10) begin case(config_step)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号