VGA显示RGB颜色
VGA(Video Graphics Array)做为视频输出输入接口已经广泛使用很长时间,主要通过红、绿、
蓝三原色的模拟量传输。本实验通过在 VGA 屏幕上显示彩条,来练习视频的时序和视频颜色的表
示,为后面视频处理实验做个基础。
VGA 显示器扫描方式从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到
屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号
进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,
同时进行场消隐,开始下一帧。
完成一行扫描的时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描的时间
称为垂直扫描时间,其倒数称为场频率,即刷新一屏的频率,常见的有 60Hz,75Hz 等等。标准
的 VGA 显示的场频 60Hz。
时钟频率:以 1024x768@59.94Hz(60Hz)为例,每场对应 806 个行周期,其中 768 为显示行。每
显示行包括 1344 点时钟,其中 1024 点为有效显示区。由此可知:需要点时钟频率:806134460
约 65MHz。
top代码如下
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 21:08:02 08/05/2020
// Design Name: robetwu
// Module Name: vga_sample 1024*768pix*60Hz
// 1344*806*60=64.99MHZjian
// 将时钟设置为65MHZ
// Project Name:
// Target Devices:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module vga_sample(
input clk,
input rst_n,
output reg [15:0] rgb,//R[4:0],G[10:5],B[15:0]
output reg Hsync,
output reg Vsync
/* output clk_vga*/
);
parameter CNT_H=1344;
parameter CNT_V=806;
parameter CNT_MOVE=162500;
reg [19:0]cnt_h;
reg [19:0]cnt_v;
reg [19:0]cnt_move;
reg [11:0]b_cnt_v;
reg [11:0]b_cnt_h;
reg flag_move;
wire clk_vga;
//PLL65MHz时钟 全局bufg
IBUFG clkf_buf
(.O (clkfb),
.I (clk));
pll pll_vga
(// Clock in ports
.CLK_IN1(clkfb), // IN
// Clock out ports
.clk_cga(clk_vga)); // OUT
//行像素为剳6为高其他为低
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
cnt_h<=0;
else if(cnt_h==CNT_H)
cnt_h<=0;
else
cnt_h<=cnt_h+1;
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
Hsync<=0;
else if(cnt_h>=0&&cnt_h<=135)
Hsync<=1;
else
Hsync<=0;
//列像素为剤¸ªpix为高其他为低
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
cnt_v<=0;
else if((cnt_h==CNT_H)&&(cnt_v==CNT_V))
cnt_v<=0;
else if(cnt_h==20'd800)
cnt_v<=cnt_v+1;
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
Vsync<=0;
else if(cnt_v>=0&&cnt_v<=2)
Vsync<=1;
else
Vsync<=0;
//产生移动标倊always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
begin
cnt_move<=0;
flag_move<=0;
end
else if(cnt_move==CNT_MOVE)
begin
cnt_move<=0;
flag_move<=1;
end
else if((cnt_h<=20'd1321&&cnt_h>=20'd296)&&(cnt_v<=20'd806&&cnt_v>=20'd35))
begin
cnt_move<=cnt_move+1;
flag_move<=0;
end
else
flag_move<=0;
reg h_direction;
reg v_direction;
//块向上下运动
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
b_cnt_v<=0;
else if (v_direction==1&&flag_move==1)
b_cnt_v<=b_cnt_v-1;
else if(v_direction==0&&flag_move==1)
b_cnt_v<=b_cnt_v+1;
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
v_direction<=0;//向下运动
else if(b_cnt_v==12'd700)//下边界
v_direction<=1;//向上运动
else if(b_cnt_v==0)
v_direction<=0;
//块向左右运动
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
b_cnt_h<=0;
else if (h_direction==1&&flag_move==1)
b_cnt_h<=b_cnt_h-1;
else if(h_direction==0&&flag_move==1)
b_cnt_h<=b_cnt_h+1;
always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
h_direction<=0;//向zuo运动
else if((b_cnt_h==12'd1200))//右边界
h_direction<=1;//向you运动
else if(b_cnt_h==0)
h_direction<=0;
//生成RGB竖条纊always@(posedge clk_vga or negedge rst_n)
if(!rst_n)
rgb<=16'd0;
else if ((cnt_h>=296+b_cnt_h&&cnt_h<=396+b_cnt_h)&&(cnt_v>=35+b_cnt_v&&cnt_v<=135+b_cnt_v))
rgb<=16'b11111_111111_11111;
else if((cnt_h<=20'd637&&cnt_h>=20'd296)&&(cnt_v<=20'd806&&cnt_v>=20'd35))
rgb<=16'b11111_000000_00000;
else if((cnt_h<=20'd978&&cnt_h>=20'd637)&&(cnt_v<=20'd806&&cnt_v>=20'd35))
rgb<=16'b00000_111111_00000;
else if((cnt_h<=20'd1321&&cnt_h>=20'd979)&&(cnt_v<=20'd806&&cnt_v>=20'd35))
rgb<=16'b00000_000000_11111;
else
rgb<=16'd0;
//
//wire [35 : 0] CONTROL0;
//wire [255 : 0] TRIG0;
//chipscope_icon chipscope_icon_inst(
// .CONTROL0(CONTROL0)) /* synthesis syn_black_box syn_noprune=1 */;
//
//
//chipscope_ila chipscope_ila_inst(
// .CONTROL(CONTROL0),
// .CLK(clk_vga),
// .TRIG0(TRIG0)) /* synthesis syn_black_box syn_noprune=1 */;
//
//
//assign TRIG0[4:0]=rgb[4:0];
//assign TRIG0[10:5]=rgb[10:5];
//assign TRIG0[15:11]=rgb[15:11];
//assign TRIG0[16]=Hsync;
//assign TRIG0[17]=Vsync;
//assign TRIG0[18]=clk_vga;
endmodule
结果如下图所示