Я пытаюсь реализовать передатчик I2S в verilog. Техническое описание для него: https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdfI2S Transmitter 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: вот изображение сигнала image
TEST CODE BENCH:
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
Пожалуйста, добавьте более подробную информацию - ваш код testbench, вашу форму сигнала, где вы видите SD с задержкой, и где именно проблема? – noobuntu
'always @ (Q1)' должен быть 'always @ (Q1 или DRight или DLeft)' не уверен, что это проблема. – Hida
@Hida DRight и DLeft являются постоянными значениями, я ищу изменения в Q1. На основе Q1 либо R, либо L загружается в Tdata – user1775297