- 1、本文档被系统程序自动判定探测到侵权嫌疑,本站暂时做下架处理。
- 2、如果您确认为侵权,可联系本站左侧在线QQ客服请求删除。我们会保证在24小时内做出处理,应急电话:400-050-0827。
- 3、此文档由网友上传,因疑似侵权的原因,本站不提供该文档下载,只提供部分内容试读。如果您是出版社/作者,看到后可认领文档,您也可以联系本站进行批量认领。
查看更多
WM7831产生正弦波
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产生所需的正弦波并输出到耳机接口。详细原理见代码中注释。
代码如下
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:0]i2c_data;
input reset_n;
input clock_i2c;
output [5:0]cyc_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))?~clock_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=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_data[23];
4:reg_sdat=i2c_data[22];
5:reg_sdat=i2c_data
文档评论(0)