卡拉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机,发现了其中的原理之后,突然觉得再复杂的东西也可以通过一些简单的东西来实现。这个可设让我体会到了自己动手的乐趣,同时也对生活中太多的未知的事物充满了兴趣。