一、VGA原理
VGA接口简介
- VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传输的标准。早期的CRT显示器由于设计制造上的原因,只能接收模拟信号输入,因此计算机内部的显卡负责进行数模转换,而VGA接口就是显卡上输出模拟信号的接口。如今液晶显示器虽然可以直接接收数字信号,但是为了兼容显卡上的VGA接口,也大都支持VGA标准。
VGA显示中,FPGA需要产生5个信号分别是:行同步信号HS、场同步信号VS、R、G、B三基色信号。
在VGA视频传输标准中,视频图像被分解为红、绿、蓝三原色信号,经过数模转换之后,在行同步(HSYNC )和场同步(VSYNC)信号的同步下分别在三个独立通道传输。VGA在传输过程中的同步时序分为行时序和场时序。
VGA显示原理
- VGA显示中,FPGA需要产生5个信号分别是:行同步信号HS、场同步信号VS、R、G、B三基色信号。HSV色彩空间(Hue-色调、Saturation-饱和度、Value-值)将亮度从色彩中分解出来,在图像增强算法中用途很广。在我本人接触的图像处理项目中,经常将图像从RGB色彩空间转换到了HSV色彩空间,以便更好地感知图像颜色,利用HSV分量从图像中提取感兴趣的区域。但是如果是进行图像显示,应该选择RGB色彩空间。
计算机色彩显示器和彩色电视机显示色彩的原理一样,都是采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为RGB色彩空间表示。
在RGB颜色空间中,任意色光F都可以用R、G、B三色不同分量的相加混合而成:F=r[R]+r[G]+r[B]。RGB色彩空间还可以用一个三维的立方体来描述。当三基色分量都为0(最弱)时混合为黑色光;当三基色都为k(最大,值由存储空间决定)时混合为白色光。
二、显示彩色条纹
- 通过限制x的取值范围让颜色缓存显示不同的值就能实现显示彩色条纹。
module VGA_colorbar_test(
OSC_50,
VGA_CLK,
VGA_HS,
VGA_VS,
VGA_BLANK,
VGA_SYNC,
VGA_R,
VGA_B,
VGA_G);
input OSC_50;
output VGA_CLK,VGA_HS,VGA_VS,VGA_BLANK,VGA_SYNC;
output [7:0] VGA_R,VGA_B,VGA_G;
parameter H_FRONT = 16;
parameter H_SYNC = 96;
parameter H_BACK = 48;
parameter H_ACT = 640;
parameter H_BLANK = H_FRONT+H_SYNC+H_BACK;
parameter H_TOTAL = H_FRONT+H_SYNC+H_BACK+H_ACT;
parameter V_FRONT = 11;
parameter V_SYNC = 2;
parameter V_BACK = 31;
parameter V_ACT = 480;
parameter V_BLANK = V_FRONT+V_SYNC+V_BACK;
parameter V_TOTAL = V_FRONT+V_SYNC+V_BACK+V_ACT;
reg [10:0] H_Cont;
reg [10:0] V_Cont;
wire [7:0] VGA_R;
wire [7:0] VGA_G;
wire [7:0] VGA_B;
reg VGA_HS;
reg VGA_VS;
reg [10:0] X;
reg [10:0] Y;
reg CLK_25;
always@(posedge OSC_50)begin
CLK_25=~CLK_25;
end
assign VGA_SYNC = 1'b0;
assign VGA_BLANK = ~((H_Cont<H_BLANK)||(V_Cont<V_BLANK));
assign VGA_CLK = ~CLK_to_DAC;
assign CLK_to_DAC = CLK_25;
always@(posedge CLK_to_DAC)begin
if(H_Cont<H_TOTAL)
H_Cont<=H_Cont+1'b1;
else H_Cont<=0;
if(H_Cont==H_FRONT-1)
VGA_HS<=1'b0;
if(H_Cont==H_FRONT+H_SYNC-1)
VGA_HS<=1'b1;
if(H_Cont>=H_BLANK)
X<=H_Cont-H_BLANK;
else X<=0;
end
always@(posedge VGA_HS)begin
if(V_Cont<V_TOTAL)
V_Cont<=V_Cont+1'b1;
else V_Cont<=0;
if(V_Cont==V_FRONT-1)
VGA_VS<=1'b0;
if(V_Cont==V_FRONT+V_SYNC-1)
VGA_VS<=1'b1;
if(V_Cont>=V_BLANK)
Y<=V_Cont-V_BLANK;
else Y<=0;
end
reg valid_yr;
always@(posedge CLK_to_DAC)begin
if(V_Cont =&