Ich versuche den I2S Transmitter in Verilog zu implementieren. Das Datenblatt dafür ist: https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdfI2S Transmitter Verilog Implementierung funktioniert nicht
Ich schrieb den Code, aber meine SD-Linie ist 1 Takt verzögert, wenn ich es teste. Kann jemand meine Implementierung überprüfen?
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: Hier ist ein Bild der Wellenform image
PRüFSTAND Code:
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
Bitte fügen Sie weitere Details hinzu - Ihre Testbench-Code, Ihre Wellenform, wo Sie SD verzögert sehen, und wo genau ist das Problem? – noobuntu
'immer @ (Q1)' sollte 'immer @ (Q1 oder DRight oder DLeft) 'nicht sicher sein, wenn das das Problem ist. – Hida
@Hida DRight und DLeft sind konstante Werte, ich bin auf der Suche nach der Veränderung in Q1. Basierend auf Q1 wird entweder R oder L in Tdata geladen – user1775297