2011年3月31日木曜日

SDメモリカードプレイヤー機能の実装6

 結局、とりあえずはSD Bus Modeでいくことにして、負荷の高いデータ転送をハード化するのに合わせてソフトを修正をすすめています。
とりあえず、サンプルコードの場合、SDカード内のtest.txtというファイルを見つけて、その内容をConsole Windowに表示するプログラムであったので、test.txtの表示ができるようにしてみました。
主な変更点はオリジナルではSDカードIOとしてSOPCのGPIOポートを使っているところを、今回作ったレジスタを介したアクセスに変更しただけです。
しかしこれがなかなかうまくいかず、ようやく動きました。




NiosII用Eclipse IDEのConsole Windowにtest.txtを表示したところ 

 次のステップとしてWaveファイルのSDカードから読み出しするようプログラムの調整と確認に入ります。

2011年3月26日土曜日

exaU2I USB to I2S Interfac

  bunpeiさんより新たなUSB=>I2S変換インタフェースであるexaU2I USB to I2S Interfac紹介していただきました。XMOSより容易にかつ高品質な構成が実現できそうです。




exaU2I USB to I2S Interfac

未だ販売は開始していないようです。
主な仕様・特徴として、
  • Sampling frequencies (kHz) 44.1, 48, 88.2, 96, 176.4, 192, 352.8
  • Resolution (bits) 16 to 32
  • 12345678902 or 4 channels for 352.8 kHz
  • 2, 4 or 8 channels for sampling rates up to 192 
  • 専用のASIOドライバ
  • PCおよびUSBインターフェイスに起因するジッタを除去するAsynchronous USB Mode
  • I2S出力は、アイソレータで電源が分離されており外部から電源供給、FPGA、USBインタフェースはUSBから供給で電源分離
  • 44.1kH系と48k系の2つの水晶を搭載
といったことろで、要所がほぼ押さえられています。
もしこれを採用するとなると、次の改造を加えると更に良いのではないかと思います。
  •  水晶の電源として専用電源を用意するとともにDAC近傍に設置
  •  I2S出力をFFでリタイミング

xaU2Iを用いる場合の構成案


これを用いれば、384kHzや32bit対応も可能になります。DSD対応以外はほぼ考えている仕様をカバーできます。ただしPCとは光で接続する方が良いという考えは変えてはいませんので、サブルートとしての位置づけと捉えています。

購入については、まだ販売開始していないですし、手が回っていないので急がずゆっくりと考えます。


2011年3月25日金曜日

SDメモリカードプレイヤー機能の実装5

DE0などのTerasicのDevelopment and Education BoardのSDメモリカードのサンプルコードを流用ベースとして用いようと考えているため、ソースを追っていますが、SPIモードでは、クロックとマスタ=>ターゲットのデータラインと、ターゲット=>マスタのデータラインの3本とも双方向バスではないはずなのに、コマンドに対するレスポンスをコマンドを出力後、入力に切り替えて受信する処理になっていまして、何故なのか分からず悩んでいました。

結局、この資料を見つけ、SPIモードだとばかり思っていたら、SD Bus Modのコードであることに気がつきました。

SD Bus Modeといってもデータ転送を4パラで行うわけではなく、SPIと同様にデータ転送は1本のラインで行い、あとはクロックとコマンド/レスポンス用のラインの3本インタフェースのためSPIモードより転送能力がそれほど向上するとは思えません。ストリームアクセスコマンドというモードで転送すれば、帯域をかなり有効に使用できるためある程度期待できますが、結局シングルブロックアクセスモードを使っているようなので、そのままのコードではSPIモードとあまり変わらないのではないかと思われます。

このままMMCモードのソフトでいくか、SPIモードのソフトを別に探してくるか自力でつくるか悩ましいところですが、とりあえずはこのままMMCモードで進め、ハードをMMCモード用に調整する方向をデフォルトで進めようかと考えています。

3/31 MMCモードをSD Bus Modeに修正

2011年3月24日木曜日

ポータブルバッテリとLEDライト

 輪番停電に対する備えとして明かりが欲しいところですが、単一の乾電池はどこも売り切れで普通のライトは期待できず、残るはロウソクとペンタイプのLEDライト等々しかない状態だったので、ColemanパーソナルフロステッドLEDランタンと充電式Evolta充電器セット+単三電池を単一電池として使えるアダプタ(BQ-140/2B)等とかエネループ ランプ 充電式インテリアライト ENL-Y1Sとか発注してみましたが、ようやくEvoltaが届いただけで後は何時届くかわからない状態です。




そこでふとAma Ama Audio Visualさんで紹介されているSG-1000というポータブル電源(DC12V-7.0Ah)なら、後々オーディオ用電源として使いまわせるのでいいんじゃないかと思い立ち、秋月で売っているLED電球(LEDレフランプ)OSLA03X3W0 (◆電源:9~12VAC/DC◆消費電力:3.8W◆光束:270lm)と共に買ってみました。


+


 とりあえず、本読むのに支障が無いぐらいの明るさはあります。

2011年3月21日月曜日

SDメモリカードプレイヤー機能の実装4

 とりあえず、ハード論理のコーディングまで終わりました。
ソフトの方は未だ未着手。FATファイルシステムもWaveファイルも扱ったことは無いので、色々調べながらの実装になるので、まだまだ先になりそうです。

回路を起こしながら調整した結果、前回想定した機能構成から幾つか変更となりました。

 1.SDメモリカードからESへのaudio dataの転送するport to portと、FAT予約領域ルート/FAT領域/デレクトリエントのSDRAMミラー領域へ転送するport to memory用のポートを別にする。
これは、ES転送クロックはbit_clk(22.5792MHz  24.5760MH)でレート管理をするためbit_clkへ載せ替えるほうが良いが、SDRAMへの転送はFIFOを不要とするためspi_clk(20MHz)のまま扱いたいためめ


 2.コントロールおよびステータスレジスタをレジスタ共通部に設置
  他のブロックのコントロールレジスタもNiosIIから制御できるようにするため、Common_ControlブロックへNiosIIアクセスポートを追加し、SDメモリコントローラ用のレジスタもここに置くことに




 下図が変更後のブロック構成


SPI_Ctrl部のブロック構成


 
下図は現在のSOPCビルダーの設定画面になります。


   MultiDAC FPGAのSOPC Builder System Contents画面

2011年3月18日金曜日

QNAP NMP-1000Pハードディスク装着

 QNAP NMP-1000Pに2Tのハードディスクを装着しました。
HDDはWD20EARS-00MVWB0/3.5/SATA/2TBで、以前から購入済みでしたが、そのまま放置していました。


NMP-1000PのディスクトレーにマウントしたWD20EARS 2TB

元々考えていたオーディオ再生中の騒音を低減するためにと、少しでも省エネに貢献する目的で、ATOMでそんなには消費電力高くないとは思いますが、WindowsHomesServer機のAcer Aspire easyStore H340からデフォルトのファイルサーバーをQNAP NMP-1000Pにしようという考えです。

それから輪番停電で、今日もやってしまいましたが、NASやPCをいきなり電源断させてしまうことも多くなるので、WHSでQNAPサーバのバックアップを取る体制とする目的もあります。現在でもWHSにHDD3台内臓しWHS単独でミラーリングしているので、一応バックアップは取れおり、RAID1/5よりはましなバックアップになっているとは思いますが...




NMP-1000PのHDDスロット

 
インストールは特に問題なくフォーマットでき、Windowからの接続やサーバー設定は、付属のマニュアルは最低限のことしか書いていないので、適当に操作し少し迷いながらも何とか最低限の設定はできました。

 内臓HDDでのaudioFileの再生ですが、前回試したDLNAでの再生より少しだけ良好で、前回再生できなかった96kHz、192kHzのwaveおよびFLACファイルでも再生できました。ただし数ファイルためしただけですべてのファイルが再生できるかは不明です。
 しかし相変わらず88.2kHzや176.4kHzのファイルは再生するもTOSへは出力されていないようです。

 ということで、ソフトバージョンアップで88.2kHz系のサポートを改善してくれない限り、使い勝手もいまいちなので、ファイルサーバーとして活用するのみとなりそうです。



2011年3月16日水曜日

M2TECH YOUNG の384kHz/32bit実現方法

 MJ4月号にM2TECH YOUNGの記事が載っており、DACチップはTI(バーブラウン) PCM1795で、PCM1795の内臓デジタルフィルタをバイパスすると768kHzまでの信号入力が可能になり、FPGAにオーバーサンプリングフィルタを実装する構成をとっているとあります。
現行機種で、384kHz/32bitに対応しているDACは知る限りでは、これとMSBテクノロジー社Platinum DAC IVとCaprice-I2S(多分)だけではないかと思います。仕様的には最先端となり、ES9018以外でも384kHz/32bitに対応できるDACチップがあることを知りました。


M2TECH YOUNG

TIのDACチップにはPCM1792Aを始めいくつか種類がありますが、PCM179*,DSD179*系列は、advanced segment DAC方式の同じような仕様のDACチップでPCM1795のみ32bit対応ということのようです。

FPGAでオーバーサンプリングフィルタを実装する構成というのは、できれば挑戦してみたい気もあり、またTIのDACは定評があり採用事例も多いことですし、今後も注視していきたいと思います。

2011年3月13日日曜日

TUNEWEAR TUNEMAX 2 PORT USB BATTERY

  時間と共に大変さが明らかになってくる今回の大地震、被災された方々が一日も早く立ち直られることをお祈り申し上げます。
津波の恐ろしさを見せ付けられました。原発の危機管理の想定が甘いことも露呈しました。現状でも電力不足な状況ですが、浜岡原発も即刻j停止すべき状況にあるのではないかと思います。


DAPのバッテリーに流用することを念頭に、停電に備えてiPhoneの予備バッテリーとして、TUNEWEAR TUNEMAX 2 PORT USB BATTERYを購入してみました。
といっても注文しただけで、この状況ですから何時来るかは期待できなさそうですが...

今回の地震では、勤務場所から歩いて帰宅しましたが、大船から鎌倉、逗子と電波が補足できない状況が続き、停電が回復した時点で通信可能となりました。多分基地局の予備電源が弱いのが原因ではと思われ、ソフトバンクのインフラではバッテリー用意しても無駄という話もあります。

TUNEMAX 2 PORT USB BATTERY


 有名どころのeneloop mobile boosterだと電圧の脈動が見られ余りよろしくないという情報があり、特性の良いバッテリーが求められていますが、これといったものは未だ見つかっていないようです。

 TUNEMAXも似たようなものではないかと予想されますが、出力電流:最大2Aとeneloop mobile booste(KBC-L2BS)の1Aより出力電流が大きい効果は期待できるのではないかと予想しております。

2011年3月8日火曜日

Buffalo IIのバランス出力IV変換回路

  FET差動バランス型ヘッドホンアンプと接続するIV変換回路として前から入手済みで部品も一応集約済みのFujiwaraさんのディスクリIVを使用するつもりでしたが、OPアンプ回路が不勉強のためバランス出力とするとそのまま使用できるのかどうかよくわからない。どう考えればよいのかわからない状態です。
 
 少なくとも次の2つの点をクリアしなければならないことは間違いなさそうです。
  •  ローパスフィルタが差動合成を行う後段側になっているので差動合成段を外すとフィルタを追加する必要がある。
  •  ES9018の出力はDCオフセットがある。
 このブログへのアドバイスのコメント等を参考に、結局ESSのサンプル回路の構成をディスクリIVに適用する方向で考えることにしました。
 
 下記がその回路構成になります。


 赤:Jumperまたは追加部品      .
青:定数変更              .      
グレイ:アンマウント、未使用パターン
×:パターンカット             .

ディスクリIVをベースにしたIV変換回路

 パターンはディスクリIVの基板をなるべく生かし、バランス出力とするため差動合成用のOPアンプ周辺はアンマウントとし、抵抗、コンデンサの定数はESSのサンプル回路に合わせる形にしてみました。
 DCオフセットは、ESSのサンプル回路では、OPアンプの+入力にVREF接続なっているので、+15VとGND間の抵抗分圧で1.65Vを生成して接続することで回避しようと思います。(本当はES9018用3.3Vの方が良いと思いますが配線が増えるので回避。図の抵抗値は暫定値)

 IV変換兼ローパスフィルタの回路構成(だと思うのですが)はWebで少し調べてみましたが、ESSの推奨回路と同じ構成のものは見つけられずで、カットオフ周波数とかよくわかりません。ゆくゆくは理解していきたいところですが、まあ推奨値のローパスフィルタ値ということで...
 
 何か改良点や間違いがあればご指摘お願いします。

2011年3月6日日曜日

DE0-nanoの対抗馬があった

 ポータブル用のFPGAボードとして最有力視しているDE0-nanoに対抗馬が!
 今まで気が付いていませんでしたが、Twiiterでフォローさせてもらっている長船さんがONYXというボードを作成しているそうです。詳細はわかりませんが、写真を見る限りポータブルプレイヤーとして必要な機能(FPGA、外部メモリ、SDカードソケット)を押さえていて、大きさはDE0-nanoの半分ぐらいに見えます。


ONYX (写真は昨年5月のMTM05のときのものをSim's blogさんより転載、現在のものはブラッシュアップされている)

 どうもFPGAはcyclone EP1C3T100で今となってはかなり古いデバイス、(Alteraサイトのラインアップから外れているのでデータシートのリンクも無い)でゲート数も小さいですが、多分ゲート数はこのサイズでも問題ないはず。
 価格や、実際に手に入るのか、その時期などまだ良く見えませんが、動向をワッチしておきたいと思います。


 Digi-Keyに発注中のXMOS  USB AUDIO 2.0 REFERENCE DESIGN  今日チェックしてみると、納期2011/02/22 納期遅延中になっています。再度の納期遅延。何か問題があるのか???

2011年3月5日土曜日

SDメモリカードプレイヤー機能の実装3 SPI Ctrl部の仕様

 SDメモリカードのインタフェース制御を行うSpi_Ctrl部について、もう少し深く検討してみました。

 転送帯域が厳しいaudioデータの再生は、ハードアシストでデータ転送を行い、SDメモリカードの初期化は、遅くても問題ないのでNiosiIIで行うようにする。またAudioデータ転送中の帯域を確保するためFAT予約領域ルート/FAT領域/デレクトリエントリはSDRAM上に転送して、そちらを参照する。
 以上転送帯域確保のための最低限ハード化するとこんな感じで良いかなと考えています。
 SDメモリカードへのライトなどはプレイヤーとしては不要なのでばっさりと機能を落とします。
 以下がSpi_Ctrl部の現時点での仕様です。


概要


SpiCtrlは、SPIマスタとして動作し、SD メモリカードのシングルブロックリードアクセスのみをサポートする。
SDメモリカードの初期化は、制御ルートを切り替えGPIOポートを使用してNiosII処理により行う(予定)。
 
-1536
バイトの受信FIFO
-32
ビット スレーブavalonバスインターフェイス(レジスタアクセス用)
-32ビット マスタavalonバスインターフェイス(リードデータDMA用)
  転送先の指定により2つの転送モード
port to port :設定sampling周波数でESへ転送(audio data転送用)
port to memory :SDRAMミラー領域へ転送FAT予約領域ルート/FAT領域/デレクトリエントリ)
- avalon
バスインターフェイスは50MHz(予定)
-SPIアクセスは20M(予定)


構成



SPI_Ctrl部のブロック構成


アクセス手順

.
SD/メモリカードSingleBlockReadアクセスの手順は次のとおり。

1.        Set the SD block address Reg: SDメモリカードRead Address
2.        Set Trans Type Reg = SPI_RW_READ_SD_BLOCK
3.        Set Trans Ctrl Reg = SPI_TRANS_START
4.        Wait for Trans Status Reg != TRANS_BUSY
5.        Check for Trans Error Reg [3:2] == READ_NO_ERROR
6.        Read 512 bytes from SPI_Rx_FIFO to SDcard_ES (p_to_p)or SDRAM(p_to_m)


レジスタ一覧

 


Register Address
Name
0x0
SPI Master Control Reg
0x4
Trans Type Reg
0x8
Trans Ctrl Reg
0xc
Trans Status Reg
0x10
Trans Error Reg
0x14
Direct_Access Data Reg
0x18
SD Addr Reg
0x1c
Rx_FIFO_data_count




レジスタ詳細

SPI Master Control Reg

Bit Pos
Name
Description
Default
R/W
0
RST
1 = Reset core logic, and registers. Self clearing
0
W


Trans Type Reg

Bit Pos
Name
Description
Default
R/W
[2:0]
TRANS_TYPE
Sets the transaction type, where;
0 = DIRECT_ACCESS (future study)
1 = INIT_SD (future study)
2 = RW_READ_SD_BLOCK
4 = PIO_ACCESS
0
R/W



Trans Ctrl Reg

Bit Pos
Name
Description
Default
R/W
[1:0]
TRANS_START
1 = Start transaction to ES. Self clearing
2 = Start transaction to SDRAM. Self clearing
0
W


Trans Status Reg

Bit Pos
Name
Description
Default
R/W
0
TRANS_BUSY
1 = Transaction busy

R


Trans Error Reg

Bit Pos
Name
Description
Default
R/W
[3:2]
SD_READ_ERROR
0 = READ_NO_ERROR
1 = READ_CMD_ERROR
2 = READ_TOKEN_ERROR

R

[1:0]
SD_INIT_ERROR
(future study)
0 = INIT_NO_ERROR
1 = INIT_CMD0_ERROR
2 = INIT_CMD1_ERROR

R



SD Addr Reg

Bit Pos
Name
Description
Default
R/W
[31:0]
SD_ADDR_31_0
Set the SD memory address before starting a block read.
0x00000000
R/W



Rx_FIFO_data_count

Bit Pos
Name
Description
Default
R/W
[15:0]
FIFO_DATA_COUNT
FIFO_DATA_COUNT Indicates the number of data entries within the fifo.

R





入出力信号一覧

 


Port
Width
Direction
Description
spi_sysclk
1
input
spi logic clock.
rstn
1
input
reset. Asynchronous. Resets all logic.
slave_address
32
input
slave port address input
slave_wr_data
32
input
slave port data input
slave_rd_data 
32
output
sslave port data output
slave_write_enb
1
input
slave port write enable
slave_read_enb
1
input
slave port read enable
slave_ack
1
output
slave port acknowledge output
master_address
32
output
master port address output
master _wr_data
32
output
master port data output
master_write_enb
1
output
master port write enable
master_ack
1
input
master port acknowledge input
spi_clk_out 
1
output
SPI clock. Clock speed configurable
spi_data_in 
1
input
SPI serial data from slave
spi_data_out 
1
input
SPI serial data to slave
spi_cs_n
1
input
SPI device chip select
sample_rate
3
input
sampling_rate