综合电子系统设计实验报告
项目名称:FFT-----IP的使用
一、实验原理:
1、系统设计结果框图:
Mzl_05_12864模拟信号输入C8051F020频谱数据选择输入8位FFT模8位采样输出FIFO_real8位实部8位虚部DataSelFIFO_imagFFT8位数据RAM6位指数转换成8位指数F P G A
2、单片机(C8051F020)模块
(1)采集模拟信号
①模拟信号从单片机引脚(P1.1)输入,基准电压VREF=2.46V,允许输入的模拟信号幅值范围为:0~2.46V,超过这个范围的电压值将不能进行正常的AD转换。
②采用定时器3溢出驱动ADC1将输入信号转换成8位数据,单片机的系统时钟为24MHz,设置定时器3:TMR3RLH=(65535-750)/256,TMR3RLL=(65535-750)%6,即对系统时钟进行750分频,转换频率为32KHz,使采到的64点数据包含1KHz的正弦信号完成的两个周期。
③采样得到的64点8位数据须进行右移一位处理(即数据除以2),这是因为FFT处理的数据类型为有符号型,而单片机AD转换后的数据为无符号型,为了使数据类型匹配,必须使单片机送给FFT的数据为正,即最高位为0。
④将处理后的64点数据存入数组Result1[64],以提供给FPGA进行FFT变换。 ⑤此系统能处理的模拟信号频率范带宽为:0.5KHz~~16KHz。
(2)计算频率模长
①经过FFT处理后的数据是各频率点的8位有符号型实部、虚部以及指数。
②从FPGA的FIFO模块中读出64点频率数据,各点的实部、虚部、指数分别存入
Result2[3]中,并算出各点的真正幅值存入数组Result2[64]中。
③模长的计算公式:Fx=sqrt(data_real^2+data_img^2)*exp(-data_exp)*2。 ④各频率点真正幅值:A0=F0/N,A1=2×F1/N,A2=2×F2/N……
(3)控制液晶显示
①将Result2[64]中的数据用3位十进制数显示在液晶上,每位字符尺寸为8×16。 ②数字的寻址方式: 0~9的字模为
Shuzi[]= {/*0*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, /*1*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*2*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, /*3*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, /*4*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, /*5*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, /*6*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, /*7*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, /*8*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, /*9*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00 };
调用函数为:
/*********写入字符8x16*********/
void LCD_Char(unsigned char row,char colume,uint8 num,uint8 *pword) {
unsigned char page= row;
//确定页地址
unsigned char col_high=colume>>4;
unsigned char col_low =colume&0x0f; //设置列地址 unsigned char i;
Wr_com(LCD_Page+page); Wr_com(LCD_High+col_high); Wr_com(LCD_Low+col_low);
for(i=0;i<8;i++)
}
//显示字符的上半部分
//num为需要显示的数据,则地址便从该数据开始
{ Wr_dat(*(pword+16*num+i));
Wr_com(LCD_Page+page+1); Wr_com(LCD_High+col_high); Wr_com(LCD_Low+col_low); for(i=0;i<8;i++) } }
/***********写入数字函数**************/
void LCD_Shuzi(unsigned char row,char colume,uint8 dat) {LCD_Char(row,colume,dat,Shuzi);}
//显示字符的下半部分
{ Wr_dat(*(pword+16*num+8+i));
3、FPGA模块
(1)FFT处理模块
①FFT处理器模块采用缓冲突发数据流结构的信号,在系统复位信号(rest_n)变为低电平后,数据源将sink_ready信号置高电平,表明有能力接受输入信号,同时sink_sop信号置高电平,表示输入模w块开始,当完全载入输入模块时,sink_eop置高电平,表示FFT不再接受其他输入数据,并开始计算输入数据的变换结果。
②sink_sop和sink_eop信号由sopeop模块提供,由FPGA提供的系统时钟,sopeop能周期性提供间隔64点的sink_sop和sink_eop信号,使得FFT能进行正常的快速傅里叶变换。
③经过FFT处理后的数据为8位实部、8位虚部和6位指数,实部和虚部分别写入FIFO_real和FIFO_imag中,指数直接变换为8位数据。
(2)RAM模块
为了解决单片机采用的时钟和FPGA的快速频率周期不匹配的问题,特在FFT之前假如RAM模块,将单片机采集得到的64点8位数据存入RAM中,然后用系统时钟将RAM中的数据读出,发送给FFT进行傅里叶变换。
(3)FIFO和数据选择模块
由于FFT的计算频率(本实验采用50MHZ系统时钟4分频)远大于单片机计算频率值的(单片机指令周期为2MHz,计算一次模长需要好多条指令),所以先将FFT输出的实部和虚部