go-board-code/vga_image_renderer.v

82 lines
1.7 KiB
Verilog

module VGAImageRenderer(
input i_Clk,
input i_HSync,
input i_VSync,
output o_HSync,
output o_VSync,
output [2:0] o_Red,
output [2:0] o_Green,
output [2:0] o_Blue
);
// sync signals
wire w_HSync_FromCurrentPos, w_VSync_FromCurrentPos;
wire w_IsActiveArea;
// screen location
wire [9:0] w_X, w_Y;
wire [6:0] w_CellX;
wire [5:0] w_CellY;
// ram reading
reg r_doImageRAMRead = 1;
reg r_doImageRAMWrite = 0;
wire w_imageRAMReadDataReady;
wire [4:0] w_imageRAMReadData;
wire [2:0] w_Red, w_Green, w_Blue;
VGA_Current_Beam_Position currentPos (
.i_Clk(i_Clk),
.i_HSync(i_HSync),
.i_VSync(i_VSync),
.o_HSync(w_HSync_FromCurrentPos),
.o_VSync(w_VSync_FromCurrentPos),
.o_X(w_X),
.o_Y(w_Y),
.o_IsActiveArea(w_IsActiveArea)
);
assign w_CellX = w_X[9:3];
assign w_CellY = w_Y[9:3];
// takes a tick, so add one to HSync/VSync
ImageRAM imageRam (
.i_Clk(i_Clk),
.i_ReadX(w_CellX),
.i_ReadY(w_CellY),
.i_doRead(r_doImageRAMRead),
.o_ReadDataReady(w_imageRAMReadDataReady),
.o_ReadData(w_imageRAMReadData),
.i_WriteX(),
.i_WriteY(),
.i_WriteData(),
.i_DoWrite(r_doImageRAMWrite),
.o_WriteComplete()
);
ImageIndexToColor palette (
.i_Clk(i_Clk),
.i_ColorIndex(w_imageRAMReadData),
.o_Red(w_Red),
.o_Green(w_Green),
.o_Blue(w_Blue),
.i_DoWrite(r_doImageRAMWrite),
.i_WriteColorIndex(),
.i_WriteColor_Red(),
.i_WriteColor_Green(),
.i_WriteColor_Blue(),
.o_WriteComplete()
);
assign o_Red = w_IsActiveArea ? w_Red : 0;
assign o_Green = w_IsActiveArea ? w_Green : 0;
assign o_Blue = w_IsActiveArea ? w_Blue : 0;
assign o_HSync = w_HSync_FromCurrentPos;
assign o_VSync = w_VSync_FromCurrentPos;
endmodule