ZZL520 发表于 2010-5-6 09:26:13

( 原创 ) 基于DE2开发板 NIOS II处理器 使用 PWM波 播放音乐的 数码音乐相册

在文件最后面有效果视频,手机拍的不是很清晰



这个实验可以充分学习FPGA以及SOPC的利用,做成一个具有很复杂程度的作品。学习到很多平时不能接触的知识。
这个实验要用到的硬件有:
SD卡一张
DE2开发板
320*240的TFT液晶:SSD1289
一个无源喇叭

本实验难度比较大,主要涉及了很多知识!而且都不是平时我们接触过的知识。
本实验主要包含了几个大的部分:
1.        音乐的播放驱动
2.        SSD1289TFT液晶驱动
3.        SD卡读取驱动
4.        FAT32文件系统的初步认识,实现根目录下的读取
5.        整个FPGA里面NIOS模块和外部模块的链接.
6.        WAV文件的制作,以及处理成不同采样率,不同位数的音频数据
7.        BMP图片的制作,以及在不同处理器架构下的处理,在SD卡存储方式和取模出来的数据的不同

现在分别介绍不同模块的实现问题:
一.        首先最开始要实现的是音频数据的播放
音频具有很多编码,WAV,MP3等等,本实验有两个方法
现音频的播放:基于WM8731音频芯片的播放,以及直接用FPGA写出PWM控制器来播放。
                首先介绍的是音频知识
                我们平时接触到的最多的音频既是MP3音频,它是一种高度压缩的音频数据,因此播放它需要一块专门的集成高速DSP处理器音频芯片解码。比如VS1003B芯片,是最常用的音频编解码芯片,由于价格昂贵,所以我没有使用这种芯片,转而使用WAV文件来播放。WAV是一种原始的音频数据文件,相当于电压值的AD数据。
转换WAV文件又要使用到音频编译的专门软件COOLEDIT软件
这款软件能实现音频文件的各种转换,可以转换成WAV各种采样率。
                现在介绍的是WM831音频芯片的使用以及播放:
WM8731是一款具有高音频带宽的芯片,可以播放速率从8KHZ到96KHZ的WAV文件,由于它内部没有集成高速DSP解码处理器核,所以只能播放的是WAV文件。WM8731是一款高速的AD转换器。支持16位音频到32位音频的播放,它的配置采用的是I2C配置方式。在我这个项目中我实现的配置是,从模式16位宽。32KHZ采样率。这里不得不说道的是WAV文件16位数据和8位数据有很大区别。16位文件包含了正负音频电压值,而8位音频数据只有正电压。在最开始一直没理解到,所以犯了很多错误。
WM8731也是一款比较难操作的音频芯片,在具体实现的时候我用了两个高速缓存来实现数据的传送,数据是由NIOS在SD卡中以FAT32格式化下,以根目录的存取方式取出来缓冲,在传送,以WM8731转换完一个音频数据时产生的高电平来实现外部中断送值。具体操作这里就不做详细介绍了。
第二种方法,就是直接用VERLIOG代码生成一个PWM控制器,从NIOS中接收数据来实现PWM播放音乐.这种方法比较新颖。
由于,耳机,以及无源喇叭是惯性器件,PWM波作用在其上就等同相等的电压值作用在上面,从而实现类似AD的播放。这种用VERLIOG写出的PWM播放机的缺点就是在FPGA的管脚上不能出现负电压,所以只能播放的是8位数据的音频电压值。,我的PWM播放思想是,严格按照采样率来送电压值,送值时间由NIOS内部定时器来实现。PWM控制模块只负责把数据转换成PWM波就可以了。
这也是一个比较难理解的过程,需要细细揣摩!
               第三种方法,直接使用DA芯片转换出电压值,从而播放出音乐。最开始我选择了DAC0832电流型DA芯片来播放音乐,结果失败了,后来仔细研究才知道,原来DAC0832类型很多,,增强,快速,普通等等。我使用的是普通的0832芯片,电压转换时间是150多US,联最基本的8KHZ的采样率音频速度都不能达到,所以这个方案不能实施。但是可以换增强型快速的DAC0832芯片来做,转换时间快到只需要10多US就可以转换完。(这个理论上能成功,但是我没有芯片所以没实施。)DAC0832最大的缺点是电流型,所以还要通过运放转换成电压。最好的方法是选用TLC5615电压型DA芯片,转换速度也快,SPI接口很好操作。

二.        SD卡的驱动
DE2上有SD卡接口,由于NIOS不带硬件驱动SD卡,所以
选取的是IO口模拟SPI来对SD卡操作。NIOS组件里面也带有硬件SPI发送器,由于现在这个IP技术不成熟,一次只能传送8位的数据,因此,不满足SD卡SPI驱动要求,所以我选用的是IO口模拟SPI操作SD卡,在模拟的时候,我用程序写的是高速的模拟SPI,不用循环,比一般采用循环模拟SPI快了一倍,因此为我后面大量BMP图片数据,以及WAV音频数据读取提供了有利的基础。
                SD卡的驱动也很复杂,要严格按照SD卡的时序来给它送值,而且还有很多补偿时钟这些,但是必须把SD卡底层操作函数百分百写对,才能在后续的FAT32文件系统下的读取提供有利的支持。

三.        FAT32文件系统的认识
FAT32文件系统时现在主流电脑里面使用的最多的文件系统,
我的BMP图片,WAV音频数据都是在电脑上以FAT32文件系统架构下拷贝进去的,因此,这个实验必须了解文件系统。
                FAT32文件系统主要由三个大区组成:MBR区(很多SD卡没有MBR区,只要0扇区第一个字节不是EB打头就不存在MBR区)。
第二个区是BPB区。内部包含了整个FAT32文件系统的信息,包括了数据区的开始区域,以及FAT表的扇区。
                第三个区域就是数据区,内部包含了各个文件的真实数据。
数据的链表在FAT表里面。
                由于实现FAT32文件系统非常之复杂,因此,我实现的FAT32文件系统只能简单的读取根目录下的文件信息,所以,BMP图片以及WAV音频只能存在根目录下,不能建文件夹!

五,TFT液晶的认识
                TFT液晶是一种很常用的廉价的液晶,TFT液晶分为高,中,低很多档次。我使用的TFT液晶是一款支持6万色的的液晶模块。
3.2寸320*240 的SSD1289,最开始使用的是ILI9230(2.8寸TFT液晶)。
                TFT液晶和传统的点阵型12864,1602等有很大的不同。操作方式也很不同。SSD1289其实是液晶的驱动芯片。只需找到SSD1289的芯片手册,即可实现液晶驱动(难度其实非常大,SSD1289主控芯片内部有256个寄存器,其中常用需要初始化配置的寄存器多大40多个)。由于以前有过写TFT液晶的经验,所以操作起来还是比较快。只要严格的按照控制芯片的手册时序来写驱动,操作起来也不是非常困难。
                SSD1289支持的是RGB色的565色的BMP图片。因此,需要在电脑上转换出BMP图片。由于BMP图片一张16色240*320的图片都多达150K,相册图片又很大,所以不可能在NIOS内部用数组形式存放。必须在SD卡中存放。因此,我们又必须认识BMP图片在SD卡中的存储格式。
                SSD1289TFT液晶上显示汉字时候要使用到专用LCD取模软件,取出相应的字模到LCD上显示,因为液晶相册要使用到很多文字提示信息,所以要用液晶显示汉字。

六.        BMP图片的制作
BMP图片是一种高真彩色的位图,没有经过压缩的处理,因此数据量还是比较大。数据位宽代表的是色彩色RGB的数据位,RGB数据位越宽,则色彩越逼真。从1位到32位各不相同。32位是最高色彩的真彩色,含有8位的透明色。24位的RGB色。
在这里不得不说我在制作过程中遇到的困难。16位色位图的565模式和555模式,BMP图片在SD卡中储存是以555模式储存。而且是以一张图片的左下角开始扫描储存,这是SD卡储存方式,而我们取模出来的数据时565数据,而且是从左上角开始储存,最开始我是以取模方式做的图片显示,所以直接移植到SD卡方式显示会出现很大的问题,最后我才发现了上述问题。
七.制作适合TFT液晶使用的BMP图片
                制作BMP图片会使用到I mage2LCD软件,美图秀秀软件,以及GIF动画分离软件。
                首先,美图秀秀软件用来裁剪你选中的图片到你所需要的尺寸。因为一般电脑上的图片远远大于240*320的大小。
                做成了240*320的图片后,还有一个很重要的问题要考虑,那就是图片的位数,电脑上的图片都是24位真彩色的图片,所以,如果要使用软件解码也能实现,但是24位数据量太大,所以采用了IMAGE软件来转换成16色的BMP图片然后存储到SD卡里面。
                GIF动画分离软件
                是一款专门用于分离动画,以及AVI视频的软件,可以把这些视频信息分离成一帧一帧的图片,然后再按照上面的步凑做出BMP图片,放到SD卡里面高速读取显示只要满足播放时间间隔就可以做出动画。这个是一个附加功能!非常好玩!

八,整个系统的构建。
                首先在FPGA里面新建出符合本实验要求的工程,在SOPC内部添加出各种接口以及IO口。然后,格式化FAT32文件系统,接下来开始读取SD卡内部的WAV以及BMP信息,我测算过由于我的读取速度在8MS就能读取完一个扇区的数据量,因此边读边播放显示时间要求比较严,因此我采用的是先把WAV文件全部读取出来存放好,DE2上板载SDRAM达到8MFLASH达到4M因此能容纳8首左右的8KHZ采样率8位的音频。而BMP图片采取边读SD卡边播放的方式,从而实现了整个音乐相册的实验!!!!!
                       
视频文件ourdev_551926.rar(文件大小:1.31M) (原文件名:音乐相册.rar)


版本2音乐相册ourdev_551927.rar(文件大小:4.78M) (原文件名:音乐相册版本2.rar)

SD卡液晶 做的小动画!ourdev_551934.avi视频文件大小:1.50M) (原文件名:MOV0009A.avi)

tear086 发表于 2010-5-6 11:21:53

产品说明书呀?

eworker 发表于 2010-5-6 11:23:59

实验说明书?

1181zjf 发表于 2010-5-6 11:39:13

等资料。

bone 发表于 2010-5-6 11:53:57

等广告……

avic 发表于 2010-5-6 12:18:50

呵呵,写的还不错,就是没源代码

shotstar 发表于 2010-5-6 13:06:17

能做出来就好了啊

ZZL520 发表于 2010-5-6 14:01:27

做出来了的!NIOS里面的源代码不是工程   代码比较长不好发的!!!!

ZZL520 发表于 2010-5-6 14:04:57

首先 发一个以SSD1289作为主控芯片的 320*240驱动代码


/*
* 作者:林杰
* 文件名称:SSD1289驱动模块
* 创建日期:2010年3月28日
* 最后修改:2010年3月29日
* 文件功能:实现SSD1289液晶模块的驱动函数
*          内有单点写汉字,多点写汉字,显示图片等函数
*/

#ifndef SSD1289_QUDONG_H_
#define SSD1289_QUDONG_H_


#define uchar unsigned char
#define uintunsigned int

void out_init()
{
    CS_H;
    RS_H;
    WR_H;
    RD_H;
    RST_H;
}

//刷屏开始函数
void LCD_write_start()
{
    RS_L;
    WR_L;
    LCD_DATA=0x0022;//写数据的寄存器地址
    CS_L;
    CS_H;
    RS_H;
}

//刷屏结束函数
void LCD_end()
{
    CS_H;
    WR_H;
}

//刷屏数据函数
void LCD_write_data(uint data)
{
    LCD_DATA=data;
    CS_L;
    CS_H;
}

//写寄存器函数
void LCD_write_reg(unsigned int index,unsigned int data)
{
    RS_L;
    WR_L;
    CS_L;
    LCD_DATA=index;
    CS_H;
    RS_H;
    CS_L;
    LCD_DATA=data;
    CS_H;
    WR_H;
}

/**********************************************
*   函数名称:SSD1289初始化函数               *
*   隶属模块:SSD1289_qudong模块            *                           
*   参数说明:无
*   返回参数:无                               *
***********************************************/
void LCD_init()
{
    out_init();      //低电平复位
    RST_L;
    usleep(10000);
    RST_H;
    usleep(10000);
   
    LCD_write_reg(0x0000,0x0001);//usleep(10000); //打开晶振
    LCD_write_reg(0x0003,0xA8A4); //   usleep(10000);   //0xA8A4
    LCD_write_reg(0x000C,0x0000);//usleep(10000);   
    LCD_write_reg(0x000D,0x080C);//usleep(10000);   
    LCD_write_reg(0x000E,0x2B00);//usleep(10000);   
    LCD_write_reg(0x001E,0x00B0);//usleep(10000);   
    LCD_write_reg(0x0001,0x2B3F);//usleep(10000);   //驱动输出控制320*240 0x6B3F
    LCD_write_reg(0x0002,0x0600);//usleep(10000);
   
    LCD_write_reg(0x0010,0x0000);//usleep(10000);
    LCD_write_reg(0x0011,0x6070);//usleep(10000);      //0x4030         //定义数据格式 16位色
    LCD_write_reg(0x0005,0x0000);//usleep(10000);
    LCD_write_reg(0x0006,0x0000);//usleep(10000);
    LCD_write_reg(0x0016,0xEF1C);//usleep(10000);
    LCD_write_reg(0x0017,0x0003); //   usleep(10000);
    LCD_write_reg(0x0007,0x0233);//usleep(10000);      //0x0233      
    LCD_write_reg(0x000B,0x0000);//usleep(10000);
    LCD_write_reg(0x000F,0x0000);//usleep(10000);      //扫描开始地址
    LCD_write_reg(0x0041,0x0000);//usleep(10000);
    LCD_write_reg(0x0042,0x0000);//usleep(10000);
    LCD_write_reg(0x0048,0x0000);//usleep(10000);
    LCD_write_reg(0x0049,0x013F); //   usleep(10000);
    LCD_write_reg(0x004A,0x0000);//usleep(10000);
   
    LCD_write_reg(0x004B,0x0000);//usleep(10000);
    LCD_write_reg(0x0044,0xEF00);//usleep(10000);
    LCD_write_reg(0x0045,0x0000);//usleep(10000);
    LCD_write_reg(0x0046,0x013F);//usleep(10000);
    LCD_write_reg(0x0030,0x0707);//usleep(10000);
    LCD_write_reg(0x0031,0x0204);//usleep(10000);
    LCD_write_reg(0x0032,0x0204);//usleep(10000);
    LCD_write_reg(0x0033,0x0502);//usleep(10000);
    LCD_write_reg(0x0034,0x0507);//usleep(10000);
    LCD_write_reg(0x0035,0x0204); //   usleep(10000);
    LCD_write_reg(0x0036,0x0204); //   usleep(10000);
    LCD_write_reg(0x0037,0x0502);//usleep(10000);
    LCD_write_reg(0x003A,0x0302);//usleep(10000);
    LCD_write_reg(0x003B,0x0302);//usleep(10000);
    LCD_write_reg(0x0023,0x0000);//usleep(10000);
    LCD_write_reg(0x0024,0x0000);//usleep(10000);
    LCD_write_reg(0x0025,0x8000);//usleep(10000);
    LCD_write_reg(0x004e,0);      //行首址0
    LCD_write_reg(0x004f,0);      //列首址0   
}

void LCD_SetXY(unsigned int x, unsigned int y)
{
    LCD_write_reg(0x004f,x); //设置行显示地址
    LCD_write_reg(0x004e,y); //设置列显示地址
}

//4e,4f寄存器分别表示区域的横坐标起止地址,45,46寄存器分别表纵坐标的起止地址
//此函数设置显示区域的位置
void LCD_SetWindow(uint startX,uint startY,uint endX,uint endY)
{
    LCD_SetXY(startX,startY);
    LCD_write_reg(0x004e,startX);
    LCD_write_reg(0x004f,startY);
    LCD_write_reg(0x0045,endX);
    LCD_write_reg(0x0046,endY);   
}

//4e,4f寄存器分别表示区域的横坐标起止地址,45,46寄存器分别表纵坐标的起止地址
//此函数设置显示为全屏函数
void LCD_SetWindowToFullScreen()
{
    LCD_SetXY(0,0);
    LCD_write_reg(0x004e,0x0000);
    LCD_write_reg(0x004f,0x0000);
    LCD_write_reg(0x0045,0x00ef);
    LCD_write_reg(0x0046,0x013f);      
}

//清屏函数
void LCD_ClearScreen(uint color)
{
    unsigned long n = 240*320;
    LCD_SetWindowToFullScreen();
    LCD_write_start();
    while(n--)
      LCD_write_data(color);
    LCD_end();
}

//测试函数,测试屏的好坏
void LCD_test()
{
    unsigned int i,j;
    LCD_SetWindowToFullScreen();//设置为全屏显示
    LCD_write_start();
    for(i=0;i<320;i++)
      for(j=0;j<240;j++)
      {
            if(i>279)      LCD_write_data(0xffff);
            else if(i>239) LCD_write_data(0x001f);
            else if(i>199) LCD_write_data(0x07e0);
            else if(i>159) LCD_write_data(0x07ff);
            else if(i>119) LCD_write_data(0xf800);
            else if(i>79)LCD_write_data(0xf81f);
            else if(i>39)LCD_write_data(0xffe0);
            else         LCD_write_data(0xffff);
      }
    LCD_end();
}

/**********************************************
*   函数名称:图片显示函数 此函数只能显示565格式的BMP图片
*         对于SD卡中的555格式的图片无效    *
*   隶属模块:SSD1289_qudong模块            *                           
*   参数说明:x->横坐标                     *
*         y->纵坐标                     *
*         xSize->图片宽度               *
*         ySize->图片的高度               *
*         code->存放图片首地址             *
*   返回参数:无                               *
***********************************************/
void LCD_Write_Picture(uchar x,uchar y,uchar xSize,uint ySize,uchar code[])
{
    unsigned int i;
    unsigned char j;
    unsigned long m=54;
    unsigned int color;
    for(i=0;i<ySize;i++)
    {
       LCD_SetWindow(x,y+i,x+xSize-1,y+i);
       LCD_write_start();
       for(j=0;j<xSize;j++)
       {
          color=code;
          color=color<<8;
          color=color|code;
          LCD_write_data(color);
       }
       LCD_end();
   }
}

/**********************************************
*   函数名称:汉字显示函数                  *
*   隶属模块:SSD1289_qudong模块                           
*   参数说明:x->横坐标                     *
*         y->纵坐标                     *
*         xNum->字符一行的点阵数/8      *
*         yNum->字符行数;如16点阵字符=16 *
*         code->存放汉字首地址             *
*         front->字体色                   *
*         back->背景色                  *
*   出口参数:无                               *
* 此函数只能显示横竖都为8的整数倍,且横竖坐标都必须相等*
***********************************************/
void LCD_Write_Chinese(uchar x,uint y,uchar xNum,uchar yNum,uchar code[],uint front,uint back)
{
    unsigned char i,j,k;
    unsigned char data,data_buffer;

    for(i=0;i<yNum;i++)
    {
       LCD_SetWindow(x,y+i,x+(xNum-1),y+i);//设置显示区域
       LCD_write_start();
       for(j=0;j<(xNum/8);j++)
       {
          data=code[(i*(yNum/8))+j];
          for(k=0;k<8;k++)
          {
             data_buffer=data&0x80;                        
             if(data_buffer==0x00)
             {
                LCD_write_data(back);                //背景色
             }                                       
             else
             {
                LCD_write_data(front);   
             }
             data<<=1;                           //左移一位
         }
         }
      }
   LCD_end();
}

/**********************************************
*   函数名称:矩形函数可以用于画直线,限于水平和竖直的直线
*   隶属模块:SSD1289_qudong模块                           
*   参数说明:x->横坐标                     *
*         y->纵坐标                     *
*         xNum->矩形宽度                  *
*         yNum->矩形高度                  *   
*         color->矩形填充颜色            *
*   出口参数:无                               *
***********************************************/
void LCD_Write_juxing(uchar x,uchar y,uchar xSize,uint ySize,uint color)
{
    unsigned int i;
    unsigned char j;
    for(i=0;i<ySize;i++)
    {
       LCD_SetWindow(x,y+i,x+xSize-1,y+i);
       LCD_write_start();
       for(j=0;j<xSize;j++)
          LCD_write_data(color);
       LCD_end();
   }
}

/**********************************************
*   函数名称:汉字,字符显示函数                *
*   隶属模块:SSD1289_qudong模块                           
*   参数说明:x->横坐标                     *
*         y->纵坐标                     *
*         xNum->字符一行的点阵数/8       *
*         yNum->字符行数;                *
*         code->存放汉字首地址             *
*         front->字体色                   *
*         back->背景色                  *
*   出口参数:无                               *
* 此函数能显示任意大小的字体                  *
***********************************************/
void LCD_Write_Chinese_1(uchar x,uint y,uchar xNum,uchar yNum,uchar *data,uint front,uint back)
{
    unsigned char i,j,k;
    unsigned char data_buf,data_send;
   
    for(i=0;i<yNum;i++)
    {
       LCD_SetWindow(x,y+i,x+(xNum-1),y+i);//设置显示区域
       LCD_write_start();
       for(j=0;j<xNum;j++)
       {
          data_buf=*data++;
          for(k=0;k<8;k++)
          {
             data_send=data_buf&0x80;                        
             if(data_send==0x00)
             {
                LCD_write_data(back);                //背景色
             }                                       
             else
             {
                LCD_write_data(front);   
             }
             data_buf<<=1;                           //左移一位
         }
         }
      }
   LCD_end();
}

/**********************************************
*   函数名称:汉字串,字符串显示函数横向写字      *
*   隶属模块:SSD1289_qudong模块                           
*   参数说明:cout->汉字或者字符串显示个数
*         x->横坐标                     *
*         y->纵坐标                     *
*         xNum->字符一行的点阵数/8       *
*         yNum->字符行数;                *
*         code->存放汉字首地址             *
*         front->字体色                   *
*         back->背景色                  *
*   出口参数:无                               *
* 此函数能显示任意大小的字体                  *
***********************************************/
void LCD_Write_Chinese_x(uchar cout,uchar x,uint y,uchar xNum,uchar yNum,uchar *data,uint front,uint back)
{
    unsigned char i;
    for(i=0;i<cout;i++)
      LCD_Write_Chinese_1(x+xNum*8*i,y,xNum,yNum,data+i*xNum*yNum,front,back);
}

/**********************************************
*   函数名称:汉字串,字符串显示函数纵向写字    *
*   隶属模块:SSD1289_qudong模块                           
*   参数说明:cout->汉字或者字符串显示个数
*         x->横坐标                     *
*         y->纵坐标                     *
*         xNum->字符一行的点阵数/8 注意不是的X轴有多长,是指的X轴是8的多少倍数
*         LCD取模软件是指的以X轴为开始以一个字节一个字节的取模,不足8位数据则补0      *
*         yNum->字符行数;                *
*         code->存放汉字首地址             *
*         front->字体色                   *
*         back->背景色                  *
*   出口参数:无                               *
* 此函数能显示任意大小的字体                  *
***********************************************/
void LCD_Write_Chinese_y(uchar cout,uchar x,uint y,uchar xNum,uchar yNum,uchar *data,uint front,uint back)
{
    unsigned char i;
    for(i=0;i<cout;i++)
      LCD_Write_Chinese_1(x,y+yNum*i,xNum,yNum,data+i*xNum*yNum,front,back);
}

/**********************************************
*   函数名称:SD卡图片显示函数 此函数处理SD卡里面555模式的
*         BMP图片,转换成565模式的BMP图片显示
*         TFT液晶支持的是565模式          *
*   隶属模块:SSD1289_qudong模块            *                           
*   参数说明:x->横坐标                     *
*         y->纵坐标                     *
*         xSize->图片宽度               *
*         ySize->图片的高度               *
*         code->存放图片首地址             *
*   返回参数:无                               *
***********************************************/
void LCD_Write_Picture_555(uchar x,uchar y,uchar xSize,uint ySize,uchar code[])
{
    unsigned int i;
    unsigned char j;
    unsigned long m=54;
    unsigned int color,color1,color2,color3;
    for(i=0;i<ySize;i++)
    {
       LCD_SetWindow(x,y+i,x+xSize-1,y+i);
       LCD_write_start();
       for(j=0;j<xSize;j++) //进行SD卡555模式转换565模式
       {
          color1=code;
          color=code;
          color=color<<9;             //取出R颜色
          color2=(color1<<1)&0x01e0;//取出G颜色
          color3=color1&0x001f;       //取出B颜色
          color=color|color3|color2;//组合成565模式的色彩
          LCD_write_data(color);
       }
       LCD_end();
   }
}

#endif /*SSD1289_QUDONG_H_*/

zbjzxc 发表于 2010-5-6 15:20:06

记号~~

cwfboy 发表于 2010-5-6 15:35:45

mark

ZZL520 发表于 2010-5-6 15:40:46

回复【9楼】zbjzxc
记号~~
-----------------------------------------------------------------------

9楼的朋友在我做这个实验的时候我也在网上收索了一些资料,其中也看见了你用51做的数码相册!但是资料好少呀!呵呵!

bad_fpga 发表于 2010-5-6 15:43:40

无图无真相。。。期待图片

ZZL520 发表于 2010-5-6 15:46:55

可不可以上传视频文件我录了视频!!!

ZZL520 发表于 2010-5-6 18:32:51

视频传上来了!这下大家可以看看啦!手机拍的效果不是很好!   音乐是我直接用PWM波播放的

proguy 发表于 2010-5-6 19:29:10

楼主给我发到邮箱吧!邮箱:baipei0502@126.com
顶一下……
要全面的资料
先谢谢楼主了。很不错啊……

caozhu 发表于 2010-5-6 23:42:50

牛人啊

281229961 发表于 2010-5-7 08:15:04

牛!

eworker 发表于 2010-5-7 08:32:07

回复【15楼】proguy
楼主给我发到邮箱吧!邮箱:baipei0502@126.com
顶一下……
要全面的资料
先谢谢楼主了。很不错啊……
-----------------------------------------------------------------------

yemingxp 发表于 2010-5-7 09:16:28

就是楼主那板子没两人搞得到。。

ZZL520 发表于 2010-5-7 09:22:13

其实开发板不是主要原因!这个工程很好移植到低端的FPGA板子中,只要有SD卡 插槽还自备一个 TFT液晶   一个无缘喇叭   就可以了!

ZZL520 发表于 2010-5-7 09:25:52

这个实验最主要的是要实现MP3音乐用PWM波播放!如果有意研究PWM播放WAV音乐文件的   给我联系   
我的QQ:409359800

akuei2 发表于 2010-5-9 19:44:56

呵呵,C语言果然是软的王道!
很感谢自己曾学习c语言

xlwxdl1 发表于 2010-5-9 22:53:55

我的液晶上有sd插槽,只是主控芯片不一样,有空试试,看看能不能跑的起来

ZZL520 发表于 2010-5-9 22:56:18

哦!你使用什么CPU呢?   主要是音乐难做!而且数码相册你CPU速度不快的话!TFT点阵多了 会使一张图片刷屏很慢!而且读取SD卡会很慢!!!!!!!!!!!更不用说音乐了!!!!!!!!!所以做这个实验速度很重要!!!!!

xlwxdl1 发表于 2010-5-9 23:13:46

楼主,我加你qq了,麻烦你把工程传一份给我吧。想仔细研究一下文件系统

damoplus 发表于 2010-5-10 01:20:06

记号学习,正琢磨如何升级手上的电子相册呢

liuying530712 发表于 2010-5-12 17:14:00

高手!!!!!顶!!!!!!
完整源代码能否也给我发个   daoyingliu@yahoo.cn
谢谢了

cwfboy 发表于 2010-5-12 18:58:22

求源码!!!!   312862340@qq.com         
谢谢!!!!

ljt8015 发表于 2010-5-12 19:12:06

mark

gpzdc986 发表于 2010-5-12 19:35:16

mark

guke 发表于 2010-5-13 15:10:40

无图无真相。。。期待图片

ZZL520 发表于 2010-5-13 18:54:26

上面有视频呀!!!!怎么又无图无真相了呀!!!!!

eworker 发表于 2010-5-13 19:13:02

回复【31楼】guke
无图无真相。。。期待图片
-----------------------------------------------------------------------

是期待源码?

zhangjn 发表于 2010-7-21 14:25:25

楼主啊,能不能发一份你这个项目的整个工程学习一下呀?非常感谢,我的邮箱是423586251@qq.com

wanwzy 发表于 2010-7-22 19:14:34

mark

hunningtu 发表于 2012-1-1 22:03:59

mark

miaocldy 发表于 2012-1-18 13:09:18

我想了解sd的操作,怎么完成的?谢谢!
页: [1]
查看完整版本: ( 原创 ) 基于DE2开发板 NIOS II处理器 使用 PWM波 播放音乐的 数码音乐相册