`define vga1920_1080_60
module vga_ctrl(
clk,
sys_rstn,
pix_data,
pix_x,
pix_y,
hsync,
vsync,
rgb
);
input clk;
input sys_rstn;
input [15:0] pix_data;
output [11:0] pix_x;
output [11:0] pix_y;
output hsync;
output vsync;
output rgb;
`ifdef vga640_480_60
parameter H_SYNC = 13'd96 ;
parameter H_BACK_PORCH = 13'd40 ;
parameter H_LEFT_BORDER = 13'd8 ;
parameter H_ADDRESSABLE = 13'd640 ;
parameter H_RIGHT_BORDER = 13'd8 ;
parameter H_FRONT_PORCH = 13'd8 ;
parameter V_SYNC = 13'd2 ;
parameter V_BACK_PORCH = 13'd25 ;
parameter V_LEFT_BORDER = 13'd8 ;
parameter V_ADDRESSABLE = 13'd480 ;
parameter V_RIGHT_BORDER = 13'd8 ;
parameter V_FRONT_PORCH = 13'd2 ;
`endif
`ifdef vga1920_1080_60
parameter H_SYNC = 13'd44 ;
parameter H_BACK_PORCH = 13'd148 ;
parameter H_LEFT_BORDER = 13'd0 ;
parameter H_ADDRESSABLE = 13'd1920 ;
parameter H_RIGHT_BORDER = 13'd0 ;
parameter H_FRONT_PORCH = 13'd88 ;
parameter V_SYNC = 13'd5 ;
parameter V_BACK_PORCH = 13'd36 ;
parameter V_LEFT_BORDER = 13'd0 ;
parameter V_ADDRESSABLE = 13'd1080 ;
parameter V_RIGHT_BORDER = 13'd0 ;
parameter V_FRONT_PORCH = 13'd4 ;
`endif
parameter h_sync_num = H_SYNC-1'b1;
parameter h_valid_start = H_SYNC + H_BACK_PORCH + H_LEFT_BORDER;
parameter h_valid_end = h_valid_start + H_ADDRESSABLE;
parameter h_total = h_valid_end + H_FRONT_PORCH + H_RIGHT_BORDER;
parameter v_sync_num = V_SYNC;
parameter v_valid_start = V_SYNC + V_BACK_PORCH+ V_LEFT_BORDER;
parameter v_valid_end = v_valid_start + V_ADDRESSABLE;
parameter v_total = v_valid_end + V_FRONT_PORCH + V_RIGHT_BORDER;
wire [11:0] pix_x;
wire [11:0] pix_y;
wire hsync;
wire vsync;
wire [15:0] rgb;
reg [12:0] cnt_h;
reg [11:0] cnt_v;
wire data_req;
always@(posedge clk) begin
if(!sys_rstn)begin
cnt_h <= 13'd0;
end
else if(cnt_h==h_total-1'b1)begin
cnt_h <= 13'd0;
end
else begin
cnt_h <= cnt_h + 1'b1;
end
end
always@(posedge clk) begin
if(!sys_rstn)begin
cnt_v <= 13'd0;
end
else if(cnt_v==v_total-1'b1)begin
cnt_v <= 13'd0;
end
else begin
cnt_v <= cnt_v + 1'b1;
end
end
assign hsync = (cnt_h<=h_sync_num)?1'b1:1'b0;
assign vsync = (cnt_v<=v_sync_num)?1'b1:1'b0;
assign data_req = ((cnt_h>h_valid_start)&&(cnt_h<=h_valid_end)
&&(cnt_v>v_valid_start)&&(cnt_v<=v_valid_end))
?1'b1:1'b0;
assign pix_x = data_req ? (cnt_h - h_valid_start) : 12'hfff;
assign pix_y = data_req ? (cnt_v - v_valid_start) : 12'hfff;
assign rgb = data_req ? pix_data:16'h0;
endmodule
module vga_pic(
clk,
sys_rstn,
pix_x,
pix_y,
pix_data
);
input clk;
input sys_rstn;
input [11:0] pix_x;
input [11:0] pix_y;
output [15:0] pix_data;
parameter x = 8'd192;
parameter y = 8'd108;
parameter RED = 16'hF800;
parameter ORANGE = 16'hFC00;
parameter YELLOW = 16'hFFE0;
parameter GREEN = 16'h07E0;
parameter CYAN = 16'h07FF;
parameter BLUE = 16'h001F;
parameter PURPPLE = 16'hF81F;
parameter BLACK = 16'h0000;
parameter WHITE = 16'hFFFF;
parameter GRAY = 16'hD69A;
reg [15:0] pix_data_x;
reg [15:0] pix_data_y;
wire [5:0] pix_data_15to11;
wire [6:0] pix_data_10to5;
wire [5:0] pix_data_4to0;
always@(posedge clk) begin
if(!sys_rstn)begin
pix_data_x <= 16'b0;
end
else if((pix_x>=0)&&(pix_x<x*1))begin
pix_data_x <= RED;
end
else if((pix_x>=1)&&(pix_x<x*2))begin
pix_data_x <= ORANGE;
end
else if((pix_x>=2)&&(pix_x<x*3))begin
pix_data_x <= YELLOW;
end
else if((pix_x>=3)&&(pix_x<x*4))begin
pix_data_x <= GREEN;
end
else if((pix_x>=4)&&(pix_x<x*5))begin
pix_data_x <= CYAN;
end
else if((pix_x>=5)&&(pix_x<x*6))begin
pix_data_x <= BLUE;
end
else if((pix_x>6)&&(pix_x<x*7))begin
pix_data_x <= PURPPLE;
end
else if((pix_x>=7)&&(pix_x<x*8))begin
pix_data_x <= BLACK;
end
else if((pix_x>=8)&&(pix_x<x*9))begin
pix_data_x <= WHITE;
end
else if((pix_x>=9)&&(pix_x<x*10))begin
pix_data_x <= GRAY;
end
else begin
pix_data_x <= GRAY;
end
end
always@(posedge clk) begin
if(!sys_rstn)begin
pix_data_y <= 16'b0;
end
else if((pix_y>=y*0)&&(pix_y<y*1))begin
pix_data_y <= RED;
end
else if((pix_y>=y*1)&&(pix_y<y*2))begin
pix_data_y <= ORANGE;
end
else if((pix_y>=y*2)&&(pix_y<y*3))begin
pix_data_y <= YELLOW;
end
else if((pix_y>=y*3)&&(pix_y<y*4))begin
pix_data_y <= GREEN;
end
else if((pix_y>=y*4)&&(pix_y<y*5))begin
pix_data_y <= CYAN;
end
else if((pix_y>=y*5)&&(pix_y<y*6))begin
pix_data_y <= BLUE;
end
else if((pix_y>=y*6)&&(pix_y<y*7))begin
pix_data_y <= PURPPLE;
end
else if((pix_y>=y*7)&&(pix_y<y*8))begin
pix_data_y <= BLACK;
end
else if((pix_y>=y*8)&&(pix_y<y*9))begin
pix_data_y <= WHITE;
end
else if((pix_y>=y*9)&&(pix_y<y*10))begin
pix_data_y <= GRAY;
end
else begin
pix_data_y <= GRAY;
end
end
assign pix_data_15to11 = pix_data_x[15:11] + pix_data_y[15:11];
assign pix_data_10to5 = pix_data_x[10:5] + pix_data_y[10:5];
assign pix_data_4to0 = pix_data_x[4:0] + pix_data_y[4:0];
assign pix_data[15:11] = pix_data_15to11[5] ? pix_data_15to11[4:0]:5'h1F;
assign pix_data[10:5] = pix_data_10to5[6] ? pix_data_10to5[4:0]:6'h3F;
assign pix_data[4:0] = pix_data_4to0[5] ? pix_data_4to0[4:0]:5'h1F;
endmodule
module vga_top(
sys_clk,
sys_rstn,
hsync,
vsync,
rgb
);
input sys_clk;
input sys_rstn;
output hsync;
output vsync;
output [15:0] rgb;
wire lock;
wire clk;
wire [11:0] pix_x;
wire [11:0] pix_y;
wire [15:0] pix_data;
pll_50m_150m inst0(
.inclk0(sys_clk),
.areset(~sys_rstn),
.locked(lock),
.c0(clk)
);
vga_ctrl inst1(
.clk(clk),
.sys_rstn(sys_rstn&&lock),
.pix_data(pix_data),
.pix_x(pix_x),
.pix_y(pix_y),
.hsync(hsync),
.vsync(vsync),
.rgb(rgb)
);
vga_pic inst2(
.clk(clk),
.sys_rstn(sys_rstn&&lock),
.pix_x(pix_x),
.pix_y(pix_y),
.pix_data(pix_data)
);
endmodule
`timescale 1ns/1ps
module vga_tb();
reg sys_clk;
reg sys_rstn;
wire [15:0] rgb;
wire hsync;
wire vsync;
always #10 sys_clk = ~sys_clk;
initial
begin
sys_clk = 0;
sys_rstn = 0;
#20
sys_rstn = 1;
end
vga_top inst0(
.sys_clk(sys_clk),
.sys_rstn(sys_rstn),
.hsync(hsync),
.vsync(vsync),
.rgb(rgb)
);
endmodule
`ifdef vga640_480_60
parameter H_SYNC = 13'd96 ;
parameter H_BACK_PORCH = 13'd40 ;
parameter H_LEFT_BORDER = 13'd8 ;
parameter H_ADDRESSABLE = 13'd640 ;
parameter H_RIGHT_BORDER = 13'd8 ;
parameter H_FRONT_PORCH = 13'd8 ;
parameter V_SYNC = 13'd2 ;
parameter V_BACK_PORCH = 13'd25 ;
parameter V_LEFT_BORDER = 13'd8 ;
parameter V_ADDRESSABLE = 13'd480 ;
parameter V_RIGHT_BORDER = 13'd8 ;
parameter V_FRONT_PORCH = 13'd2 ;
`endif
`ifdef vga1920_1080_60
parameter H_SYNC = 13'd44 ;
parameter H_BACK_PORCH = 13'd148 ;
parameter H_LEFT_BORDER = 13'd0 ;
parameter H_ADDRESSABLE = 13'd1920 ;
parameter H_RIGHT_BORDER = 13'd0 ;
parameter H_FRONT_PORCH = 13'd88 ;
parameter V_SYNC = 13'd5 ;
parameter V_BACK_PORCH = 13'd36 ;
parameter V_LEFT_BORDER = 13'd0 ;
parameter V_ADDRESSABLE = 13'd1080 ;
parameter V_RIGHT_BORDER = 13'd0 ;
parameter V_FRONT_PORCH = 13'd4 ;
`endif