2012年5月28日月曜日

SACDプレーヤー DSDデータ伝送2

TOSLinkボードを組み立てたので、SACDプレイヤーからのDSD転送について作成を進めています。
 いきなりSACDPからのデータ抽出だと、うまく動作していないと解析困難になるため、とりあえずADATによるSACDPからMatrixSWへのデータ転送がうまくできるかを確認しました。

 確認手段として、SACDプレイヤーからのDSD信号の代わりにPCからDoPでDSDデータを出力し、それをSACDP用DDC FPGAからMatrixSW FPGAへ転送してみました。

 MatrixSW側から11.2896MHzクロックをTOSLinkで転送し、SACDP DDC FPGAのPLLで22.5792MHz、90.3168MHzを生成して動作させます。


SACDプレイヤー⇒MatrixSW ADAT転送の確認

最初1台のPCでSACDP DDC FPGAとMatrixSW FPGAのコンフィグ、SignalTapII、SystemConsoleを制御していましたが、SystemConsoleの制御がどうもうまくいかないようで、MatrixSW FPGAを制御しているつもりがSACDP DDC FPGAを制御していたりしているようなので、ノートPCにQuartusII 11.1sp2をインストールしてPCとFPGAが1対1になるようにしてようやくうまく出来るようになりました。

 次は、SACDプレイヤーにSACDP DDC FPGAを取り付けて実際に確認してみます。

2012年5月27日日曜日

TOSLinkボード2

TOSLinkボードが届きました。


 TOSLinkボード 生板

下のはSACDPへ搭載用で、Tx 2個、Rx 2個実装してあります。DE0nanoのGPIO1コネクタに刺してスタック。SACDPのシャーシ背面にTOSLinkのネジ穴を利用して固定する予定。

MatixSW用は、Tx 3個、Rx 3個を3枚用意する予定です。

 TOS Link基板 SACDP用の実装(Tx2個、Rx2個)

 TOS Link基板 SACDP用の実装(Tx2個、Rx2個)

2012年5月25日金曜日

DoPをADATで トランスミッタもDoPに対応に

ADATトランスミッターもDoP転送に対応させました。
 これでSACDプレイヤーからMatrixDACへのDSD転送をとりあえずステレオ2ch分については確保できるようになります。



     ADAT DoP対応トランスミッタ確認系

 確認はまず、Foobar2000でDoPフォーマットに変換したDSDファイルを再生し、図の青線ルートでPC⇒MatrixSW⇒PC さらに折り返して水色のルートでPC⇒MatrixSW⇒BuffaloIIに流しこみ再生できるかを試し、何件かのバグを修正して正しく再生できることを確認しました。


 DIGICheck Global Record (DoP録音中)

 続いてPCへリターンを録音して、それを再生できるかを試してみました。
 録音には、DAW系だと一旦浮動小数点に変換して処理されビットパーフェクトでは無くなる可能性があるので、RMEのオーディオIF附属のソフト、DIGICheckのGlobal Recordを使ってみました。

 録音は、PCMデータとし扱われるため、当然DoP化されたDSDがPCMデータとして録音されます。
 再生してみると、ちゃんと再生できました。



  DIGICheckユーザガイド

RMEのオーディオインタフェースにDIGICheckのマニュアルは付いて来ませんが、DIGICheckの日本語マニュアルが、送料は除き無料で取り寄せることができます。

2012年5月22日火曜日

CHORD DSD対応DAC "Qute HD"

CHORDのDSDネイティブ再生対応DAC"Qute HD"の詳細がニュースリリース等で発表されました。
詳細については、Music TO GO!さんの記事にかなり詳しく書かれています。

 仕様で気になった点について、

 ①SPDIF: 44.1 kHz/ 384kHz 対応可能 , 16-32 bit
   
 SPDIFで、384kHz対応、かつ32bitにも対応とあります。
 TOSLinkについてもなのかどうかがよくわからない書き方ですが、少なくとも同軸は対応。
 もし、TOSLinkで32bit@384kHz対応しているなら、そのような伝送帯域を持つTOSLinkがあることになり俄然注目です。と思ったらこちらに192kHz対応と書いてありました..orz
 TOSLinkは対象外だとしても、AES/SPDIFで32bit対応というのは、通常の規格では24bitまでで出来ません。新しい規格ができたのか? 32bit対応というのは、DSDを意識してのことなのか?等々気になります。


 ②SPDIFを持つDoP対応機器であること
  
 DoP対応は ニュースリリース のSpecの書き方からするとUSBのみと思われますが、FPGA搭載していることもあるので、SPDIFでDoP対応するのも容易のはず。もしかするとSPDIFでもDoP対応している、あるいは将来的に対応するかもしれません。
 Music TO GO!さんの記事に ”光入力に対してもしっかり作り込んで、トランスポートと電気的に切り離せる光の利点を積極的に利用できるとうたっています。”とあり、光のメリットについても考慮されているところは、好感がもてます。




Qute HD

内部の写真を見ると、FPGAと思われるBGAのチップとメモリ(1.5秒分のバッファメモリか?)らしきチップと、パルスアレイDAC回路ぐらいでとてもシンプルな回路構成に見えます。
WTAフィルターを含みほとんどの論理回路はFPGAで構成していると思われます。

2012年5月20日日曜日

SACDプレーヤー DSDデータ伝送

DoPの実装に並行して、SACDP(SCD-XE600)からのDSDデータをMatrixSWへ収容し、DSD環境を整備してしまおうと計画しています。以前から計画していましたがようやく着手を考え出します。

SACDプレイヤー側に追加するのは、DE0-nanoとTOSLinkボード

SACDプレイヤーからのデータの抜き出しは、DSD Phase Modulation Mode 受信回路で以前作成して動作確認している回路を使用。


プレイヤーからMatrixSWへの伝送は、以前、SACDPからの5.1ch DSDデータの転送方法で検討していた方法を基本にしようと考えていますが、先ずは、2chをDoPモードのADAT 1本で、その後、ADAT 2本で5.1chの伝送を出来るようにしたいと思います。
 ADATの倍速化はとりあえず見送り、通常のADAT転送レート(11.2896Mbit/s)2本で、3ch/1本で転送し、倍速化は2本での5.1ch伝送が確立できてから考えたいと思います。


 クロックは、MatrixSW側からTOSLinkで11.2896Mbit/sを送り込みます。SCD-XE600の11.2896Mbit/sのCXOを外し、そこへ接続して同期をとります。このCXOの取り外しを一番懸念しています。失敗するとSCD-XE600が動かなくなるので...
 クロックマスタは、なるべくDACに近づけたいのでSACDプレイヤー側ではなく、MatrixSW側に置きます。


      SACDP DSDデータ伝送構成

 来週末にはTOSLinkボードが到着しそうなので、それから具体的に着手予定です。

2012年5月13日日曜日

電流伝送DAコンバーター

MJ 無線と実験 6月号に金田明彦さんの電流伝送D/Aコンバーター[前編]が載っています。



今考えているマルチチャネル再生システムとして、
・デジタルドメインでなるべく処理(チャネルデバイダ、ボリューム処理etc)し、高精度、歪の元をなるべく排除
・アナログドメインはできるだけシンプルかつフルバランス構成

 を目標としたいので、電流出力のDACチップのIV変換をなくして電流伝送とし、プリアンプなしで、Powerアンプ部でIV変換(金田さんはPowerIVCと呼んでいるようです)かつ増幅する構成を最終的な目標として考えています。

 今まで、SATRI-ICで電流伝送ができるみたいなので、SATRI-ICで構成することをぼんやりと想定していましたが、こちらの記事の回路をベースにするのもよさそうです。
 

 記事によると、DACを電流伝送出力としてPowerIVCとすると、ものすごく効果があるとのこと。
 しかし、記事ではDACチップとしてPCM1794を採用していますが、電源が+7.2V,-4.8Vの本機では2パラのドライブは出来ないとあります。ES9018だと1チップで4パラですので、このままではダメなのかもしれません。
 
 また今回の記事は、想定にかなり近いですが、PoewrIVCも含めフルバランスではありません。
 フルバランス化するには、どこをどう変更すればよいかは、アナログ不案内もので良くわかりません。
 
 まだまだ課題がありそうですが、このへんうまくクリアして作りたいですね。

2012年5月12日土曜日

TOSLinkボード

長い間中断していたマルチチャネルDACシステムの中核となるMatrix Switchを、DoPのサポートや、SACDPとの接続をきちんとできるように、そろそろ製作を再開させようとしています。当初案からかなり変遷してきていますが...

手始めにTOSLinkのインタフェース基板を作りFusionPCBに手配しました。
一枚で、TOTX 3個、TORX 3個実装するようにしており、DE0-nanoのGPIOコネクタで接続できるようにしています。
これを2枚使い、TOTX 6個、TORX 6個実装します。2枚目は、1枚目を経由してDE0-nanoと接続します。
その他拡張コネクタも2個付けておきました。

 TOSLink インタフェースボードパターン図(ベタアースなし)


 TOSLink インタフェースボード 3D A面


TOSLink インタフェースボード 3D B面

2012年5月11日金曜日

XuLA-200 到着

XuLA-200が到着しました。5月4日にオーダーして一番安いUSPSで5月10日に届いたようなので6日で到着と以外と早く到着しました。
費用の内訳は下記で、本体以外にXSTOOLSのCDも購入しています。 

  XuLA-200    XuLA Board with 200-thousand gate Spar    $  55.00 
  XSTOOLS-CD  CDROM with XSTOOLS software utilities   $    2.00  
                                                                                Shipping  $     3.78
                                                                                      Total  $   60.78



XuLA-200 表面


XuLA-200 裏面 




XSTOOLs CD


 とりあえず、CDから各Toolをインストールしました。
 gxstestで診断テストが、gxsloadでFPGAコンフィグファイルのダウンロードができるようです。なにぶんシンプルなボードなので、サンプルファイルで簡単に動作を見ることはできなさそうです。


gxstest

ファイルをドラッグしてLoadボタン押すとFPGAへダウンロードされる
gxsload

 ISE14.1からSDKをISE WebPACKでも使えるようになったらしいので、MicroBlaze も使えそうでXilinxを使いやすくなりました。ただしあいかわらずChipScope Proは使えないところは痛いです。

2012年5月7日月曜日

DoPをADATで DSD64/DSD128/PCMの自動切替

DoPのDSD Marker 0x05/0xFA:DSD64 0x06/0xF9:DSD128 左記以外:PCMというロジックでDSD64,DSD128,PCMの自動切り替えを実装しました。
全く保護を取らないのは、意図しない切り替えが発生する可能性が高まるので、デフォルト連続3回検出でモード切替を実行するようにしました。

 また、FPGAのアーキテクチャとして、任意数の入力ポートと出力ポートをMatrixSwitchを介して接続する構成をとっていることと、DSD128の時はADAT2portを使用し、それらを連動させること、また入力ポート側のモード変更検出で出力ポートもモード変更が必要になるので入力ポート0をマスタポートとし、このポートのDSD Markerのみを監視して制御するようにしました。

 なんとかDSD Marker識別で自動的に切り替わるようになりましたが、モード切替時には、ポツッとノイズがのります。
 次はこれをどうやって消すかですが、今のところ妙案はありません。

2012年5月4日金曜日

XuLA-200

bunpeiさんからkoonaudioprojectsというDIYでPCでのマルチチャネルやDSD再生など色々と取り組まれているサイトをご紹介いただきました。

 こちらはこちらでとても興味深いので、これから詳細に見させてもらおうと思いますが、プロジェクトのひとつ USB to Multi Channel I2S USB2.0 24channelsというので、XuLA-200(発音は "ZOO-LAH”)というXC3S200A の搭載されたFPGAボードを使われているようです。
 デザイン移行のことを考えるとAlteraのでこういうのがあるとありがたいのですが...
 $55と安価で、小さくてブレットボードに刺して使え、SDRAMとUSBポートも搭載しているので、モバイル向けにはなかなかよさそうなので、ポチってみました。

 XuLA-200


XuLA-200 ブロック図
 

 

DDC FPGAの設定用 システムコンソール

 現在ADATによるDoPの実現を目指しているDDCや、デジタルIF間のスイッチングを制御するMatirx Switch機能の設定レジスタを操作するシステムコンソールを作成しました。

 とりあえず[Dump]ボタンを押すと、各レジスタの現在値を読み出し表示し、設定を変更したいレジスタの値を書き換えて[Modify]ボタンを押すと、設定レジスタの値を書き換えるようにしました。

 ループで組んであるので、入出力ポート数の増減は、ループ数を変えるだけで対応できます。

 最終的にはFPGAの制御方法として、PCからシステムコンソール経由、NiosIIによるプログラム制御、I2Cスレーブポート経由で、Aruduinoやmbet等の外部コントローラ経由で制御の3系統での制御ができるようにするつもりで、目的に応じ、QsysにJtag to Avalon Master Bridge 、NiosII、I2C Slave Controllerを搭載することで可能にする予定です。

 そのうち、プルダウンメニューから設定したいパラメータを選択して設定したり、レジスタ値そのものではなく、値の示すモードを表示出来るようにしたいとは思っています。


システムコンソール SW Matrix Config

tclファイル

namespace eval SW_Matrix_Control {


variable dash [add_service dashboard SW_Matrix_Control "SW_Matrix_Control" "Tools/Dashboard"]


dashboard_set_property $dash self developmentMode true
dashboard_set_property $dash self itemsPerRow 1


# Config Register Modify 
 proc set_cfg {group_name} {


   variable dash
   variable set_tx_val


   set cfg_baseadd 0x00008000


   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   #ssampling rate
   set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.comcfg_rate_val text]]
   master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + 0x000 ] ] $set_tx_val

   for {set i 0} {$i < 2} {incr i} {      
      #Rx Port enable
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.rxcfg_enb_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x400 ] ] $set_tx_val
      #Rx Mode
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.rxcfg_mode_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x404 ] ] $set_tx_val
      #DoP mode  
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.rxcfg_dop_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x408 ] ] $set_tx_val   
   } 
   for {set i 0} {$i < 2} {incr i} {      
      #Tx Port enable
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.txcfg_enb_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x420 ] ] $set_tx_val
      #Buf Mode
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.txcfg_bufmode_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x424 ] ] $set_tx_val
      #Tx Mode  
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.txcfg_mode_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x428 ] ] $set_tx_val
      #i2s mode
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.txcfg_i2s_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x42c ] ] $set_tx_val
      #Input port
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.txcfg_port_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x430 ] ] $set_tx_val
      #Input TS  
      set set_tx_val [format "0x%04x" [dashboard_get_property $dash $group_name.txcfg_ts_val${i} text]]
      master_write_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x434 ] ] $set_tx_val 
   }   
 } 
# Config Register Dump 
 proc read_cfg {group_name} {


   variable dash
   variable read_val


   set cfg_baseadd 0x00008000


   set mast [lindex [get_service_paths master] 0]
   open_service master $mast
   #ssampling rate 
   set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + 0x000 ] ] 1]  
   dashboard_set_property $dash $group_name.comcfg_rate_val text [format "0x%04x" [expr ($read_val)] ]
   
   for {set i 0} {$i < 2} {incr i} {      
      #Rx Port enable
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x400 ] ] 1]  
      dashboard_set_property $dash $group_name.rxcfg_enb_val${i} text [format "0x%04x" [expr ($read_val)] ]
      #Rx Mode
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x404 ] ] 1]  
      dashboard_set_property $dash $group_name.rxcfg_mode_val${i} text [format "0x%04x" [expr ($read_val)] ]   
      #DoP mode 
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x408 ] ] 1]  
      dashboard_set_property $dash $group_name.rxcfg_dop_val${i} text [format "0x%04x" [expr ($read_val)] ]   
   }


   for {set i 0} {$i < 2} {incr i} {      
      #Tx Port enable
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x420 ] ] 1]  
      dashboard_set_property $dash $group_name.txcfg_enb_val${i} text [format "0x%04x" [expr ($read_val)] ]
      #Buf Mode
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x424 ] ] 1]  
      dashboard_set_property $dash $group_name.txcfg_bufmode_val${i} text [format "0x%04x" [expr ($read_val)] ]   
      #Tx Mode   
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x428 ] ] 1]  
      dashboard_set_property $dash $group_name.txcfg_mode_val${i} text [format "0x%04x" [expr ($read_val)] ]   
      #i2s mode
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x42c ] ] 1]  
      dashboard_set_property $dash $group_name.txcfg_i2s_val${i} text [format "0x%04x" [expr ($read_val)] ]
      #Input port
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x430 ] ] 1]  
      dashboard_set_property $dash $group_name.txcfg_port_val${i} text [format "0x%04x" [expr ($read_val)] ]   
      #Input TS   
      set read_val [master_read_32 $mast [format "0x%08x" [expr $cfg_baseadd + $i*0x40 + 0x434 ] ] 1]  
      dashboard_set_property $dash $group_name.txcfg_ts_val${i} text [format "0x%04x" [expr ($read_val)] ]   
   
   } 
   
 }  

# gen_group4 --
#
proc gen_group4 { { group_name "myTab.g4" } } {
   variable dash

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


   # Common config reg
   dashboard_add $dash G_com_cfg  group $group_name 
   dashboard_set_property $dash G_com_cfg title "Common Config Register"
   dashboard_set_property $dash G_com_cfg itemsPerRow 2
   #ssampling rate
   dashboard_add $dash $group_name.comcfg_rate label G_com_cfg
   dashboard_set_property $dash $group_name.comcfg_rate text "Sampling rate"
   dashboard_set_property $dash $group_name.comcfg_rate preferredWidth 60


   dashboard_add $dash $group_name.comcfg_rate_val textField G_com_cfg
   dashboard_set_property $dash $group_name.comcfg_rate_val preferredWidth 60
   
   dashboard_add $dash G_com_comment  group $group_name 
   dashboard_set_property $dash G_com_comment title ""
   dashboard_set_property $dash G_com_comment itemsPerRow 1


   dashboard_add $dash $group_name.comcfg_comment1 label G_com_comment
   dashboard_set_property $dash $group_name.comcfg_comment1 text "Sampling rate: 0:44.1k 1:88.2k 2:176.4k 3:352.8k"
   dashboard_set_property $dash $group_name.comcfg_comment1 preferredWidth 200
   
   # Rx port config reg 
   dashboard_add $dash G_Rx_cfg  group $group_name 
   dashboard_set_property $dash G_Rx_cfg title "Rx Config Register"
   dashboard_set_property $dash G_Rx_cfg itemsPerRow 4


   dashboard_add $dash $group_name.rxcfg_port label G_Rx_cfg
   dashboard_set_property $dash $group_name.rxcfg_port text "Port#"
   dashboard_set_property $dash $group_name.rxcfg_port preferredWidth 50


   dashboard_add $dash $group_name.rxcfg_enb label G_Rx_cfg
   dashboard_set_property $dash $group_name.rxcfg_enb text "Enable"
   dashboard_set_property $dash $group_name.rxcfg_enb preferredWidth 60


   dashboard_add $dash $group_name.rxcfg_mode label G_Rx_cfg
   dashboard_set_property $dash $group_name.rxcfg_mode text "Rx mode"
   dashboard_set_property $dash $group_name.rxcfg_mode preferredWidth 60


   dashboard_add $dash $group_name.rxcfg_dop label G_Rx_cfg
   dashboard_set_property $dash $group_name.rxcfg_dop text "DoP mode"
   dashboard_set_property $dash $group_name.rxcfg_dop preferredWidth 60


   for {set i 0} {$i < 2} {incr i} {


      dashboard_add $dash $group_name.port_no label G_Rx_cfg
      dashboard_set_property $dash $group_name.port_no text "Port \#$i"
      dashboard_set_property $dash $group_name.port_no preferredWidth 50


      #Rx Port enable
      dashboard_add $dash $group_name.rxcfg_enb_val${i} textField G_Rx_cfg
      dashboard_set_property $dash $group_name.rxcfg_enb_val${i} preferredWidth 60  
      #Rx Mode
      dashboard_add $dash $group_name.rxcfg_mode_val${i} textField G_Rx_cfg
      dashboard_set_property $dash $group_name.rxcfg_mode_val${i} preferredWidth 60
      #DoP mode
      dashboard_add $dash $group_name.rxcfg_dop_val${i} textField G_Rx_cfg
      dashboard_set_property $dash $group_name.rxcfg_dop_val${i} preferredWidth 60
   }


   # Tx port config reg 
   dashboard_add $dash G_Tx_cfg  group $group_name 
   dashboard_set_property $dash G_Tx_cfg title "Tx Config Register"
   dashboard_set_property $dash G_Tx_cfg itemsPerRow 7


   dashboard_add $dash $group_name.txcfg_port label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_port text "Port#"
   dashboard_set_property $dash $group_name.txcfg_port preferredWidth 50


   dashboard_add $dash $group_name.txcfg_enb label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_enb text "Enable"
   dashboard_set_property $dash $group_name.txcfg_enb preferredWidth 60


   dashboard_add $dash $group_name.txcfg_bufmode label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_bufmode text "Buf mode"
   dashboard_set_property $dash $group_name.txcfg_bufmode preferredWidth 60


   dashboard_add $dash $group_name.txcfg_mode label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_mode text "Tx mode"
   dashboard_set_property $dash $group_name.txcfg_mode preferredWidth 60


   dashboard_add $dash $group_name.txcfg_i2s label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_i2s text "i2s mode"
   dashboard_set_property $dash $group_name.txcfg_i2s preferredWidth 60


   dashboard_add $dash $group_name.txcfg_port label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_port text "Input Port"
   dashboard_set_property $dash $group_name.txcfg_port preferredWidth 60


   dashboard_add $dash $group_name.txcfg_ts label G_Tx_cfg
   dashboard_set_property $dash $group_name.txcfg_ts text "Input Timeslot"
   dashboard_set_property $dash $group_name.txcfg_ts preferredWidth 60


   for {set i 0} {$i < 2} {incr i} {


      dashboard_add $dash $group_name.port_no label G_Tx_cfg
      dashboard_set_property $dash $group_name.port_no text "Port \#$i"
      dashboard_set_property $dash $group_name.port_no preferredWidth 50


      #Tx Port enable
      dashboard_add $dash $group_name.txcfg_enb_val${i} textField G_Tx_cfg
      dashboard_set_property $dash $group_name.txcfg_enb_val${i} preferredWidth 60  
      #Buf Mode
      dashboard_add $dash $group_name.txcfg_bufmode_val${i} textField G_Tx_cfg
      dashboard_set_property $dash $group_name.txcfg_bufmode_val${i} preferredWidth 60
      #Tx Mode
      dashboard_add $dash $group_name.txcfg_mode_val${i} textField G_Tx_cfg
      dashboard_set_property $dash $group_name.txcfg_mode_val${i} preferredWidth 60
      #i2s mode
      dashboard_add $dash $group_name.txcfg_i2s_val${i} textField G_Tx_cfg
      dashboard_set_property $dash $group_name.txcfg_i2s_val${i} preferredWidth 60
      #Input port
      dashboard_add $dash $group_name.txcfg_port_val${i} textField G_Tx_cfg
      dashboard_set_property $dash $group_name.txcfg_port_val${i} preferredWidth 60
      #Input TS
      dashboard_add $dash $group_name.txcfg_ts_val${i} textField G_Tx_cfg
      dashboard_set_property $dash $group_name.txcfg_ts_val${i} preferredWidth 60
   }
   # Rx Config Comment
   dashboard_add $dash G_Rx_comment  group $group_name 
   dashboard_set_property $dash G_Rx_comment title ""
   dashboard_set_property $dash G_Rx_comment itemsPerRow 1
 
   dashboard_add $dash $group_name.rxcfg_comment1 label G_Rx_comment
   dashboard_set_property $dash $group_name.rxcfg_comment1 text "Enable: 1:enable 0:disable"
   dashboard_set_property $dash $group_name.rxcfg_comment1 preferredWidth 400
   dashboard_add $dash $group_name.rxcfg_comment2 label G_Rx_comment
   dashboard_set_property $dash $group_name.rxcfg_comment2 text "Rx mode: 0:ADAT 2:AES 16:i2s 1e:DSD"
   dashboard_add $dash $group_name.txcfg_comment3 label G_Rx_comment
   dashboard_set_property $dash $group_name.txcfg_comment3 text "DoP mode: 0:Off 2:DSD64 4:DSD128_L 5:DSD128_R 8:Auto_L 9:Auto_R"


   # Tx Config Comment
   dashboard_add $dash G_Tx_comment  group $group_name 
   dashboard_set_property $dash G_Tx_comment title ""
   dashboard_set_property $dash G_Tx_comment itemsPerRow 1
 
   dashboard_add $dash $group_name.txcfg_comment1 label G_Tx_comment
   dashboard_set_property $dash $group_name.txcfg_comment1 text "Enable: 1:enable 0:disable"
   dashboard_set_property $dash $group_name.txcfg_comment1 preferredWidth 400
   dashboard_add $dash $group_name.txcfg_comment2 label G_Tx_comment
   dashboard_set_property $dash $group_name.txcfg_comment2 text "Buf mode: 0:es_mode 1:sdb_mode 2:sdmc_mode "
   dashboard_add $dash $group_name.txcfg_comment3 label G_Tx_comment
   dashboard_set_property $dash $group_name.txcfg_comment3 text "Tx mode: 0:ADAT 2:AES 16:i2s e:DSD"
   dashboard_add $dash $group_name.txcfg_comment4 label G_Tx_comment
   dashboard_set_property $dash $group_name.txcfg_comment4 text "i2s mode: 0:rj24 1:i2s24 2:lj24 3:i2s32 4:dsd"
   dashboard_add $dash $group_name.txcfg_comment5 label G_Tx_comment
   dashboard_set_property $dash $group_name.txcfg_comment5 text "Rx Port: (15:12)(11:8)(7:4)(3:0) Rx port No.   44.1k 4ch 88.2k 2ch 176.4k 1ch"
   dashboard_add $dash $group_name.txcfg_comment6 label G_Tx_comment
   dashboard_set_property $dash $group_name.txcfg_comment6 text "Rx TS:   (7:6)(5:4)(3:2)(1:0) Rx Time Slot No. 44.1k 4ch 88.2k 2ch 176.4k 1ch"


   dashboard_add $dash G_Rx_cfg_action  group $group_name 
   dashboard_set_property $dash G_Rx_cfg_action title "Config Register Action"
   dashboard_set_property $dash G_Rx_cfg_action itemsPerRow 1
   
   # Dump Button
   dashboard_add $dash $group_name.rxcfg_read button G_Rx_cfg_action
   dashboard_set_property $dash $group_name.rxcfg_read text "Dump"
   dashboard_set_property $dash $group_name.rxcfg_read onClick  "SW_Matrix_Control::read_cfg $group_name"
   # Modify Button
   dashboard_add $dash $group_name.rxcfg_set button G_Rx_cfg_action
   dashboard_set_property $dash $group_name.rxcfg_set text "Modify"
   dashboard_set_property $dash $group_name.rxcfg_set onClick  "SW_Matrix_Control::set_cfg $group_name"  


}
# tabbedGroup
dashboard_add $dash myTab tabbedGroup self
dashboard_set_property $dash myTab preferredWidth 1024
dashboard_set_property $dash myTab preferredHeight 500


# Create Grourps
gen_group4 "MatrixSW_Config"


}





2012年5月2日水曜日

DoPをADATで DSD128の再生成功

 DSD64に続きDSD128の再生を確認することが出来ました。ノイズなしで綺麗に再生できています。
 構成は、Foober2000=>RME RayDAT=>DE0nano(FPGAボード)=>BuffaloII とDSD64と同じですが、 RME RayDAT=>DE0nano のADATラインを1本から2本に増やし、L/Rチャネル各1本ずつ使用する構成になっています。
 再生ファイルは、AudioGateでDSD128に変換し、その後YUKI-SAN の DSD to PCM ConverterでMSB8bitのDSD Marker 0x06 and 0xF9のDoPファイルへ変換したものです。


DoPをADATでDoP DSD128のチャネルマッピングと受信後のフォーマット変換 の図が間違っていたので差し替えましたが、LchとRch交互にマージ剃る必要があるため、ADATの場合、Lch 4sample  Rch 4sampleという順で並んでいる場合、32bitにマージするには、4sample分保持しておく必要があります。回避するために、メモリへの書き込みをUpper側16bit(Lch)とLower側16bit(Rch)を個別に行うことにしました。



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


 上図のようにADATの通常Lchに当たる部分は、アドレスをインクリメントしながらバッファメモリ32bit中Upper側には書き込み、その後Rchに当たる部分は、アドレスを4つ戻してバッファメモリ32bit中Lower側に書き込むようにしました。
 
  DSD64時も同じような制御になるように変更しました。


 ADAT DoP DSD128再生時のSignalTapII波形


 上図、青○が、AES/SPDIF等DSD128の帯域を1本ではカバーできない伝送ライン時用のDoPのDSD Marker 0x06 and 0xF9でその下の緑枠および水色枠がDSDデータです。2本のADATのDSD Markerは同じパターンが現れています。
 Upper側とLower側16bitに同じデータを用意し、byteenableでUpper側かLower側のどちらか片方のみ書くようにしています。図はUpper側書込が終わりLower側書込に移ったところになります。

 一番下の3つがDSD出力で、BCLKがDSD64時よりも半分の変化点になり、LRCK(DSD Lch)とSDATA(DSD Rch)もそれに合わせて変化しているのが見て取れます。


2012年5月1日火曜日

DoPをADATで DSD64の再生成功

DSD64の再生を確認することが出来ました。ノイズなしで綺麗に再生できています。
 構成は、Foober2000=>RME RayDAT=>DE0nano(FPGAボード)=>BuffaloII
 RME RayDATがビットパーフェクトであるか若干不安でしたが、大丈夫そうです。


  DoP DSD64再生中のRME RayDAT HDSP Mixer画面 
   左下がADAT出力で、DSDデータのためメータの出力レベルは固定されています

  ADAT DoP DSD64再生時のSignalTapII波形


 上図、青○が、DoPのDSD Marker 0x05 and 0xFAでその下の緑枠および水色枠がDSDデータ、緑枠の599Aと水色枠のAB33パターンをマージして32bit化してバッファへ書き込んでいます。

 下の茶枠の部分がDSD出力で、BCLKに対し、LRCK(DSD Lch)とSDATA(DSD Rch)が変化しており、PCMではなくDSDパターンとなっていることがわかります。

 次は、DSD128の再生を目指します。