文档库 最新最全的文档下载
当前位置:文档库 › 基于sopc嵌入式卡拉OK机

基于sopc嵌入式卡拉OK机

卡拉OK机设计

学号 1115108052 姓名詹炳鑫

班级 11电子B班

指导老师傅文渊

题目一、基于SOPC 的卡拉OK 机设计(难度系数0.9)

介绍:卡拉OK 机是娱乐休闲的一种方式,人们通过唱歌来减轻生活压力的一种方法,已经成为大众娱乐的一种方式。

基本功能:用DE2 平台的FPGA 搭建SOPC 系统,利用WM8731 音频解码芯片和DE2 输入输出接口LINEIN、LINEOUT 和麦克风实现卡拉OK 机的应用。

原理图:

提高部分:

1. 能够调节音频频段,音量大小;

2. 选择产生各种音效,进行频谱分析,以及显示功能的通用音频信号处理器。

WM873l是一款功能强大的低功耗立体声24位音频编解码芯片,其高性能耳机驱动器、低功耗设计、可控采样频率、可选择的滤波器使得WM8731芯片广泛使用于便携式MP3,CD,PDA 的场合。其结构框图如图1所示。

本课题卡拉ok机就是主要根据音频编解码芯片WM8731为前提来设计的。

WM8731包含2个线路输入和1路麦克风输入并可以进行音量调节;内置片上ADC(模拟数字转换器)及可选择的高通数字滤波器;采用高品质过采样率结构的DAC(数字模拟转换器);线路输出和耳机输出;内置晶体振荡器以及可配置的数字音频接口和2或3线可选的微处理器控制接口等。控制器可通过控制接口(Control Interface)对WM8731进行配置,然后通过数字音频接口(Digtal Audio Interface)读写数据音频信号。本文设计了一种基于FPGA的驱动模块,将WM8731的控制接口与数字音频接口转换为控制器通用的总线接口,使控制器可

以像读写外部寄存器一样对WM8731芯片进行控制使用。ED2音频部分电路

原理图

程序运行结果

引脚锁定

WM8731控制电路的实现

总控制模块

`程序

define rom_size 6'd8

module CLOCK_500 (

CLOCK,

CLOCK_500,

DA TA,

END,

RESET,

GO,

CLOCK_2

);

input CLOCK;

input END;

input RESET;

output CLOCK_500;

output [23:0]DATA;

output GO;

output CLOCK_2;

reg [10:0]COUNTER_500;

wire CLOCK_500=COUNTER_500[9];

wire CLOCK_2=COUNTER_500[1];

reg [15:0]ROM[`rom_size:0];

reg [15:0]DATA_A;

reg [5:0]address;

wire [23:0]DATA={8'h34,DATA_A};

wire GO =((address <= `rom_size) && (END==1))? COUNTER_500[10]:1; always @(negedge RESET or posedge END) begin

if (!RESET) address=0;

else

if (address <= `rom_size) address=address+1;

end

reg [7:0]vol;

always @(posedge RESET) begin

vol=vol-1;end

always @(posedge END) begin

// ROM[0]= 16'h1e00;

ROM[0]= 16'h0c00; //power down

ROM[1]= 16'h0ec2; //master

ROM[2]= 16'h0838; //sound select

ROM[3]= 16'h1000; //mclk

ROM[4]= 16'h0017; //

ROM[5]= 16'h0217; //

ROM[6]= {8'h04,1'b0,vol[6:0]}; //

ROM[7]= {8'h06,1'b0,vol[6:0]}; //sound vol

//ROM[4]= 16'h1e00; //reset

ROM[`rom_size]= 16'h1201;//active

DA TA_A=ROM[address];

end

always @(posedge CLOCK ) begin

COUNTER_500=COUNTER_500+1; end

endmodule

I2C控制器

I2C控制代码

module i2c (

CLOCK,

I2C_SCLK,//I2C CLOCK

I2C_SDAT,//I2C DATA

I2C_DATA,//DA TA:[SLA VE_ADDR,SUB_ADDR,DATA] GO, //GO transfor

END, //END transfor

W_R, //W_R

ACK, //ACK

RESET,

//TEST

SD_COUNTER,

SDO

);

input CLOCK;

input [23:0]I2C_DA TA;

input GO;

input RESET;

input W_R;

inout I2C_SDA T;

output I2C_SCLK;

output END;

output ACK;

//TEST

output [5:0] SD_COUNTER;

output SDO;

reg SDO;

reg SCLK;

reg END;

reg [23:0]SD;

reg [5:0]SD_COUNTER;

wire I2C_SCLK=SCLK | ( ((SD_COUNTER >= 4) & (SD_COUNTER <=30))? ~CLOCK :0 ); wire I2C_SDAT=SDO?1'bz:0 ;

reg ACK1,ACK2,ACK3;

wire ACK=ACK1 | ACK2 |ACK3;

//--I2C COUNTER

always @(negedge RESET or posedge CLOCK ) begin

if (!RESET) SD_COUNTER=6'b111111;

else begin

if (GO==0)

SD_COUNTER=0;

else

if (SD_COUNTER < 6'b111111) SD_COUNTER=SD_COUNTER+1;

end

end

//----

always @(negedge RESET or posedge CLOCK ) begin

if (!RESET) begin SCLK=1;SDO=1; ACK1=0;ACK2=0;ACK3=0; END=1; end

else

case (SD_COUNTER)

6'd0 : begin ACK1=0 ;ACK2=0 ;ACK3=0 ; END=0; SDO=1; SCLK=1;end

//start

6'd1 : begin SD=I2C_DA TA;SDO=0;end

6'd2 : SCLK=0;

//SLAVE ADDR

6'd3 : SDO=SD[23];

6'd4 : SDO=SD[22];

6'd5 : SDO=SD[21];

6'd6 : SDO=SD[20];

6'd7 : SDO=SD[19];

6'd8 : SDO=SD[18];

6'd9 : SDO=SD[17];

6'd10 : SDO=SD[16];

6'd11 : SDO=1'b1;//ACK

//SUB ADDR

6'd12 : begin SDO=SD[15]; ACK1=I2C_SDAT; end

6'd13 : SDO=SD[14];

6'd14 : SDO=SD[13];

6'd15 : SDO=SD[12];

6'd16 : SDO=SD[11];

6'd17 : SDO=SD[10];

6'd18 : SDO=SD[9];

6'd19 : SDO=SD[8];

6'd20 : SDO=1'b1;//ACK

//DATA

6'd21 : begin SDO=SD[7]; ACK2=I2C_SDAT; end

6'd22 : SDO=SD[6];

6'd23 : SDO=SD[5];

6'd24 : SDO=SD[4];

6'd25 : SDO=SD[3];

6'd26 : SDO=SD[2];

6'd27 : SDO=SD[1];

6'd28 : SDO=SD[0];

6'd29 : SDO=1'b1;//ACK

//stop

6'd30 : begin SDO=1'b0; S CLK=1'b0; ACK3=I2C_SDA T; end 6'd31 : SCLK=1'b1;

6'd32 : begin SDO=1'b1; END=1; end

endcase

end

endmodule

音量调节模块

程序代码

`define OUT_BIT 9

module keytr (

key,

ON,

clock,

KEYON,

counter

);

input key;

output ON;

output KEYON;

input clock;

output [9:0]counter;

reg [9:0]counter;

reg KEYON;

wire ON=((counter[`OUT_BIT]==1) && (key==0))?0:1;

always @(negedge ON or posedge clock) begin

if (!ON)

counter=0;

else if (counter[`OUT_BIT]==0)

counter=counter+1;

end

always @(posedge clock) begin

if ((counter>=1) && (counter <5))

KEYON=0;

else

KEYON=1;

end

endmodule

总结

卡拉ok机是我们日常生活中非常常见的东西,以前去唱歌都不知道其中的原理和奥妙。如今在实验室通过ED2实验板自制一个卡拉OK机,发现了其中的原理之后,突然觉得再复杂的东西也可以通过一些简单的东西来实现。这个可设让我体会到了自己动手的乐趣,同时也对生活中太多的未知的事物充满了兴趣。

相关文档
相关文档 最新文档