DE2-115 FPGA开发板的VGA显示
目录
一、VGA简介
二、VGA实现代码
三、参考博客
一、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_50output 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;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; //VGA时钟等于CLK_25取反assign CLK_to_DAC = CLK_25;always@(posedge CLK_to_DAC)beginif(H_Cont<H_TOTAL) //如果行计数器小于行总时长H_Cont<=H_Cont+1'b1; //行计数器+1else H_Cont<=0; //否则行计数器清零if(H_Cont==H_FRONT-1) //如果行计数器等于行前沿空白时间-1VGA_HS<=1'b0; //行同步信号置0if(H_Cont==H_FRONT+H_SYNC-1) //如果行计数器等于行前沿+行同步-1VGA_HS<=1'b1; //行同步信号置1if(H_Cont>=H_BLANK) //如果行计数器大于等于行空白总时长X<=H_Cont-H_BLANK; //X等于行计数器-行空白总时长 (X为当前行第几个像素点)else X<=0; //否则X为0endalways@(posedge VGA_HS)beginif(V_Cont<V_TOTAL) //如果场计数器小于行总时长V_Cont<=V_Cont+1'b1; //场计数器+1else V_Cont<=0; //否则场计数器清零if(V_Cont==V_FRONT-1) //如果场计数器等于场前沿空白时间-1VGA_VS<=1'b0; //场同步信号置0if(V_Cont==V_FRONT+V_SYNC-1) //如果场计数器等于行前沿+场同步-1VGA_VS<=1'b1; //场同步信号置1if(V_Cont>=V_BLANK) //如果场计数器大于等于场空白总时长Y<=V_Cont-V_BLANK; //Y等于场计数器-场空白总时长 (Y为当前场第几行) else Y<=0; //否则Y为0endreg valid_yr;always@(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; always@(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; //连线Xassign y_dis=Y; //连线Yparameter //点阵字模:每一行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;always@(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; //定义颜色缓存always@(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*/ endelse 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博客
尝试用Verilog驱动VGA_Joyce_Ng的博客-CSDN博客_verilog vga
基于DE2-115 FPGA开发板的VGA显示_春哥笔记的博客-CSDN博客_fpga开发板de2
DE2-115 FPGA开发板的VGA显示相关推荐
- 基于DE2-115 FPGA开发板的VGA显示
文章目录 一.VGA简介 二.基于DE2-115 FPGA开发板的VGA显示 一.VGA简介 VGA的全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传 输的 ...
- 使用 FPGA 开发板采用 Verilog 编程练习基于 VGA 图像显示
目录 一.VGA 简介 二.实验内容 2.1 Quartus 新建工程 2.2 新建 Verilog 文件 2.3 配置管脚 2.4 DE2-115 开发板连接 2.5 烧录程序 三.总结 四.参考资 ...
- 共阳数码管段码表_正点原子开拓者FPGA开发板资料连载第十一章 静态数码管显示实验...
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- 手把手教你如何使用Multisim对Digilent FPGA开发板进行编程
1.jpg (43.84 KB, 下载次数: 0) 下载附件 2017-6-1 20:03 上传 FPGA正在逐渐成为EECS专业的同学们在校期间学习掌握的一项必备技能.无论是在课程实验.竞赛作品.科 ...
- fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- FPGA开发板的作用
曾经和几位老朋友谈起来开发板的作用. FPGA开发板的作用(简论,仅代表个人意见) 请先看以下文章: http://www.terasic.com.tw/cgi-bin/page/archive.pl ...
- 基于FPGA开发板使用Verilog设计PWM呼吸灯实验
基于FPGA开发板使用Verilog设计PWM呼吸灯实验 1,实验原理 2,实验模块设计 2.1 RTL设计,呼吸灯模块设计 2.2,测试数据,下载到FPGA开发板板级的数据 2.3,两个模块综合的n ...
- VHDL编写多功能数字钟,spartan3 FPGA开发板硬件实现-学习笔记
VHDL编写多功能数字钟,spartan3 FPGA开发板硬件实现-学习笔记 多功能数字钟硬件测试视频: https://www.bilibili.com/video/av62501230 1.数字钟 ...
最新文章
- 树莓派4B Ubuntu18 vnc开机自启动
- tkinter中鼠标与键盘事件
- 信息学奥赛一本通 1200:分解因数 | OpenJudge 2.2 1751:分解因数
- 国际化标签 fmt:bundlefmt:message的使用
- 分页 Paginator
- java开发之权限管理详解
- win10taskkill强行结束进程_强制结束进程命令(ntsd命令/taskkill命令)使用教程
- deepl pro 2.0.0专业版
- 各大搜索引擎提交入口
- 最近四款非常火的广告设计软件,学会大有作为
- Linux 系统中如何恢复已删除的文件?
- 自制流媒体播放器(Qt+ffmpeg+SDL)小结
- document.getelementbyid是什么意思
- FileUploadException: Stream closed
- 周易六十四卦——同人卦
- NOI / 1.13编程基础之综合应用 21:最大质因子序列
- 软件测试适合女生吗?我30岁了能学会吗?我大专毕业能做吗?
- 操作系统第6次实验报告:使用信号
- 解决“E: Package ‘libqtgui4‘ has no installation candidate”无法安装qt4
- 软技能:代码之外的生存指南