32fs 16LJ 備忘録
~I2S→左詰め16bit(BCK 32fs)への変換をFPGAでやる~
module I2S_to_16LJ(bck,data,lrck,bck_out,data_out,lrck_out,WCK);
input bck;
input data;
input lrck;
output bck_out;
output data_out;
output lrck_out;
output WCK;
reg data_out = 0;
reg[4:0] data_counter = 0;
reg[31:0] data_fifo = 0;
wire lrck_32LJ;
delay_1BCK I2S_to_32LJ (lrck, bck, lrck_32LJ);
delay_1BCK delay (lrck_32LJ, bck, lrck_out);
reg lrck_changed;
half_freq half_freq_ins (bck, lrck_changed, bck_out);
reg lrck_before = 0;
always @(posedge bck)
begin
if(lrck_before != lrck_32LJ)
begin
data_counter <= 0;
data_fifo[0] <= data;
lrck_changed <= 1;
end
else
begin
data_counter <= data_counter + 1;
data_fifo[data_counter + 1] <= data;
lrck_changed <= 0;
end
lrck_before <= lrck_32LJ;
end
always @(negedge bck_out)
begin
data_out <= data_fifo [data_counter / 2];
end
reg delayed_lrck = 0;
reg[7:0] lrck_fifo;
assign WCK = lrck_out ~^ delayed_lrck;
always @ (posedge bck_out)
begin
lrck_fifo <= {lrck_fifo[6:0],lrck_out};
end
always @ (negedge bck)
begin
delayed_lrck <= lrck_fifo[7];
end
endmodule
コメント
コメントを投稿