vga彩条

`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
//产生hsync和vsync
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值