audio i2s

I2Sシリアルデータをパラレルデータに変更、パラレルデータをシリアルデータに変更してみます。

これによって、オーディオの制御が簡単になります。

コードは次のようになります。

I2S to Parallel:

I2Sフォーマットは1ビットずれているので、65ビットのシフトレジスタに入れて、

64ビット分を取り出します。それを32ビットの左チャネルと右チャネルに分けます。

i2s_s2p.v

module i2s_s2p(clock_bit, clock_lr, data_in, latch, data_32);

input clock_bit;

input clock_lr;

input data_in;

output [31:0]data_32;

reg [31:0]data_lr_32;

reg [64:0]data64_tmp;

output latch;

reg latch;

reg [8:0]counter;

reg previous_clock_lr;

always @ (posedge clock_bit)

begin

data64_tmp = data64_tmp << 1;

data64_tmp[0] = data_in;

if (previous_clock_lr == 1 && clock_lr == 0)

begin

data_32[31:16] <= data64_tmp[63:48];

data_32[15:0] <= data64_tmp[31:16];

latch <= 1;

counter = 0;

end

if (counter == 1)

begin

latch <= 0;

end

counter = counter + 1;

previous_clock_lr = clock_lr;

end

endmodule

バイナリデータをI2Sシリアルへ変換します。

Parallel to Serial

i2s_p2s.v

module i2s_p2s(clock_in, clock_bit, clock_lr, data_out, latch, data_l32, data_r32);

input clock_in;

input clock_bit;

input clock_lr;

output reg data_out;

input [31:0] data_l32;

input [31:0] data_r32;

output reg latch;

reg [64:0]data_lr65_tmp;

reg [8:0]counter;

reg prev_clock_lr;

reg prev_clock_bit;

always@(negedge clock_in)

begin

if (prev_clock_bit == 1 && clock_bit == 0) begin

data_out = data_lr65_tmp[64];

data_lr65_tmp = data_lr65_tmp << 1;

counter = counter + 1;

end

else if (prev_clock_bit == 0 && clock_bit == 1) begin

if (prev_clock_lr == 1 && clock_lr == 0) begin

data_lr65_tmp[64:33] = data_l32[31:0];

data_lr65_tmp[32:1] = data_r32[31:0];

latch <= 1;

counter = 0;

end

if (counter == 1) begin

latch <= 0;

end

prev_clock_lr = clock_lr;

end

prev_clock_bit = clock_bit;

end

endmodule

アクセスカウンター
アクセスカウンター