2020年9月2日水曜日

STM32でDCC/DDCを作る方向で (55) 設計資料 44.1k/48kクロック切り替え

STM32でDCC/DDCを作ろう!            INDEXページへ

情報が間違っていても責任とらないし賠償とかしないです.

XC9536でbitclkを生成しています.

bitclkの源発振は2つのXTALを使い分けます.
  44.1kHz系列は45.1584MHzのXTAL
  48kHz系列は49.152MHzのXTAL

つまり、当deviceのサンプリング周波数を、44.1kHz→48kHzのように切り替えるとき、XTALを切り替えなくちゃいけません.これでちょっとした課題が生じます.

課題1
ロジック回路はむやみにclockを切り替えると誤動作する可能性があります.ヒゲのように細くて周波数が高いclockが入るとロジックは発狂するんですね.そこで、45M/49Mの切り替えには工夫が必要です.

課題2
使ってない方のXTALはオフしたい

課題3
XTALをオンした直後の起動時間がどれだけかかるのか不明(実測で0.3mSecなど)

対策
1)45M/49Mを切り替えたら、その後でロジックをresetする
2)STOP時には45M/49Mを両方ともONにしておく
3)再生開始時に不要なXTALをOFFする


ロジック回路のverilog codeはこのようにしてあります.

1)外部ピン xrstとPC9_resetの両方からresetできるようにする
assign xrst2 = xrst & ~PC9_reset;

always@(posedge clk or negedge xrst2)
  if(!xrst2) bck<=0;
  else if(seq_en) bck<=~bck;

2)XTALのenable信号を出力する   clk49en,clk45en
3)XTALのenableを両方ともONにできるようにする  PA12_clkbothon
assign clk49en = PB2_clksel | PA12_clkbothon;
assign clk45en = ~PB2_clksel | PA12_clkbothon;


STM32はGPIOを操作します.
45M/49Mの切り替え操作    →PB2_clksel 
HAL_GPIO_WritePin(FPGA_CKSEL_PRT, FPGA_CKSEL_BIT, (Fs_ctl&4)>>2 );

FPGAをresetする操作   →PC9_reset
HAL_GPIO_WritePin(FPGA_RESET_PRT, FPGA_RESET_BIT, 1);

XTALを両方ともONする操作(STOP時)  →PA12_clkbothon
HAL_GPIO_WritePin(FPGA_CKBON_PRT, FPGA_CKBON_BIT, 1); 

使っていないXTALをOFFする操作(再生開始時)  →PA12_clkbothon
HAL_GPIO_WritePin(FPGA_CKBON_PRT, FPGA_CKBON_BIT, 0); 


かしこ

0 件のコメント:

コメントを投稿