題記:這是一篇學生時代的學習記錄隨筆,現在發送出來大家參考參考,同時也測試一下Live Writer寫博客的便利,直接復制粘貼即可,很方便。
這個實驗可以充分學習FPGA 以及SOPC的利用,做成一個具有很復雜程度的作品。學習到很多平時不能接觸的知識。
這個實驗要用到的硬件有:
SD卡一張
DE2開發板
320*240的TFT液晶:SSD1289
一個無源喇叭
本實驗難度比較大,主要涉及了很多知識!而且都不是平時我們接觸過的知識。
本實驗主要包含了幾個大的部分:
1. 音樂的播放驅動
2. SSD1289 TFT液晶驅動
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達到8M FLASH達到4M因此能容納8首左右的8KHZ采樣率8位的音頻。而BMP圖片采取邊讀SD卡邊播放的方式,從而實現了整個音樂相冊的實驗!
最后輕松下,測試一下直接發送圖片。還是很方便