VerilogでI2Sトランスミッタを実装しようとしています。それのためのデータシートは:https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdfI2SトランスミッタVerilogの実装が動作しない
私はコードを書いたが、私のSDラインは、私がテストすると1クロックサイクル遅れている。 私の実装をチェックできる人はいますか?
module Transmiter(
input signed [23:0] DLeft, input signed [23:0] DRight, input WS, input CLK,
output reg SD
);
wire PL;
reg Q1,Q2;
reg [23:0] shift_reg;
reg [23:0] Tdata;
assign PL = Q1^Q2;
always @(posedge CLK)
begin
Q1 <= WS;
Q2 <= Q1;
end
always @(Q1) begin
if (Q1)
begin
Tdata <= DRight;
end
else
begin
Tdata <= DLeft;
end
end
always @(negedge CLK)
begin
if(PL)
begin
shift_reg <= Tdata;
end
else begin
SD <= shift_reg[23];
shift_reg <= {shift_reg[22:0],1'b0};
end
end
endmodule
EDIT:
module Transmitter_tb(
);
reg CLK, WS;
reg [23:0] dataL;
reg [23:0] dataR;
wire SDout;
Transmiter UT(dataL, dataR, WS, CLK, SDout);
initial begin
dataL = 24'hF0F0FF; #2;
dataR = 24'h0000F0; #2;
end
always begin
CLK=0; #20;
CLK=1; #20;
end;
always begin
WS=0; #1000;
WS=1; #1000;
end;
endmodule
詳細を追加してください - あなたのテストベンチコード、SDが遅れている波形、正確にどこに問題があるのでしょうか? – noobuntu
'常に@(Q1)'は '常に@(Q1またはDRightまたはDLeft)'でなければなりません。 – Hida
@Hida DRightとDLeftは一定の値ですが、私はQ1の変更を探しています。 Q1に基づいて、RまたはLのいずれかがTdataにロードされます – user1775297