SOPCに基づく音楽再生システムの設計

1 目的
1.実際に SOPC を使用して実践的な設計を行い、SOPC ベースの組み込みソフトウェア開発の基本プロセスを学びます。
2. SD カード、VS1003、TFT など、単純なランニング ライト、ブザー、デジタル チューブの代わりに同時に動作できるいくつかの実用的なデバイスについて学びます
I2C、SPI、RS232 などの一般的に使用されるプロトコルを理解して習得しますが、この設計では主に SPI プロトコルが使用されます。2 私が行った作業は、主にいくつかの IP コアを呼び出して、SOPC を構築すること
です
。同様の図面 PCB 原理 図の方法、接続してハードウェア システムを構築します。詳細については、Lin Zhenghong 氏の「SOPC ベースの SDRAM および FLASH の読み書き実験」を参照してください。(ご興味がございましたら、「Nios ii Things」を参照して、簡単な Nios ii ハードウェア システム設計を完了することもできます。また、http://kingst.cnblogs.com から「Nios ii Things」の最新バージョンを入手することもできます。 /. )
は、SPI モードでの SD カードのドライブを実現します。Nios ii ハードウェア SPI の欠陥により、SPI レートを変更できません。SD カードのドライブのプロセスで、SPI レートを変更して完了する必要があります。 IO ポートは 4 線式 SPI をエミュレートします。
実際、VS1003 のドライバー V は、FAT32 ファイル システムと SD カード間の接続を実現します。この部分ではオープン ソースの ZNFAT32 ファイル システムが使用されており、カスタマイズ後に実現される機能は、主にファイルの検索、ファイルのオープン、ファイルの読み取り、ディレクトリの作成、ファイルの作成などの機能です。(同時に、ZNFAT32 ファイル システムのソース コードは http://www.znmcu.cn/softshow.asp?id=47 から入手できます)
VS1003 は、MP3、 WMA、MIDI など。この設計では MP3 形式のみをデコードし、MP3 形式の音楽を SD カードから読み取って VS1003 に送信してデコードして再生します。
TFT LCD スクリーンのドライバー、実際には LCD スクリーンには学ぶべきことがたくさんありますが、この設計では単にビットマップを表示するだけであり、タッチ機能も GUI も設計されていません。 SD カードから BMP 形式 (16 ビット カラー) の画像を取得し、TFT ディスプレイに渡します。
音楽システムの実現は、上記のすべてのモジュールを統合して、SD カードから MP3 形式の音楽と BMP 形式の画像の抽出を実現し、それぞれを VS1003 に渡して音楽を再生し、TFT に渡して画像を表示します。オペレーティング システムでは、当面は実行できません。同期してください。
3 本設計の全体構成

図1 音楽再生システムの全体構成

説明: このデザインは、アルテラの Cyclone II シリーズ FPGA をメイン コントローラとして搭載した DE2 開発ボードに基づいており、SDRAM および FLASH と結合され、SOPC テクノロジを使用して SD カードおよび TFT LCD 画面、VS1003 オーディオを制御するためのシンプルな SOPC システムを形成しています。プレーヤーモジュールなどを利用して自作の簡易音楽プレーヤーシステムを実現します。このデザインでは、FPGA はアルテラ ライブラリの IP コアを呼び出すことでフラッシュと SDRAM をそれぞれ制御し、シミュレートされた SPI バスを通じて SD カード、TFT モジュール、VS1003 モジュールを制御します。SDカード内のMP3形式の音楽をVS1003モジュールでデコードして再生したり、BMP形式の画像をTFTモジュールで表示したりすることが可能です。
この設計では、SD カードの最大ストレージ容量は 4G で、設計で提供されるメイン クロックは 50M です。このクロックの動作下では、IO ターンオーバー速度は約 5M、シミュレートされた SPI 速度はわずか約 5M です。 50Kbps なので、デザインの VS1003 モジュールでサポートされるデコード レートは 48Kbps 以下である必要があります (データシートでは、VS1003 でサポートされるデコード レートは 5 ~ 384Kbps です)。また、アナログ SPI の速度により、TFT ディスプレイのリフレッシュ時間は約 0.5 秒になります。また、再生と表示の合計容量は、SD カード 4G の最大ストレージ容量に達する必要があります。
4 具体的な実装
4.1 ハードウェア部分
4.1.1 SOPC システムは、
NIOS32 コア、SDRAM FLASH PIO などの IP コアを構築します。
具体的な構築プロセスについては、Lin Zhenghong 氏の「SOPC-Based SDRAM and FLASH Read and Write Experiment」を参照してください。以下は、その設定を適切に補足するだけであり、主に PIO コアの呼び出しと IO ポートの入出力プロパティの設定に反映されます。
この部分では、SDRAM と FLASH の設定が DE2 学習ボードの SDRAM と FLASH の設定と同じである必要があることに注意してください。メモリの種類と属性を次の表に示します。

地址线宽度(位)	数据线宽度(位)

FLASH 22 8
SDRSM 12 16
表1 メモリの種類と属性

同時に、GPIO が SPI をシミュレートした後の各ポート属性の設定を次の表に示します。

属性	功能说明

アナログ CS 出力チップセレクト信号
アナログ MOSI 出力マスター出力スレーブ入力
アナログ MISO 入力マスター入力スレーブ出力
アナログ TCLK 出力クロック
表 2 IO ポートの属性と機能の説明

以下に、PIO コアの呼び出しと設定を簡単に紹介します。
設定図は次のとおりです。

図 2 PIO IP コアの検索
アルテラのライブラリで PIO コアを検索し、ダブルクリックしてコアを呼び出すと、次の図に示すインターフェイスが表示されます。

図 3 CS の基本プロパティの設定

図 4 CS のその他の設定
PIO の幅の設定: 必要に応じてビット幅を 1 に設定します IO は CS 信号のシミュレーションに使用するため、出力のみに設定されます。

図5 MISOの基本設定

図6 MISOのその他の設定

PIO の幅を設定し、必要に応じてビット幅を 1 に設定します IO は MISO 信号のシミュレーションに使用するため、入力のみに設定します。同時に、IO には割り込み機能が必要ないため、割り込みは有効にされず、シミュレーション モデルは提供されません。

図7 MOSIの基本設定

図 8 MOSI のその他の設定
PIO の幅を設定します: 必要に応じてビット幅を 1 に設定します IO は MOSI 信号のシミュレーションに使用されるため、出力のみに設定されます。

図9 TCLKの基本設定

図 10 TCLK のその他の設定
PIO の幅の設定: 必要に応じてビット幅を 1 に設定します。IO は MOSI 信号のシミュレーションに使用されるため、出力のみに設定されます。
4.1.2 QuartusII でのハードウェア回路全体の実装

図 11 ハードウェアの一般回路図
この設計で使用する必要があるハードウェア部品には、主に NIOS II ソフト コア、PLL コア、GPIO コア、入出力インターフェイス、その他のコンポーネントが含まれます。
4.2 ソフトウェア部分
4.2.1 メインプログラムのフローチャート:

図 12 プログラムフローチャート4.2.2
SPI モードでの SD カードドライバ IO シミュレーション SPI
の実現
void spi_write(uchar temp)
//SPI プロトコルを使用して 1 バイトのデータをゆっくり書き込みます。
unsigned char spi_read()
//SPI プロトコルを使用して 1 バイトのデータをゆっくり読み取ります。
void spi_write_fast(uchar temp)
//SPI プロトコルを使用して 1 バイトのデータを素早く書き込み、
レジスタの読み書きを実現します。
unsigned char write_cad_init(unsigned char *pead)
//初期化中にコマンドを書き込みます。パラメータは書き込むコマンドコードです。
unsigned char write_cad(unsigned char *pead)
//初期化状態でない場合にコマンドを書き込みます。パラメータは書き込むコマンドコードです。
SD リセットや初期化などの動作はレジスタの読み書きにより実現
unsigned char SD_reset()
//SD カードリセット関数、戻り値は 01H でリセット成功。
unsigned char SD_init()
//SD カード初期化関数、戻り値は 00H で初期化成功
モジュールの読み出しとモジュールの書き込みはレジスタの読み書きにより実現
unsigned char SD_write_block(unsigned long address, unsigned char *buffer )
//SD カードモジュール書き込み関数、戻り値の下 3 桁が 05H の場合、モジュールの書き込みが成功したことを示します。 //パラメータ: パラメータ 1 は書き込む
アドレスを指定し、パラメータ 2 は
符号なしで書き込むデータを指定しますchar SD_read_block(unsigned long address,unsigned char *buffer)
//SD カード モジュール読み取り関数、戻り値は 0 で、モジュールの読み取りが成功したことを示します。
//パラメータ: パラメータ 1 は読み込むアドレスを指定し、パラメータ 2 は読み込んだデータが保存される場所を指定します。次の
メイン シーケンス図:

図 13 SPI モードでの SD カード駆動のリセット シーケンス

図 14 SPI モードでの SD カード駆動の初期化シーケンス

図 15 SPI モードでのモジュール読み取り SD カード駆動のタイミング シーケンス

図 16 SPI モードで、SD カードを駆動するモジュールの書き込みタイミング 注
:
この部分では、リセット (CMD0)、初期化 (CMD1)、読み取り (CMD16)、 (CMD24) と最終チェックサムを書き込みます。必要なタイミングプロセスと最終的に実現できる機能、そしてその機能が実現されているかどうかを判断する方法を理解します。この部分では、SD カードの初期化には低速 SPI が必要であり、読み取りと書き込みには高速 SPI の使用が必要であることに注意する必要があります。遅い場合は SD の初期化を完了させ、速い場合は SD カードのパフォーマンスを可能な限り向上させます。もちろん、より高速にしたい場合は、SD モードを使用して SD カードを駆動する必要があります。SPI モードでは SD カードは 1 回線でデータを送信しますが、SD モードでは SD カードは 4 回線でデータを送信するためです。ただし、SD モード ドライバは比較的複雑なので、SPI モードで動作するように SD カードを駆動することにしました。
SPI プロトコルの基本的な内容を理解するには、チップ セレクトが Low の場合、クロックの立ち上がりエッジがデータを書き込み、クロックの立ち下がりエッジがデータを読み取ります。
同時に、読み取りと書き込みのタイミングに従って厳密に動作する必要があり、SD カードから返されたデータに従ってさらなる処理を実行する必要があり、クロックの補充には特別な注意を払う必要があります。
SPI モードで駆動される SD カードは最大 4G の容量をサポートします。

4.2.3 VS1003 ドライバー
1) IO アナログ SPI の実装
void vs_spi_write_byte(unsigned char data)
// 機能: SPI プロトコルを使用してバイトを書き込みます。
uchar vs_spi_read_byte()
// 機能: SPI プロトコルを使用してバイトを読み取り
// 読み取りデータを返します。
2) レジスタの読み取りおよび書き込み:
void vs_write_reg(uchar address ,uchar datah,uchar datal)
//機能: コマンド コードをレジスタに書き込みます
//パラメータの説明: パラメータ 1 レジスタ名。VS1003 のコマンド コードは 32 ビットなので、 //パラメータ2と3はコマンドコードです。
uint vs_read_reg(uchar address)
//関数: レジスタから状態を読み取る
3) 初期化:
void vs_init()
//関数: VS1003 初期化
4) 主なタイミング図:

図17 VS1003のワード読み出しタイミング

図 18 VS1003 のワード書き込みシーケンス
注: この部分では、VS1003 のキャッシュは 32BYTE であるため、高速書き込みを考慮することで、ピクチャの同期表示にある程度の時間を確保できることに注意してください。擬似マルチタスク操作を実行します。
4.2.4 TFT ドライバ
1) レジスタへの書き込み:
void write_reg(uint reg,uint data)
//機能: SPI プロトコルを使用し、レジスタに書き込みます
// パラメータ: パラメータ 1 はレジスタを指定し、パラメータ 2 はコマンド コードを指定します
2) データを書き込みます:
void write_data_start()
//関数: データ書き込み開始
void write_data(uint data)
//関数: データ書き込み
void write_end()
//関数: データ書き込み終了
3) リセット:
void tft_reset()
//関数: TFT リセット
4 ) 初期化:
void tft_init()
// 関数: TFT の初期化
5) ウィンドウの設定:
void tft_setwindow(uint startx,uint starty,uint endx,uint endy )
// 関数: 表示されるウィンドウを設定します。パラメーターは左上隅、右下隅の水平座標と垂直座標。
6) 特定の色で画面をクリアします。
void tft_clearscreen(uint color);

図 19 TFT メイン制御チップ SSD1289 の駆動シーケンス図
注: この部分では、SD カード内のビットマップ ファイルの保存形式に注意する必要があります。これは直接バイナリ ファイルであるため、保存形式を変更する必要はありません。デコードされ、直接表示できます。ただし、SD カード内の画像の RGB は 555 モードのみであり、元の 16 ビット カラー RGB は 565 モードであることを考慮すると、表示プロセス中に RGB モードの変換を考慮する必要があります。そこで、ここでは16ビットカラーのビットマップ表示を行うだけの簡単な処理をしましたが、24ビットだとRGBモードの変換が比較的複雑になります。
4.2.5 ファイルシステムのマウント
1) SD カードのマウント
2 つのポインターを定義します:
struct znFAT_Init_Arg *pArg;
struct znFAT_Init_Arg sdcard;
SD カードと FAT32 のマウントを完了します: pArg = &sdcard
と同時に SD カードのモジュールを読み取ります。モジュール書き込みと FAT32 読み取りおよび書き込みフックアップ:
UINT8 znFAT_ReadSector(UINT32 addr,UINT8 *buf)
{ return SD_read_block(addr,buf); } //関数: ファイル システム読み取りセクターUINT8 znFAT_WriteSector(UINT32 addr,UINT8 *buf) { return SD_write_block(addr,buf); } //関数: ファイル システム書き込みセクター2) VS1003 マウント









void vs1003_mp3(struct FileInfoStruct *pfi,UINT32 offset)
//機能: ファイルシステムのデータを指定されたローカル領域から VS1003 に転送
//パラメータ: パラメータ 1、ファイル情報構造体のポインタ変数、パラメータ 2、指定場所
3) TFT の接続
void picture(struct FileInfoStruct *pfi,UINT32 offset)
//機能: ファイルシステムは、指定されたローカル領域から TFT にデータを転送します
//パラメータ: パラメータ 1、ファイル情報構造体のポインタ変数、パラメータ2、指定 注
: この部分では、独自のファイル システムを作成できるように、ZNFAT の構築概念の基本を理解する必要があります (ただし、ZNFAT ファイル システムがどのように記述されるかを完全に理解する必要はありません)。 ZNFAT ファイル システムに基づくインターフェイス機能 この設計モジュールの VS1003 では、TFT LCD スクリーンがインターフェイス機能を通じて FAT32 ファイル システムに接続されています。
5. デバッグ プロセスで発生した問題と解決策
デバッグ プロセスでは多くの問題がありますが、私の考えではいくつかの典型的なエラーに焦点を当てます。
5.1 SD カード ドライバの問題
5.1.1 リセットが成功しない
現象: ダウンロードその後、応答がなく、デバッグ後、while
(temp!=0x01); //成功すると01Hに戻って無限ループする。
理由:

SPI プロトコルによって駆動されていることは知っていましたが、初期化プロセス中に低速 SPI を使用する必要があることに気づきませんでした。タイミングを研究するときに真剣に考えておらず、
補助クロックの重要性にも気づきませんでした。
チェックコードの扱いが丁寧でなかった、特にCMD0のチェック コードが0x95Hだった チェックコードは実質的な効果はないが、正しく使用する必要があり、最初はCMD0が正常に書き込まれたかどうかの判断方法が分からなかっ
た、戻り値01Hは見当たりませんでした。
解決策:
ポート シミュレーションを使用する SPI プロトコルでは、約 10ms の遅延が追加され、CS が Low になる前に 75 クロック サイクルが追加され、CMD0 が書き込まれた後に 8 クロック サイクルが追加され、その後データ出力ポートの値が計算されます。が読み込まれ、01H であればリセット成功です。
5.1.2 モジュールの書き込みに失敗しました
理由:

データシートに書いてあるチェックコードは必要ないと思うので(どうでもいい)、チェックコードを書かずにそのまま書いています;
1回の書き込みの長さはデフォルトで512BYTEですが、CMD21で他の長さに変更することもあります最後に、ファイル システムを移植したときに、SD のハードウェア構造についていくつか学びました。SD カードの 1 セクターの容量がちょうど 512BYTE であることがわかりました。その後の作業の困難さを軽減するために、次のように変更しました。長さを 512BYTE に戻します。
開始フラグは実際には任意の値にできますが、実際には書き込む必要があるデータと競合するようにフラグ ビットを設定しました。
データ出力の状態に応じて次のステップに進むかどうかを判断する必要があります。つまり、コマンド書き込みフラグを検出してから 512BYTE データを検出し、8 クロックサイクル後に書き込み成功フラグを検出する必要があります。追加した。
解決策:
2 つのチェック コード (FFH) を追加し、CMD21 を設定せず、開始フラグを FEH に変更し、デバッグ プロセス中に 2 つの部分に分割します。最初にコマンドが正常に書き込まれたかどうかをデバッグし、次にデータが書き込まれたかどうかをデバッグします。成功です。また、高速書き込みプロジェクトでは高速SPIを使用する必要があるため、低速SPIでの約10msの遅延が解消されます。
5.2 ファイル システムの理解とマウント
ファイル システムと SD カードを別々にデバッグすると期待した結果が得られますが、SD カードをファイル システムにマウントした後は期待した結果が得られません。
2 つのデバイス初期化構造体を定義します:
struct znFAT_Init_Arg *pArg;
struct znFAT_Init_Arg sdcard;
デバッグ中に、デバイス初期化構造体ポインターが常に null を指していることがわかります。
解決策:
デバイス初期化構造体 sdcard のアドレスをデバイス初期化構造体のポインター pArg に割り当てます (つまり、 pArg = &sdcard )。SD カードとファイル システム間の接続を完了します。
したがって、いくつかの変数を定義するときは、それらを初期化することを忘れないでください。空の変数は、プログラム全体のデバッグと実行に影響を与えることがあります。
5.3 VS1003
ドライバ ドライバ方式は SD カードと同様でより簡単で、高速 SPI と低速 SPI を区別する必要はなく、すべて高速 SPI を直接使用します。以前の基礎ができた後、運転プロセスに大きな問題はありません。主な問題は、書き込みコマンド コード 0x02 と読み取りコマンド コード 0x03 がデータシートに見つからないことであり、これら 2 つのコマンド コードがなければ、ドライバー プログラム全体を実装することは完全に不可能です。したがって、データ冊子に全面的に依存する必要はなく、複数のソースから情報を収集することができると思います。
5.4 TFTドライバ
5.4.1 取扱説明書の誤解

図 20 TFT モジュールでの 74HC573 バスの使用
TFT モジュールを駆動するプロジェクトにおいて、ユーザー マニュアルの回路図が誤解されていました。ラッチ 74HC573 を見て、8 ビットの TFT データバスだと思いました。したがって、ハードウェア部分を開発するときは、データ バスを 8 ビットに設定します。ソフトウェア開発完了後、DE2開発ボードにダウンロードすると何の現象もなく動作します。オシロスコープを使用してデータ ポートのレベルを検出し、TFT のデータ バスの一部がデータを受信して​​いないことを確認します。したがって、バスのビット幅設定が間違っていると判断されます。TFTモジュールの回路図をさらに調べた結果、私はその回路図を本当に誤解していたことがわかりました。
回路図で意味を表現すると、モジュールは 16 ビットと 8 ビットをサポートできます。モジュール上には 74HC573 のはんだ付けがまったくないため、この場合は 16 ビットのデータ バスのみが使用できます。
解決策:
ハードウェア設計で TFT データ バスを 16 ビットに設定し、ソフトウェア設計でデータ送信モードを変更します。
5.4.2 データシートの誤り
TFT の駆動プロセスでは、いくつかの基本的なウィンドウ設定関数を開発する必要があるため、座標を示すレジスタを使用する必要があります。しかし、データシートはちょっと間違っています。具体的には以下の図のようになります。

図 21 SSD1289 エラー

6 期待と結果当初、私は比較的完成度の高い SOPC ベースの音楽プレーヤーを作成することを計画しており、
の機能を実現したいと考えていました:
MP3 の再生
、BMP の表示、制御機能を
備えた中国語 GUI 、PCB の作成とデバッグの実現。私がこの話題に出会ったのは、研究室の兄弟が同様のシステムを利用して周立功の会社に応募していたので、自分でプログラムを作って試してみたかったからです。最初にインターネットで情報を検索したときは、まだ見つけるのが難しかったのですが、後でもう少し詳しい情報が掲載されている、より良い Web サイト www.ourdev.com を見つけて、そこから多くのことを学びました。もちろんお兄さんにもたくさん助けてもらって、大体3ヶ月くらいで音楽プレーヤーの試作品を作ることができました。ほんの一部の機能しか実装されていませんが、それでもちょっと嬉しい気持ちになります。今振り返ってみると、実際には特に難しいことではありません。主なことは分解することを学ぶことです。現在、基本的に 4 つのモジュールに分かれています。各モジュール間の継承関係は FAT32 ファイル システムと FAT32 ファイル システムに基づいています。 SDカードドライバーです。したがって、この設計の最も基本的で核心的かつ難しい部分は、SD カードのドライバーと FAT32 ファイル システムの理解です。初心者のうちは、SD カードと FAT32 ファイル システムに関する Yu Zhennan のビデオ説明を見ることをお勧めします (詳細については、www.znmcu.cn を参照)。SD カード ドライバーが完成し、FAT32 ファイル システムが正常にマウントされたら、次の VS1003 ドライバーと TFT ドライバーは比較的単純です。各モジュールのドライバが完成した後は、メインプログラムですべてのIO属性を設定し、各モジュールを初期化し、ファイルシステムを呼び出すだけで、最終システムの組み合わせや共同デバッグが非常に簡単になります。



7 付録
7.1 参考資料
「DE2_user.pdf」
「SDcard.pdf」 「
VS1003.pdf」 「
VS1003_user.pdf」
「SSD1289.pdf」
「TFT_user.pdf」
「NIOS II それらのもの」
Zhennan Electronics www.znmcu.com
China Electronics Developmentネットワーク www.ourdev.cn

おすすめ

転載: blog.csdn.net/ambiguous__/article/details/130798097