2020年9月1日火曜日

STM32でDCC/DDCを作る方向で (51) 設計資料 LRCK生成logic回路

告知です.
コミケ99にて当社のDDC/DACを頒布いたします.
  日付   2021年12月31日(金) 東地区 テ-40b  東5ホール
  サークル名    bangflat
コミケにお越しの際はお立ち寄りいただけますとありがたいです.
商品紹介ページを作りました.
ーーーー

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

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

audio data flowを追って説明中です.

前回、STM32のSPIからserial audio dataが出てゆくところまではdata flowの説明をできました.

data flowの最後の部分に、LRCKを生成するロジック回路があります.
STM32のSPIから出たaudio dataはXC9536を経由してPCM5101 DACへ流れてゆきます.
今回はXC9536のロジック回路の説明です.XC9536がLRCKを作ります.

XC9536のproject folder詰め合わせはこちらに置きました.XILINX ISE13.3を使っています.

その中にあるtop.vがverilog fileです.

LRCK生成のためにやっている事は単純で、SPI再生開始の先頭bitを捉えて、32bit毎にLRCKを反転させる です.
再生先頭部分のtiming chartはこうなっています.先行してbitclkを1発出すとか、clk極性とか細かい実装は試行錯誤で決めてます.

top.vのLRCK生成箇所を抜き出します.

↓bckを生成しています.bckはDACへ接続されます.
bck=64Fsです.Fs=384kHzのとき、bckは24.576MHzです.
源発振XTAL=49.152MHzなのでFs=384kHzのときはXTALを2分周すればbckを作れます.分周比はFsによって変わります.分周enablerがseq_enです.別途作っています.
reg bck;
always@(posedge clk or negedge xrst2)
if(!xrst2) bck<=0;
else if(PC8_restart_rr) bck<=0;
else if(seq_en) bck<=~bck;

↓sckはSPIへ接続されます.bckよりも半周期遅れているところがミソです.
reg sck;
always@(posedge clk or negedge xrst2)
if(!xrst2) sck<=0;
else if(PC8_restart_rr) sck<=0;
else if(seq_en) sck <= bck;

↓sckcntはsckをカウントしてLRCKを作る源です.reset時に122にセットされるところが位相合わせのミソです.PC8_restartという信号は、STM32のGPIOに発します.STM32がSPIを起動する直前にアサートされ、SPI起動直後にデアサートするようにcodeが書かれています.
reg [6:0] sckcnt;
always@(posedge clk or negedge xrst2)
if(!xrst2) sckcnt<=122;
else if(PC8_restart_rr) sckcnt<=122;
else if(seq_en && bck==1) sckcnt <= sckcnt + 1;

↓LRCKをつくるところ.sckcnt[5]は64分周の意味.
reg lrck;
always@(posedge clk or negedge xrst2)
if(!xrst2) lrck<=1;
else if(PC8_restart_rr) lrck<=1;
else if(seq_en && bck==1) lrck <= sckcnt[5];


以上でLRCK生成ロジックの説明はおしまいです.このような3線信号を作れましたので、これがI2S信号そのものです.DACへ繋げば音が出る.
STM32/XC9536/DACの結線と入出力の向きはこのようになります.

以上でaudio data flowの説明は終了でいい気がする.
5か月間も悩んだけど解ってしまえば簡単なだよなぁ、なんかむかつくー

かしこ

0 件のコメント:

コメントを投稿