All checks were successful
ci/woodpecker/push/test-workflow Pipeline was successful
at audio fixup. It did nothing of course lol Reverted back to 16-bit pcm because it sounds marginally better than 8-bit
77 lines
2.3 KiB
Systemverilog
77 lines
2.3 KiB
Systemverilog
/***
|
|
* read_data.sv - whenever we receive a data block, start spitting bytes out
|
|
* into the audio buffer block ram. This could be clocked at
|
|
* 25MHz default speed clock, or it could swtich over like the
|
|
* writer has to.
|
|
* @author: Waylon Cude, Dilanthi Prentice
|
|
* @date: 6/12/2025
|
|
*
|
|
***/
|
|
module read_data(
|
|
input clk,
|
|
input mem_clk,
|
|
input reset,
|
|
input [3:0] sd_data,
|
|
audio_buffer_interface.driver buffer
|
|
);
|
|
// Block data is a start bit, 512 bytes sent msb first, then a CRC16 and end
|
|
// bit.
|
|
|
|
// NOTE: This doesn't check which side of the buffer the audio player is
|
|
// reading from, so theoretically it could overwrite audio that's being
|
|
// played. However, as long as the sd card controller doesn't request extra
|
|
// blocks this shouldn't be an issue
|
|
|
|
localparam BLOCK_SIZE=512*2+16*4+2;
|
|
logic [$clog2(BLOCK_SIZE):0] counter;
|
|
|
|
logic [7:0] byte_shift;
|
|
|
|
logic [3:0] byte_counter;
|
|
|
|
assign buffer.clka = clk;
|
|
|
|
always_ff @(posedge clk) begin
|
|
if (reset) begin
|
|
buffer.ena <= 0;
|
|
// Start negative so adding bytes will get us to the right address
|
|
buffer.addra <= 0 - 512;
|
|
buffer.dina <= 0;
|
|
end
|
|
else begin
|
|
// We ignore the lower 16*4+1 bits of the block
|
|
// CRC is apparently sent on each line, back to back
|
|
if (counter > 16*4) begin
|
|
counter <= counter - 1;
|
|
byte_shift <= {byte_shift[3:0],sd_data};
|
|
byte_counter <= byte_counter - 1;
|
|
|
|
// Store received byte in audio buffer and reset counter
|
|
if (byte_counter == 0) begin
|
|
byte_counter <= 1;
|
|
buffer.dina <= {byte_shift[3:0],sd_data};
|
|
buffer.ena <= 1;
|
|
end
|
|
|
|
// Turn the enable signal off so we don't accidentally write
|
|
// anything weird
|
|
if (byte_counter == 1) begin
|
|
buffer.addra <= buffer.addra - 1;
|
|
end
|
|
|
|
end
|
|
else if (counter != 0) begin
|
|
counter<=counter-1;
|
|
buffer.ena <= 0;
|
|
end
|
|
else if (sd_data == 0) begin
|
|
// In wide bus mode we read bytes in a descending order
|
|
buffer.addra <= buffer.addra + 1024;
|
|
counter <= BLOCK_SIZE;
|
|
byte_counter <= 3;
|
|
end
|
|
end
|
|
end
|
|
|
|
endmodule
|