当前位置:网站首页>DE2-115 FPGA开发板的VGA显示
DE2-115 FPGA开发板的VGA显示
2022-06-25 12:52:00 【dedsec0x】
目录
一、VGA简介
VGA(Video Graphics Array)视频图形阵列是IBM于1987年提出的一个使用模拟信号的电脑显示标准。VGA接口即电脑采用VGA标准输出数据的专用接口。VGA接口共有15针,分成3排,每排5个孔,显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号)。
常见接口之色差VGA接口(D-Sub接口)
说到VGA接口,相信很多朋友都不会陌生,因为这种接口是电脑显示器上最主要的接口,从块头巨大的CRT显示器时代开始,VGA接口就被使用,并且一直沿用至今,另外VGA接口还被称为D-Sub接口。 [2]
很多人觉得只有HDMI接口才能进行高清信号的传输,但这是一个大家很容易进入的误区,因为通过VGA的连接同样可以显示1080P的图像,甚至分辨率可以达到更高,所以用它连接显示设备观看高清视频是没有问题的,而且虽然它是种模拟接口,但是由于VGA将视频信号分解为R、G、B三原色和HV行场信号进行传输,所以在传输中的损耗还是相当小的.
VGA接口产生原因: 显卡所处理的信息最终都要输出到显示器上,显卡的输出接口就是电脑与显示器之间的桥梁,它负责向显示器输出相应的图像信号。CRT显示器因为设计制造上的原因,只能接受模拟信号输入,这就需要显卡能输出模拟信号。VGA接口就是显卡上输出模拟信号的接口,VGA(Video Graphics Array)接口,也叫D-Sub接口。虽然液晶显示器可以直接接收数字信号,但很多低端产品为了与VGA接口显卡相匹配,因而采用VGA接口。
二、VGA实现代码
代码如下:
module VGA_test(
OSC_50, //原CLK2_50时钟信号
VGA_CLK, //VGA自时钟
VGA_HS, //行同步信号
VGA_VS, //场同步信号
VGA_BLANK, //复合空白信号控制信号 当BLANK为低电平时模拟视频输出消隐电平,此时从R9~R0,G9~G0,B9~B0输入的所有数据被忽略
VGA_SYNC, //符合同步控制信号 行时序和场时序都要产生同步脉冲
VGA_R, //VGA绿色
VGA_B, //VGA蓝色
VGA_G); //VGA绿色
input OSC_50; //外部时钟信号CLK2_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; //VGA红色控制线
wire [7:0] VGA_G; //VGA绿色控制线
wire [7:0] VGA_B; //VGA蓝色控制线
reg VGA_HS;
reg VGA_VS;
reg [10:0] X; //当前行第几个像素点
reg [10:0] Y; //当前场第几行
reg CLK_25;
[email protected](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; //VGA时钟等于CLK_25取反
assign CLK_to_DAC = CLK_25;
[email protected](posedge CLK_to_DAC)
begin
if(H_Cont<H_TOTAL) //如果行计数器小于行总时长
H_Cont<=H_Cont+1'b1; //行计数器+1
else H_Cont<=0; //否则行计数器清零
if(H_Cont==H_FRONT-1) //如果行计数器等于行前沿空白时间-1
VGA_HS<=1'b0; //行同步信号置0
if(H_Cont==H_FRONT+H_SYNC-1) //如果行计数器等于行前沿+行同步-1
VGA_HS<=1'b1; //行同步信号置1
if(H_Cont>=H_BLANK) //如果行计数器大于等于行空白总时长
X<=H_Cont-H_BLANK; //X等于行计数器-行空白总时长 (X为当前行第几个像素点)
else X<=0; //否则X为0
end
[email protected](posedge VGA_HS)
begin
if(V_Cont<V_TOTAL) //如果场计数器小于行总时长
V_Cont<=V_Cont+1'b1; //场计数器+1
else V_Cont<=0; //否则场计数器清零
if(V_Cont==V_FRONT-1) //如果场计数器等于场前沿空白时间-1
VGA_VS<=1'b0; //场同步信号置0
if(V_Cont==V_FRONT+V_SYNC-1) //如果场计数器等于行前沿+场同步-1
VGA_VS<=1'b1; //场同步信号置1
if(V_Cont>=V_BLANK) //如果场计数器大于等于场空白总时长
Y<=V_Cont-V_BLANK; //Y等于场计数器-场空白总时长 (Y为当前场第几行)
else Y<=0; //否则Y为0
end
reg valid_yr;
[email protected](posedge CLK_to_DAC)
if(V_Cont == 10'd32) //场计数器=32时
valid_yr<=1'b1; //行输入激活
else if(V_Cont==10'd512) //场计数器=512时
valid_yr<=1'b0; //行输入冻结
wire valid_y=valid_yr; //连线
reg valid_r;
[email protected](posedge CLK_to_DAC)
if((H_Cont == 10'd32)&&valid_y) //行计数器=32时
valid_r<=1'b1; //像素输入激活
else if((H_Cont==10'd512)&&valid_y) //行计数器=512时
valid_r<=1'b0; //像素输入冻结
wire valid = valid_r; //连线
wire[10:0] x_dis; //像素显示控制信号
wire[10:0] y_dis; //行显示控制信号
assign x_dis=X; //连线X
assign y_dis=Y; //连线Y
parameter //点阵字模:每一行char_lineXX是显示的一行,共272列
char_line00=272'h0000000000000000000000000000000000000000000000000000000000000000000,
char_line01=272'h0000000000000000000000000000000000000000000000000000000000000000000,
char_line02=272'h0100001000020000020000000000000000000000000000000000000000000000000,
char_line03=272'h00C0001C00030000030000F00000000000000000000000000000000000000000000,
char_line04=272'h006000180001800002001FC00000000000000000000000000000000000000000000,
char_line05=272'h00700018000180000203E0000000000000000000000000000000000000000000000,
char_line06=272'h0030001800008010021000180000000003C00060008000600000000000000000000,
char_line07=272'h00200618000080387FF818180000000006200060018000600000000000000000000,
char_line08=272'h002186183FFFFFFC02020C30000000000C3000E01F8000E00000000000000000000,
char_line09=272'h3FFFC61800200C0002010C3000000000181800E0018000E00000000000000000000,
char_line0a=272'h0006061800200C00020184200000000018180160018001600000000000000000000,
char_line0b=272'h0007061800200C00022184400000000018080160018001600000000000000000000,
char_line0c=272'h0006061800100C003FF0808000000000300C0260018002600000000000000000000,
char_line0d=272'h080C0618001018000200000000000000300C0460018004600000000000000000000,
char_line0e=272'h040C0618001018000200180000000000300C0460018004600000000000000000000,
char_line0f=272'h020C06180018180002027FFC00000000300C0860018008600000000000000000000,
char_line10=272'h01980618000830000209801800000000300C0860018008600000000000000000000,
char_line11=272'h00D80618000C30007FFD001800000000300C1060018010600000000000000000000,
char_line12=272'h00700618000460000219001800000000300C3060018030600000000000000000000,
char_line13=272'h00380618000660000219001800000000300C2060018020600000000000000000000,
char_line14=272'h007C06180002C0000219101800000000300C4060018040600000000000000000000,
char_line15=272'h00CE06180003C0000211F9F800000000300C7FFC01807FFC0000000000000000000,
char_line16=272'h00C7061800018000021100180000000018080060018000600000000000000000000,
char_line17=272'h018386180003C00002B100180000000018180060018000600000000000000000000,
char_line18=272'h030380180006E000027100180000000018180060018000600000000000000000000,
char_line19=272'h06018018000C780002210018000000000C300060018000600000000000000000000,
char_line1a=272'h0C00001800381E0002010018000000000620006003C000600000000000000000000,
char_line1b=272'h1000001800600FC00201FFF80000000003C003FC1FF803FC0000000000000000000,
char_line1c=272'h200001F8018003FC020100180000000000000000000000000000000000000000000,
char_line1d=272'h400000700E0000F0020100180000000000000000000000000000000000000000000,
char_line1e=272'h0000002030000000020200000000000000000000000000000000000000000000000,
char_line1f=272'h0000000000000000000000000000000000000000000000000000000000000000000;
reg[8:0] char_bit;
[email protected](posedge CLK_to_DAC)
if(X==10'd144)char_bit<=9'd272; //当显示到144像素时准备开始输出图像数据
else if(X>10'd144&&X<10'd416) //左边距屏幕144像素到416像素时 416=144+272(图像宽度)
char_bit<=char_bit-1'b1; //倒着输出图像信息
reg[29:0] vga_rgb; //定义颜色缓存
[email protected](posedge CLK_to_DAC)
if(X>10'd144&&X<10'd416) //X控制图像的横向显示边界:左边距屏幕左边144像素 右边界距屏幕左边界416像素
begin
//case(Y)
vga_rgb<=30'b1111111111_1111111111_0000000000; //Y控制图像的纵向显示边界:从距离屏幕顶部160像素开始显示第一行数据
/*
10'd160:
if(char_line00[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000; //如果该行有数据 则颜色为红色
else vga_rgb<=30'b0000000000_0000000000_0000000000; //否则为黑色
10'd162:
if(char_line01[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd163:
if(char_line02[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd164:
if(char_line03[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd165:
if(char_line04[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd166:
if(char_line05[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_z0000000000_0000000000;
10'd167:
if(char_line06[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd168:
if(char_line07[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd169:
if(char_line08[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd170:
if(char_line09[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd171:
if(char_line0a[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd172:
if(char_line0b[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd173:
if(char_line0c[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd174:
if(char_line0d[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd175:
if(char_line0e[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd176:
if(char_line0f[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd177:
if(char_line10[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd178:
if(char_line11[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd179:
if(char_line12[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd180:
if(char_line13[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd181:
if(char_line14[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd182:
if(char_line15[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd183:
if(char_line16[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd184:
if(char_line17[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd185:
if(char_line18[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd186:
if(char_line19[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd187:
if(char_line1a[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd188:
if(char_line1b[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd189:
if(char_line1c[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd190:
if(char_line1d[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd191:
if(char_line1e[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
10'd192:
if(char_line1f[char_bit])vga_rgb<=30'b1111111111_1111111111_0000000000;
else vga_rgb<=30'b0000000000_0000000000_0000000000;
default:vga_rgb<=30'h0000000000; //默认颜色黑色
endcase
*/
end
else vga_rgb<=30'b1111111111_0000000000_1111111111; //否则黑色
assign VGA_R=vga_rgb[23:16];
assign VGA_G=vga_rgb[15:8];
assign VGA_B=vga_rgb[7:0];
endmodule
使用汉字点阵将汉字代码中的汉字替换,然后实现VGA显示
三、参考博客
(121条消息) 【FPGA实验】基于DE2-115平台的VGA显示_机智的橙子的博客-CSDN博客
边栏推荐
- Sword finger offer II 029 Sorted circular linked list
- 论文阅读:Graph Contrastive Learning with Augmentations
- Leetcode: Sword finger offer II 091 Painting house [2D DP]
- 关于猜数字游戏的实现
- An article clearly explains MySQL's clustering / Federation / coverage index, back to table, and index push down
- Maui的学习之路(二)--设置
- 一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推
- [machine learning] model and cost function
- 坡道带来的困惑
- Related examples of data storage in memory
猜你喜欢

leetcode - 384. Scramble array

Rust,程序员创业的最佳选择?

Win7显示屏幕亮度在哪里可以调节

Uncover gaussdb (for redis): comprehensive comparison of CODIS

On the realization of guessing numbers game

【开源鸿蒙系统展示】RK3568开发板搭载OpenHarmony 3.1 Release

揭秘GaussDB(for Redis):全面对比Codis

Configuring pytorch in win10 environment

药物设计新福音:腾讯联合中科大、浙大开发自适应图学习方法,预测分子相互作用及分子性质

Sword finger offer II 028 Flatten multi-level bidirectional linked list
随机推荐
Three lines of code to simply modify the project code of the jar package
Analyse de l'optimisation de la réécriture des requêtes lazyagg de l'entrepôt
OpenStack学习笔记(二)
【开源鸿蒙系统展示】RK3568开发板搭载OpenHarmony 3.1 Release
leetcode:剑指 Offer II 091. 粉刷房子【二维dp】
Maui的学习之路(二)--设置
On the compatibility of the disabled attribute of input on the mobile terminal
Method for wrapping multiple promise instances into a new promise instance
Heavyweight live | bizdevops: the way to break the technology situation under the tide of digital transformation
Using swiper to realize seamless rotation of multiple slides
And console Log say goodbye
Win7显示屏幕亮度在哪里可以调节
Some knowledge of the initial C language
Sword finger offer II 028 Flatten multi-level bidirectional linked list
KDD 2022 | graphmae: self supervised mask map self encoder
1024 hydrology
Which Chinese virtual human is better? Sullivan, IDC: Xiaobing Baidu Shangtang ranks in the first echelon
Component: is to switch between multiple components
J2EE from entry to earth 01 MySQL installation
关于结构体,枚举,联合的一些知识