module bitslicer ( input clk, input [23:0] rgb[2], input [7:0] pixnum, // x-value of the pixels we are being fed. input start_write, output reg [5:0] bitplane_data, output [10:0] bitplane_addr, output reg bitplane_wren, output reg done ); reg [3:0] bitplane_bit = 0; assign bitplane_addr = (pixnum << 3) + bitplane_bit; reg [3:0] state = StateInit; localparam integer StateInit = 0; localparam integer StateWriteout = 1; localparam integer StateDone = 2; always @(posedge clk) begin case (state) StateInit: begin bitplane_bit <= 0; done <= 0; bitplane_wren <= 0; if (start_write) begin state <= StateWriteout; end end StateWriteout: begin bitplane_data <= { rgb[1][bitplane_bit], rgb[1][bitplane_bit+8], rgb[1][bitplane_bit+16], rgb[0][bitplane_bit], rgb[0][bitplane_bit+8], rgb[0][bitplane_bit+16] }; bitplane_wren <= 1; bitplane_bit <= bitplane_bit + 1; if (bitplane_bit == 7) begin state <= StateDone; end end StateDone: begin bitplane_wren <= 0; done <= 1; // strobe state <= StateInit; end default: begin state <= StateInit; end endcase end endmodule