blob: 5cd2a7dd193975e1f14339f033a299867b4425a7 [file] [log] [blame] [edit]
// adapts single bit memory to parallel inputs and outputs
module RAM_SHIFTER #(
parameter IO_WIDTH = 16,
parameter ADDR_WIDTH = 4,
parameter PHASE_SHIFT = 2
) (
input clk,
// parallel I/O
input [IO_WIDTH-1:0] in,
output reg [IO_WIDTH-1:0] out,
// memory interface
output reg [ADDR_WIDTH-1:0] addr,
input ram_out,
output ram_in
);
// shift registers
reg [IO_WIDTH-1:0] shift_in;
reg [IO_WIDTH-1:0] shift_out;
assign ram_in = shift_in[0];
initial begin
out <= 0;
addr <= 0;
shift_in <= 0;
shift_out <= 0;
end
always @(posedge clk) begin
if(addr == 0)
begin // shift registers are aligned with I/O
// write output shift register, which is a little out of phase
out <= {shift_out[IO_WIDTH-PHASE_SHIFT-1:0], shift_out[IO_WIDTH-1:IO_WIDTH-PHASE_SHIFT]};
// input shift register is aligned with input, so sample it
shift_in <= in;
end
else
begin
// rotate the input
shift_in <= {shift_in[IO_WIDTH-2:0], shift_in[IO_WIDTH-1]};
end
// insert a new bit on the right and push everything to the left
shift_out <= {shift_out[IO_WIDTH-2:0], ram_out};
addr <= addr + 1;
end
endmodule