(原創) 如何設計一個SD卡Wav Player? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)

Abstract
在上一篇blog,我們學會如何開發一個硬體Controller,並加上軟體API,讓Nios II軟體能順利地控制硬體,並且讓七段顯示器從0屬到100。或許由同學會問:『要讓七段顯示器從0數到100,我用純硬體的方式開發,全部的Verilog程式碼不超過50行,為什麼要大費周章的使用軟硬體設計的方式呢?還要多學了SOPC Builder、Avalon Bus、Nios II,增加學習曲線,執行速度也比純硬體慢,FPGA所使用的資源(LE)也比純硬體多很多!!』

本Lab是軟硬體設計的精典範例,你將會感受出軟硬體設計的威力。

Introduction
使用環境:Quartus II 8.1 + Nios II EDS 8.1 + DE2-70 (Cyclone II EP2C70F896C6N)

這4篇原本是設計在一起的lab,適合初學者從0開始慢慢熟悉Quartus II、SOPC Builder、Nios II EDS、Avalon Bus Slave、Avalon Bus Master。

(原創) 如何自己用SOPC Builder建立一個能在DE2-70上跑μC/OS-II的Nios II系統? (SOC) (Quartus II) (SOPC Builder) (Nios II) (μC/OS-II) (DE2-70)
(原創) 如何設計一個七段顯示器Controller? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)
(原創) 如何設計一個SD卡Wav Player? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)

(本範例取自Terasic範例光碟,並非我個人設計,我只是稍加修改適合教學)

sdplayer00 

系統架構圖

sdplayer01

硬體部分
lab3_files.7z的DE2_70_SD_Card_Audio_Player複製到c:\DE2-70下

Step 1:
加入I2C

新增了i2c_sclk與i2c_sdat

sdplayer15

其實只是PIO

sdplayer16

sdplayer02

sdplayer03

Step 2:
加入SDCard

(demo如何插入SD卡)

sdplayer17

其實只是PIO

sdplayer18

sdplayer04

sdplayer05

sdplayer06

sdplayer07

sdplayer08

sdplayer09

sdplayer10

sdplayer11

Step 3:
加入Audio Controller

sdplayer20

Altera並沒有內建Audio Controller,目前用的controller是由Terasic所提供,注意他的clk是18MHz,與其他周邊都不一樣

sdplayer19

Audio Controller含有source code可供研究。

sdplayer21

Step 4:
加入7段顯示器

sdplayer22

Altera沒有內建7段顯示器Controller,,目前用的controller是由Terasic所提供,其實這個controller與(原創) 如何設計一個七段顯示器Controller? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)我們自己寫的controller是完全一樣的。

sdplayer23

sdplayer24

Step 5:
SOPC Builder Generate
Quartus II編譯
Programmer燒入FPGA

軟體部分

sdplayer25

sdplayer35

sdplayer26

Step 6:
Import DE2_70_SD_Card_Audio_Player與DE2_70_SD_Card_Audio_Player_syslib_0

sdplayer27

sdplayer28

sdplayer29

sdplayer30

sdplayer31

sdplayer32

用相同的方法import DE2_70_SD_Card_Audio_Player_syslib_0。

Step 7:
修改main.c

main.c / C

265行與270行改成

bSuccess = Fat_FileOpen(&gWavePlay.hFile, pFilename);
if (!bSuccess)
DEMO_PRINTF(
"wave file open fail.\n");

if (bSuccess) {
bSuccess
= Fat_FileRead(&gWavePlay.hFile, gWavePlay.szBuf, WAVE_BUF_SIZE);

Fat_FileOpen()與Fat_FileRead()是FatFileSystem.h所提供的API,負責讀取SD卡中的wav檔。

Step 8:
將gcc編譯改成release模式

這是本實驗一個大trick,很多人最後結果失敗,都因為少了這個步驟,Altera與Terasic都沒有提到這點。

sdplayer33

sdplayer34

Step 9:
Run As Hardware

lab3_wav1.7zlab3_wav2.7z放到SD卡上,執行成功,將可聽到貝多芬的『給愛麗絲』。

操作方式
KEY1
:Volumn Down
KEY2:Volumn Up
KEY3:Next Song
KEY4:Repeat current song

LED會根據聲音的大小變動。

完整程式碼下載
lab3_files.7z (一個未完成的半成品,可以根著本文一步一步完成)
lab3_wav1.7z (wav檔)
lab3_wav2.7z (wav檔)
DE2_70_SD_Card_Audio_Player.7z (最後完整的結果)

Question
(這是我當時給學生的homework,各位有興趣可以自己自做做看)

1.請將gcc改用Debug模式執行,看看結果如何?並解釋為什麼Debug模式會有這種結果。

2.使用Lab 1的Hello μC/OS-II project template,試著將本範例加上μC/OS-II。

3.能夠將本範例用純硬體實現嗎(只使用Verilog,而不使用C)?說說你的想法。

Conclusion
本Lab是由DE2-70的範例DE2_70_SD_Card_Audio_Player所改編,由於軟硬體的code很多,無法一一詳解,請同學自行研究,重點放在如何使用SDCardDriver.hFatFileSystem.h提供的API讀取SD卡上的檔案,下一個Lab的數位相框將使用這個技巧,將SD卡上的bmp檔讀入到LCD上,實做出一個數位相框。

See Also

(原創) 如何自己用SOPC Builder建立一個能在DE2-70上跑μC/OS-II的Nios II系統? (SOC) (Quartus II) (SOPC Builder) (Nios II) (μC/OS-II) (DE2-70)
(原創) 如何設計一個七段顯示器Controller? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)
(原創) 如何設計一個SD卡Wav Player? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (DE2-70)

posted on 2010-08-13 16:45  真 OO无双  阅读(14483)  评论(10编辑  收藏  举报

导航