| // 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 |