2012年4月30日月曜日

DoPをADATで

 DoPをADATで運用するためのFPGAの改造をGWの連休中に何とか立ち上げようと開始しました。


 以前 HQ Player  dCS方式DSDネイティブ出力が手持ちのDDCでも出来るか ということでこの時はSPDIFでの確認ですが、結果ノイズだらけで再生できずで頓挫してしまいましたが、いろいろ情報やツールも出揃ってきたので、ADATで再挑戦してみます。


 まずはADAT上のDoPのフォーマットについて...
 


ADAT SMUXのチャネルマッピング

 上図はADAT(SMUX)のPCMデータのマッピングです。ADATは伝送速は、11.2896Mbit/s(44.1kHz系列) or  12.288Mbit/s(48kHz系列) 固定で、44.1k/48kHz時は8ch、88.2k/96kHz時は、4ch、176.4k/192kHz時は、2chを伝送することが出来ます。
 ステレオで扱う場合、44.1k/48kHz時は4つのステレオチャネル(a,b,c,d chとします)をa_ch L/R,b_ch L/R,c_ch L/R d_ch L/Rという順序でチャネル割当されます。
  88.2k/96kHz時は、2つのステレオチャネル(a,b chとします)をa_ch L 2sample /a_ch R 2sample , b_ch L 2sample /b_ch R 2sample ,という順序でチャネル割当されます。
  176.4k/192kHz 時は、1つのステレオチャネル(a chとします)をa_ch L 4sample /a_ch R 4sample という順序でチャネル割当されます。


 DoPでDSD64を伝送する場合、176.4kHzのモードを使用します。



DoP DSD64のチャネルマッピングと受信後のフォーマット変換(*差替版)


1フレーム中のLch 4sample分の内、最初の1sampleの下位16bitをMSB側として、次の1sampleの 下位16bitをLSB側として32bitに連結し、FPGA内部バッファに書き込みます。その他も同様に2sample分の下位16bitを結合して32bit化してFPGA内部バッファに書き込みます。
 *上記でも問題なく処理できますが、DSD128と制御方法を揃えるため、Upper側16bit、Lower側16bitを個別にメモリへライトすることにしました。


 DoPでDSD128を伝送する場合、1本のADATラインでは伝送容量が不足するため、2つのADATラインを使います。各ラインは176.4kHzのモードを使用します。

DoP DSD128のチャネルマッピングと受信後のフォーマット変換 (*差替版)


1本でLchまたはRchを伝送します。ADAT 8chに順番にLchまたはRchの16bit×8コ分のデータが埋め込まれているので、 DoP DSD64の場合と同じルールで 2sample分の下位16bitを結合して32bit化してFPGA内部バッファに書き込みます。  Lch はUpper側16bitにRchはLower側16bitに個別に書込メモリ上で、整列させます。

 
 前回の時は、内部ではDoPのフォーマットのまま扱い、出力時にDSDフォーマットに変換する方式をとっていましたが、プレーンDSDの入出力とDoPの入出力を相互にうまく扱うには一旦DSD(メモリ格納時32bit化)して扱う方が、処理し易いと思われるので、入力側でDSD化するように変更することにしました。
 

2012年4月28日土曜日

MUSILAND Monitor 01 MINI  2

MUSILAND Monitor 01 MINI が到着。とりあえず、基板を見てみました。
DACにはTI PCM1781 が使用されています。このチップ24bit@192kHzまでは対応しているようで、I2SでFPGAと接続されていますので、容易に引き出せそうです。


    MUSILAND Monitor 01 MINI

   MUSILAND Monitor 01 MINI


  MUSILAND Monitor 01 MINI 基板 と BuffaloII


 MUSILAND Monitor 01 MINI 基板

MUSILAND Monitor 01 MINI  基板裏 


CYPRESS  CY7C68013A
  EZ-USB®FX2LP™USBマイクロコントローラハイスピー​​ドUSBペリフェラルコントローラ 

DAC ChipはTI PCM1781 

2012年4月26日木曜日

MUSILAND Monitor 01 MINI

 今まで気がついていませんでしたが、MUSILAND Monitor 01 MINIという小さいUSB DDC/DACを見つけました。昨年6月発売で、代理店のテックの通販はすでに売り切れになっています。
そのせいもあるのか、送料別ですが\5,000で販売しているところもあり購入してみました。


87×61×13mm と比較的小さく(といってもXMOSとほぼ同じ大きさっぽい)、24bit@192kHzまで対応しているので、モバイル向けのDoP用DDCベースにも良いかもしれません。中の基板を取り出してDACと同じケースにいれることも考えられます。



MUSILAND Monitor 01 MINI
MUSILAND Monitor 01 MINI 基板

2012年4月21日土曜日

PSoC 3本

シリーズ最強 ! PSoCボード + デバック・ボード 2012年 05月号を買ってみました。


 PSoCには興味はありましたが、新しいツールをマスタするのそれなりに大変ですし、あまり日本語マニュアルは充実していなさそうなので、とりかかりにはよさそうです。


 アナログ機能は今のところあまり必要としていませんが、比較的小さなボードであるのでモバイル向けに組み込むのに良さそうです。
 チップ単体でもSOICやDIPタイプのものが秋月で購入できるので、ボードを起こすのも比較的容易そうです。
 ロジック部のゲート数があまり大きくないのと、使い勝手がどうか次第では使いものにならないかもしれませんが...


シリーズ最強 ! PSoCボード + デバック・ボード 2012年 05月号




 プリント基板作りの基礎と実例集もパターン引き回しの参考書として一緒に購入しました。

JRiver Media Center DoP対応

 PCで音楽さんの記事でJRiver Media Centerがv 17.0.106で  DoPに対応したことが紹介されています。
半月ぐらい前に試したときは未だ対応しておらず、そのままチェックしていませんでしたが、その後対応していたようです、
 v17.0.122をダウンロードしてインストール。今までライセンス未購入でしたが、特に問題なければ、メインで使用するつもりで購入してみました。

 JRiver Media Center

 DoPで使用するには、下記の設定を合わせればOK。
 DoPモードは見つけにくいところにあり ビデオ-bitstreaming にチェックボックスがあります。
 また、ASIOで試してみましたがダメでWASAPI-Event Styleでしかうまくいっていません。

 ビデオ-bitstreaming カスタムを選択し、DSD over PCM(DoP) をチェック
 DoP Format:使用機器に合わせてDoPかdCSを選択

 オーディオ-出力モード:WASAPI-Event Styleを選択
 出力モード選択で使用するデバイスを選択

2012年4月19日木曜日

Thunderbolt光ケーブル

住友電気工業がThunderbolt光ケーブルのサンプル出荷を開始したとのこと。
最大伝送距離は20mとのこと。意外と短いですね。

ケーブルコネクタ内に電気⇔光変換機能を実装し、コネクタは通常のメタルケーブルと同じで Thunderboltポートに挿せば使えるようになっています。

 下のBelkin のThunderbolt Express DockなどのThunderbolt⇔USB変換機能を持つ装置があれば、USB DDC/DACとPCの電源を完全にアイソレートすることが可能になるはずです。

  Belkin  Thunderbolt Express Dockは$299と少々お高いですが、だんだんとバリエーションも増え、価格もこなれてくるとを期待したいところです。
 光ケーブルの方は価格が不明ですが、それなりに高価になると思います。 
 Thunderboltポートを持つApollo High-Resolution Interfaceや、Apogee Symphony I/O 

Symphony 64 | ThunderBridgeなどのAudioIFもありますがやはり高価です。


 Thunderbolt光ケーブル(住友電気工業)


 Belkin  Thunderbolt Express Dock 

2012年4月16日月曜日

QuartusII システムコンソール Dashboard 2

DashboardのGUIからFPGA内のレジスタアクセスする例として、I2Cコントローラのレジスタを周期モニタしてDashboardに表示させることと、Dashboardの設定用Textboxから設定する機能を作りこんでみました。

 システムコンソール Dashboard I2Cレジスタモニタ、設定画面



 "Start Mon"プッシュでレジスタを周期的に読みDashboardに表示し、TextBoxに設定値を書いて、setを押すとレジスタの内容が書きかえます。
 細かい調整や画面デザインなどはこれから。

 下記が該当部のtcl記述になります。

proc count_g3 {group_name} {

variable dash

variable prescale_val
variable control_val
variable status_val
variable transmit_val
variable receive_val
variable command_val
variable timer_val

#  reg read and display

set i2c_baseadd 0x00000000

set i2c_prescale       [format "0x%08x" [expr $i2c_baseadd + 0x0 ] ] 
set i2c_ctrl         [format "0x%08x" [expr $i2c_baseadd + 0x4 ] ] 
set i2c_status       [format "0x%08x" [expr $i2c_baseadd + 0x8 ] ] 
set i2c_transmit     [format "0x%08x" [expr $i2c_baseadd + 0xc ] ] 
set i2c_receive       [format "0x%08x" [expr $i2c_baseadd + 0x10 ] ] 
set i2c_command       [format "0x%08x" [expr $i2c_baseadd + 0x14 ] ]
set i2c_timer       [format "0x%08x" [expr $i2c_baseadd + 0x40 ] ]

   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   # prescale
   set prescale_val [master_read_32 $mast $i2c_prescale 1]  
   dashboard_set_property $dash $group_name.prer_val text [format "0x%04x" [expr ($prescale_val)] ]
   # ctrl
   set control_val [master_read_32 $mast $i2c_ctrl 1]  
   dashboard_set_property $dash $group_name.ctrl_val text [format "0x%04x" [expr ($control_val)] ]
   # status 
   set status_val [master_read_32 $mast $i2c_status 1]  
   dashboard_set_property $dash $group_name.status_val text [format "0x%04x" [expr ($status_val)] ]
   # transmit
   set transmit_val [master_read_32 $mast $i2c_transmit 1]  
   dashboard_set_property $dash $group_name.transmit_val text [format "0x%04x" [expr ($transmit_val)] ]
   # receive
   set receive_val [master_read_32 $mast $i2c_receive 1]  
   dashboard_set_property $dash $group_name.receive_val text [format "0x%04x" [expr ($receive_val)] ]
   # command
   set command_val [master_read_32 $mast $i2c_command 1]  
   dashboard_set_property $dash $group_name.command_val text [format "0x%04x" [expr ($command_val)] ]
   # timer
   set timer_val [master_read_32 $mast $i2c_timer 1]  
   dashboard_set_property $dash $group_name.timer_val text [format "0x%04x" [expr ($timer_val)] ]
   
   after 1000 i2c_Control::count_g3 $group_name
 }

 proc set_prer {group_name} {

variable dash
variable set_prescale_val

set i2c_baseadd 0x00000000
set i2c_prescale       [format "0x%08x" [expr $i2c_baseadd + 0x0 ] ] 

   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   
   set set_prescale_val [format "0x%04x" [dashboard_get_property $dash $group_name.prer_wr_val text]]
   master_write_32 $mast $i2c_prescale $set_prescale_val
 }

 proc set_tx {group_name} {

variable dash
variable set_tx_val

set i2c_baseadd 0x00000000
set i2c_transmit     [format "0x%08x" [expr $i2c_baseadd + 0xc ] ] 

   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   
   set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.tx_wr_val text]]
   master_write_32 $mast $i2c_transmit $set_tx_val
 }

# gen_group3
#
proc gen_group3 { { group_name "myTab.g3" } } {
variable dash

dashboard_add $dash $group_name  group myTab
dashboard_set_property $dash $group_name itemsPerRow 2

# read reg 
#prer reg
dashboard_add $dash $group_name.prer label $group_name
dashboard_set_property $dash $group_name.prer text "Clock Prescale"
dashboard_set_property $dash $group_name.prer preferredWidth 30

dashboard_add $dash $group_name.prer_val label $group_name
dashboard_set_property $dash $group_name.prer_val text "-"
dashboard_set_property $dash $group_name.prer_val preferredWidth 30

#ctrl reg
dashboard_add $dash $group_name.ctrl label $group_name
dashboard_set_property $dash $group_name.ctrl text "Control"
dashboard_set_property $dash $group_name.ctrl preferredWidth 30

dashboard_add $dash $group_name.ctrl_val label $group_name
dashboard_set_property $dash $group_name.ctrl_val text "-"
dashboard_set_property $dash $group_name.ctrl_val preferredWidth 30

#status reg
dashboard_add $dash $group_name.status label $group_name
dashboard_set_property $dash $group_name.status text "Status"
dashboard_set_property $dash $group_name.status preferredWidth 30

dashboard_add $dash $group_name.status_val label $group_name
dashboard_set_property $dash $group_name.status_val text "-"
dashboard_set_property $dash $group_name.status_val preferredWidth 30

#transmit reg
dashboard_add $dash $group_name.transmit label $group_name
dashboard_set_property $dash $group_name.transmit text "Transmit"
dashboard_set_property $dash $group_name.transmit preferredWidth 30

dashboard_add $dash $group_name.transmit_val label $group_name
dashboard_set_property $dash $group_name.transmit_val text "-"
dashboard_set_property $dash $group_name.transmit_val preferredWidth 30

#receive reg
dashboard_add $dash $group_name.receive label $group_name
dashboard_set_property $dash $group_name.receive text "Receive"
dashboard_set_property $dash $group_name.receive preferredWidth 30

dashboard_add $dash $group_name.receive_val label $group_name
dashboard_set_property $dash $group_name.receive_val text "-"
dashboard_set_property $dash $group_name.receive_val preferredWidth 30

#command reg 
dashboard_add $dash $group_name.command label $group_name
dashboard_set_property $dash $group_name.command text "Command"
dashboard_set_property $dash $group_name.command preferredWidth 30

dashboard_add $dash $group_name.command_val label $group_name
dashboard_set_property $dash $group_name.command_val text "-"
dashboard_set_property $dash $group_name.command_val preferredWidth 30

#timer reg
dashboard_add $dash $group_name.timer label $group_name
dashboard_set_property $dash $group_name.timer text "Timer"
dashboard_set_property $dash $group_name.timer preferredWidth 30

dashboard_add $dash $group_name.timer_val label $group_name
dashboard_set_property $dash $group_name.timer_val text "-"
dashboard_set_property $dash $group_name.timer_val preferredWidth 30

# button 
dashboard_add $dash $group_name.bstart button $group_name
dashboard_set_property $dash $group_name.bstart text "Start Mon"
dashboard_set_property $dash $group_name.bstart onClick  "i2c_Control::count_g3  $group_name"


# reg edit
#prer reg
dashboard_add $dash $group_name.prer_wr label $group_name
dashboard_set_property $dash $group_name.prer_wr text "Clock Prescale"
dashboard_set_property $dash $group_name.prer_wr preferredWidth 30

dashboard_add $dash $group_name.prer_wr_val textField $group_name
dashboard_set_property $dash $group_name.prer_wr_val preferredWidth 60
 
dashboard_add $dash $group_name.prer_set button $group_name
dashboard_set_property $dash $group_name.prer_set text "Set"
dashboard_set_property $dash $group_name.prer_set onClick  "i2c_Control::set_prer $group_name"

dashboard_add $dash $group_name.null label $group_name

#transmit reg
dashboard_add $dash $group_name.tx_wr label $group_name
dashboard_set_property $dash $group_name.tx_wr text "Transmit"
dashboard_set_property $dash $group_name.tx_wr preferredWidth 30

dashboard_add $dash $group_name.tx_wr_val textField $group_name
dashboard_set_property $dash $group_name.tx_wr_val preferredWidth 60
 
dashboard_add $dash $group_name.tx_set button $group_name
dashboard_set_property $dash $group_name.tx_set text "Set"
dashboard_set_property $dash $group_name.tx_set onClick  "i2c_Control::set_tx $group_name"

}