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