blob: 5089df8893b9582413b4049665fdd22337eeb0eb [file] [log] [blame]
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2021 Tamas Hubai
`default_nettype none
// programmable delay line for karplus-strong
// the two versions of ks_delay are functionally equivalent
// use this one if buffer[] synthesises to dual-port ram access
module ks_delay_mem (
input lrck,
input rst_n,
input signed [23:0] in,
input [9:0] delay,
output reg signed [23:0] out
);
reg signed [23:0] buffer [`MAXDELAY:0];
reg [9:0] write;
reg [9:0] read;
reg [9:0] fill;
always @ (posedge lrck) begin
if (!rst_n) begin
out <= 24'b0;
write <= 10'b0;
read <= 10'b0;
fill <= 10'b0;
end else begin
if (fill <= `MAXDELAY) fill <= fill + 10'b1;
if (read < fill) begin
out <= buffer[read];
end else begin
out <= 24'sb0;
end
if (write + 10'b1 < delay) begin
read <= write + `MAXDELAY + 10'b10 - delay;
end else begin
read <= write + 10'b1 - delay;
end
buffer[write] <= in;
if (write >= `MAXDELAY) begin
write <= 10'b0;
end else begin
write <= write + 10'b1;
end
end
end
endmodule
`default_nettype wire