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