ラベル FPGA の投稿を表示しています。 すべての投稿を表示
ラベル FPGA の投稿を表示しています。 すべての投稿を表示

2012年8月3日金曜日

DSD信号のDACなし直接再生

以前からTwitter上でもLPFのみでDSD信号を再生する話題はあり、やってみようと思いつつも、回路構成がよくわからず試すことをためらっていましたが、このところ、新大陸への誘いさん や PCで音楽さん 始め多くの方がDSD信号をLPFのみで直接再生しているのを見て、とりあえず実験をしてみることにしました。

バランス回路化するとなると、みなさんの実験例をそのままともいかずで、試してみるにしてもやはりどうすれば良いのか悩んでいましたが、トランスを使うとローパスフィルタにもなり、トランスIVに近い回路構成でいけるのではないかと思いたち、お気楽さんの高速アイソレータは実現するのか?やぺるけさんの秋月電子のDACキットを使ったトランス式USB DACの回路構成を見つけ、参考にしつつ試して見ることにしました。

 まずは、シンプルにほとんどトランスのみ(トランスIV変換回路のまま)で実験を開始。
 下図のようにFPGA内でL/R各々4つの端子に正論理のまま、4つの端子に不論理に変換して接続してドライブ能力をアップしたプッシュ・プルの構成にしました。
 CycloneIVは3.3V Outの場合8mAまでしか設定できないようなのでデフォルトの8mAのままになっています。

       DSD直接再生回路構成

半田ブリッジや接触不良、コネクタ接続間違いなどでトラブりつつも、どうにか再生にこぎつけました。トランスの先はFET差動バランス型ヘッドホンアンプです。



 普通に綺麗に鳴っています。もしかするとトランスのみで、さらにローパスフィルタを追加しなくても良いかもしれません。

 あとは、直流カットコンデンサの要否、直列の抵抗を入れたほうが良いのかどうか、ローパスフィルタの追加要否、フィルタ回路、カットオフ周波数、これらを入れるとしたら片側のみか、正負両側に入れたほうが良いのか?などなど回路的にどう改良すれば良いのか、アドバイスいただけると助かります。

2012年6月24日日曜日

i2cマスタコントローラ実装

Matirx Switch FPGAにES9018やクロックIC等の制御のために、i2c master回路を実装しました。

 HiFiDuinoベースでAruduinoで制御するのが容易で手早いので、しばらくはAruduinoベースを考えていましたが、複数ES9018(6~12個)制御や、SystemConsoleからの、その時に応じた制御を考えFPGAに実装することにしました。


まずはSystemControlで、PCから制御できるようにすることを目指し、デバッグ用にslave回路を同じMatirx Switch FPGAに実装して、外部でプルアップとともに、master⇔slaveのピンを接続して確認。
SystemControlにレジスタの周期モニタ機能、レジスタ直接書込、1byteReadアクセス、1byteWriteアクセスの各機能を作り込み、徐々に調整しながらなんとかデバック用Slave回路の1byteReadアクセス、1byteWriteアクセスが出来るようになりました。
 
SystemConsole i2cコントローラ画面


続いてES9018(BuffaloII)の初期設定、レジスタモディファイ、ボリュームコントロールができるようにしていく予定です。
最終的には、PC接続なしでもNiosIIで制御することで初期設定等ベーシックな動作はできるようにし、細かい設定調整はSystemControlからの制御出来るようにする予定です。


2012年6月18日月曜日

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

昨日まででSCD-XE600単独での再生が確認できましたが、いくつか微調整を行いました。


 ・モード設定レジスタの初期値をデザイン毎に個別指定

   SACDP DSD ADAT転送ボード、MatrixSW、モバイルDDC、各々のモードでの通常設定値は異なるので、通常設定値が初期値にできるように変更。
   今回は、SystemVerilogのInterfaceで初期値を外部モジュール(使用形態毎の別ファイル)で設定するようにしてみました。


 ・SDカードプレイヤー用設定/ステータスレジスタ別モジュール化

    SACDP DSD ADAT転送ボードには、必要ない機能であり、またレジスタモジュールが結構大きくなってきたので、分離しました。


 ・クロック自動切替え機能

    MatrixSWから 11.289600MHz クロックを供給して動作しますが、MatrixSWからのクロック供給が無いとき、SCD-XE600が動作できなくなるだけでなく、その後クロック供給が復旧しても正常に動作しないようです。
   MatrixSWからのクロック供給が無い場合、SACDP DSD ADAT転送ボード内のCXOを元に11.289600MHz をSCD-XE600基板に供給できるようにしないと、立ち上げ手順が必要になるなどいろいろ使い勝手が悪くなります。

  今回はCycloneIVのPLLのクロック スイッチオーバー機能を使いました。2つのクロックソースを切り替えられる機能です。この機能は、自動とマニュアルがありますが、どちらも選択中のクロックソースが正常ならば、選択中のクロックを選択し続け、MatrixSWからのクロックが断状態から復旧してもスイッチオーバは発生しません。
  clkbad0およびclkbad1という各入力クロックの状態を示す信号と、Activeclockという選択中のリファレンスクロックを示す信号により、ボード内のCXO選択中にclkbad0が"0"(正常)になったら、clkswitchというクロックマニュアル切り替え信号をアサートするロジックを追加しました。

 これにより、MatrixSWからのクロック供給が無いときは、ボード内のCXO、MatrixSWからのクロック供給があるときはMatrixSWからのクロックを選択して、PLLが同動作し、11.289600MHz、 22.579200MHz  、 90.3168MHzを生成します。

 実際にMatrixSWからのクロック供給が無い状態で、SCD-XE600の電源スイッチをOFF⇒ONさせても正常に起動し、その後にMatrixSWからのクロック供給を行うとリファレンスがMatrixSWからのクロックに切り替わるようになりました。



クロックスイッチオーバー回路


下図が現状の構成です。未だL/Rチャネルだけで5.1ch転送はサポートできていません。

SACDP DSD ADAT転送ブロック図


 このあと、MatrixSWと接続し、MatrixSWに接続したBuffaloIIでの再生もできることまで確認しました。

 もうひとつ、DE0-nanoのUSBコネクタを引き出せるようにしたいので、 SCD-XE600 の右側面カバーに丸い穴を開けました、位置をかなり雑に決めたため結構ずれてしまい、シャーシパンチで穴を広げてなんとか挿せるように..orz


DE0-nano USBコネクタ用ホール

 とりあえず一段落、そのうち5.1ch転送も作り込みます。

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の再生を目指します。

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月21日土曜日

PSoC 3本

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


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


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


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




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

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"

}