groovylight/verilog/bitslicer.sv

66 lines
1.6 KiB
Systemverilog
Raw Normal View History

2024-04-30 06:41:31 +00:00
module bitslicer (
input clk,
input [23:0] rgb[2],
input [8:0] pixnum, // x-value of the pixels we are being fed.
2024-04-30 06:41:31 +00:00
input start_write,
output reg [5:0] bitplane_data,
output [10:0] bitplane_addr,
output reg bitplane_wren,
output reg done
);
reg [2:0] bitplane_bit = 0;
2024-04-30 06:41:31 +00:00
assign bitplane_addr = (pixnum << 3) + bitplane_bit;
assign 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]
};
2024-04-30 06:41:31 +00:00
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;
bitplane_wren <= 1;
2024-04-30 06:41:31 +00:00
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]
// };
2024-04-30 06:41:31 +00:00
bitplane_bit <= bitplane_bit + 1;
if (bitplane_bit == 7) begin
state <= StateDone;
bitplane_wren <= 0;
2024-04-30 06:41:31 +00:00
end
end
StateDone: begin
done <= 1; // strobe
2024-04-30 06:41:31 +00:00
state <= StateInit;
end
default: begin
state <= StateInit;
end
endcase
end
endmodule