基于FPGA的VGA字符显示
时间:2023-04-09 05:37:00
一、VGA的简单介绍
VGA是什么
1.VGA(Video Graphics Array),视频图形阵列是一种视频传输标准,具有分辨率高、显示速度快、色彩丰富等优点,不支持音频传输。
2.VGA显示原理
VGA数据引脚1、2、3(RED、GREEN、BLUE)输入的不是简单的0、1数字信号,而是模拟电压(0V-0.714V)。当引脚有不同的电压时,VGA显示器显示不同的颜色。
VGAD型接口采用不对称分布连接方式,共15针,分三排,每排5个孔。
在15个管脚中,3个更重要RGB彩色分量信号和2个扫描同步信号HSYNC和VSYNC。
●像素组成: VGA显示器上的每个像素点都可以有多种颜色R、G、B如果每个像素点用三位二进制数表示(R、G、B一个信号),总共可以显示2×2×2=8种颜色用8位二进制数表示每个像素点(R、G、B如果信号分别为3、3、2,则共可显示8×8×4=256种颜色。
1.2 VGA如何实现显示
??要知道VGA显示器是不认识数字信号的,它只认识模拟信号。所谓它只认识模拟信号,即 数据引脚1、2、3(RED、GREEN、BLUE)输入的不是简单的0、1数字信号,而是模拟电压(0V-0.714V)。当1、2、3引脚有不同的电压时,VGA显示器显示不同的颜色。
但是FPGA要想产生模拟信号就需要借助DA,利用DA产生模拟信号,输出到VGA的RED、GREEN、BLUE基色数据线。还有电阻网络分流模拟。DA实现的。
●VGA如何实现各种颜色?
在VGA接口的1、2、3引脚分别接收以下电压:
①帧时序
帧时序的四个部分是:同步脉冲(Sync o)、显示后沿(Back porch p)、显示时序段(Display interval q)和显示前沿(Front porchr)。同步脉冲(Sync o)、显示后沿(Back porch p)和显示前沿(Front porch r)是消隐区,RGB信号无效,屏幕不显示数据。显示时序段(Display interval q)是有效数据区。.
②行时序
从上面可以看出同步脉冲(Sync a)、显示后沿(Back porch b)和显示前沿(Front porch d)是消隐区,RGB信号无效,屏幕不显示数据。显示时间段(Display interval c)是有效数据区。
③VGA的时序解析
分辨率不同,时序也不同。例如,800*600@60Hz的VGA时序:
?
3. FPGA驱动VGA显示彩条
电路图:
重点是代码:
//行时序宏定义 `define HSYNC_A 16'd128 `define HSYNC_B 16'd216 `define HSYNC_C 16'd1016 `define HSYNC_D 16'd1056 //列时序宏定义 `define VSYNC_O 16'd4 `define VSYNC_P 16'd27 `define VSYNC_Q 16'd627 `define VSYNC_R 16'd628 //颜色定义 `define RED 8'hE0 //1110_0000(参考上述电路图) `define GREEN 8'h1C //0001_1100(参考上述电路图) `define BLUE 8'h03 //0000_0011(见上述电路图) `define YELLOW 8'hFC `define BLACK 8'h00 module VGA ( //输入 input CLK_50M, input RST_N, //输出 output reg VSYNC, //垂直同步端口 output reg HSYNC, ///水平同步端口 output reg[7:0] VGA_DATA ///数据端口 ); reg[15:0] hsync_cnt; //水平扫描计数器 reg[15:0] vsync_cnt; //垂直扫描计数器 reg vga_data_valid; //RGB数据信号的有效区可以使信号有效 ///水平扫描(扫描1056点) always@(posedge CLK_40M or negedge RST_N) begin if(!RST_N) hsync_cnt <= 16'd0; else if(hsync_cnt == `HSYNC_D) hsync_cnt <= 16'd0; else hsync_cnt <= hsync_cnt 16'd1; end ///垂直扫描(扫描628点) always@(posedge CLK_40M or negedge RST_N) begin if(!RST_N) vsync_cnt <= 16'd0; else if((vsync_cnt == `VSYNC_R) && (hsync_cnt == `HSYNC_D)) vsync_cnt <= 16'd0; else if(hsync_cnt == `HSYNC_D) vsync_cnt <= vsync_cnt 16'd1; else vsync_cnt <= vsync_cnt; end //行时序 always@(posedge CLK_40M or negedge RST_N) begin if(!RST_N) HSYNC <= 1'b0; else if(hsync_cnt < `HSYNC_A) //a域为0 HSYNC <= 1'b0; else HSYNC <= 1'b1; //其他域1 end //列时序 always@(posedge CLK_40M or negedge RST_N) begin if(!RST_N) VSYNC <= 1'b0; else if(vsync_cnt < `VSYNC_O) //o域为0 VSYNC <= 1'b0; else VSYNC <= 1'b1; //其他域1 end //提取显示有效区(q域 c域) always@(posedge CLK_40M or negedge RST_N) begin if(!RST_N) vga_data_valid <= 1'b0; else if((hsync_cnt > `HSYNC_B && hsync_cnt < `HSYNC_C) && (vsync_cnt > `VSYNC_P && vsync_cnt < `VSYNC_Q)) ///数据有效区 vga_data_valid <= 1'b1; else vga_data_valid <= 1'b0; end //在数据有效区,发送数据VGA_RED、VGA_GREEN、VGA_BLUE数据引脚 always@(*) begin if(vga_data_valid) begin if(vsync_cnt >`VSYNC_P)//显示区 begin if((hsync_cnt > `HSYNC_B) && (hsync_cnt < `HSYNC_B 10'd300)) VGA_DATA <= `RED; //红色 1110_0000 else if((hsync_cnt > `HSYNC_B 10'd300) && (hsync_cnt < `HSYNC_B 10'd400)) VGA_DATA <= `BLUE; //蓝色 0000_0111 else if((hsync_cnt > `HSYNC_B 10'd400) && (hsync_cnt < `HSYNC_B 10'd500)) VGA_DATA <= `YELLOW; //黄色 1111_1100 else if((hsync_cnt > `HSYNC_B 10'd500) && (hsync_cnt < `HSYNC_B 10'd800)) VGA_DATA <= `GREEN; //绿色 0001_1100 else VGA_DATA <= `BLACK; //黑色 0000_0000 end else VGA_DATA <= `BLACK; //黑色 end else VGA_DATA <= `BLACK; //黑色 end //PLL_IP获取40M时钟 wire CLK_40M; PLL PLL_inst ( .inclk0 ( CLK_50M ), .c0 ( CLK_40M ) );
二.vga显示彩条
1.配置引脚
具体引脚信息,请查看板手册
2.编译烧录
3.显示效果