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];
0 件のコメント:
コメントを投稿