基于VerilogHDL的VGA驱动设计

VGA简介

VGA接口共有15针,分成3排,每排5个孔,显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号)。基于FPGA设计来驱动VGA也可以达到我们平时所看到的显示结果。以Quartus II软件作为开发环境,Verilog HDL硬件描述语言描述VGA驱动各功能模块,不仅可以很方便的调整内部逻辑电路,优化性能,还可以显示不同的效果。 FPGA的工作速度比较快、处理像素点的速度也比较快,所以具有较好的性能和稳定性。

设计流程

我大概的设计思路如下:
我们设计一个东西时,思路很重要。当我们要通过驱动VGA来显示时,那么我们就先要选择显示的内容,即选择图片并确定控制这张图片的大小。为什么要控制大小呢?我们后面接着说。之后我们要让这个图片以什么模式显示,则我们就要选择显示模式。然后我们要按照所选的显示模式,设置该模式所需要的工作时钟,若学习板上的时钟不足以支持工作,那么我们就要使用的锁相环定制出所需要的时钟频率。当我们获取足够的时钟频率后,我们就可以真正的进行设计VGA的驱动了。当我们选择好显示模式时,那意味着我们的同步时序模块就可以定下来了。我们要根据所选模式的时序图来设计同步时序模块。一些要点我们会在后面详细说明。当我们选择的图片直接给我们的开发板,它是读不懂的。所以我们要把先把图片转换成开发板能读懂的文件,然后我们在把文件存到我们的开发板里面去,这时候我们就要考虑,我们开发板最多可以存多少东西呢?所以我们的显示的图片的大小会受到限制,不像电脑主机有非常之多的内存。当我们完成把图片转换成开发板能读得懂文件后,我们就可以设计输出模块了。我们的输出模块是在同步时序模块的基础是建立的,我们输出模块是根据图片的大小来设计的。完成我能的所有的准备模块之后,我们需要一个总的模块将全部模块连接在一起,然后我们就可以进行测试了。这就是我设计的大概过程。

流程图

显示模式表

VGA的协议

**VGA 协议主要由 5 个输入信号组成,亦是 HSYNC Signal,VSYNC Signal, R,G,B Signal。说简单一点, HSYNC Signal 是 “水平同步信号”(horizontal Synchronize) , VSYNC Signal 是“垂直同步信号”( vertical Synchronize) , R, G ,B Signal 是“ 红色-绿色-蓝色 颜色信号” 。这一点我们可以通过VGA接口的引脚图就可以知道。

以800X600@60为例

其中VSYNC Signal为行像素,HSYNC Signal为列像素。1 个行像素 = 1056 个列像素。水平同步信号和垂直同步信号同样分为四段同步段(a和o)、 后廊段(b和p)、激活段(c和q)、前廊段(d和r)。由时序图我们可以知道同步段电平是拉低的,后廊段将电平拉高、激活段保持高电平、前廊段将电平拉低。而我们要显示的图形是在激活段中显示的,列像素 > 216 && 列像素 < 1017 && 行像素 >27&& 行像素 <627。时序读懂,其他都好做。
105662860=39790080
至少需要一个40MHz晶振

根据时钟需求,定制时钟频率,再根据时序图搭建同步模块,再根据图片大小建立输出模块,最后用一个总层来把关联端口关联起来。
对输出信息处理,生成mif文件再把文件存进FPGA的ROM(即生成对应的ROM)。
如对输出信息有分辨率要求,提高RGB的位,将RGB位提到8位,则2^8=256,可高度还原输出,不然可能产生失真。代码如下

module sync_module//同步模块(CLK, RSTn,VSYNC_Sig, HSYNC_Sig, Ready_Sig,Column_Addr_Sig, Row_Addr_Sig);   input CLK;input RSTn;output VSYNC_Sig;//行同步信号output HSYNC_Sig;//列同步信号output Ready_Sig;//有效区域信号output [10:0]Column_Addr_Sig;//有效区域像素点列坐标output [10:0]Row_Addr_Sig;//有效区域像素点行坐标/********************************/reg [10:0]Count_H;//水平方向计数变量always @ ( posedge CLK or negedge RSTn )if( !RSTn )Count_H <= 11'd0;else if( Count_H == 11'd1056 )//列方向共 1056Count_H <= 11'd0;elseCount_H <= Count_H + 1'b1;/********************************/reg [10:0]Count_V;//垂直方向计数变量always @ ( posedge CLK or negedge RSTn )if( !RSTn )Count_V <= 11'd0;else if( Count_V == 11'd628 )Count_V <= 11'd0;else if( Count_H == 11'd1056 )//一行结束Count_V <= Count_V + 1'b1;/********************************/reg isReady;always @ ( posedge CLK or negedge RSTn )if( !RSTn )isReady <= 1'b0;//else if( ( Count_H > 11'd216 && Count_H < 11'd1017 ) &&( Count_V > 11'd27 && Count_V < 11'd627 ) )//C 段 Q 段else if( ( Count_H > 11'd572 && Count_H < 11'd636) &&( Count_V > 11'd313 && Count_V < 11'd377 ) )//C 段 Q 段控制显示范围isReady <= 1'b1;elseisReady <= 1'b0;/*********************************///垂直、水平同步信号产生;有效区域信号驱动输出assign VSYNC_Sig = ( Count_V <= 11'd4 ) ? 1'b0 : 1'b1;assign HSYNC_Sig = ( Count_H <= 11'd128 ) ? 1'b0 : 1'b1;assign Ready_Sig = isReady;/********************************/assign Column_Addr_Sig = isReady ? Count_H - 11'd572 : 11'd0;// 确保列地址从0开始
assign Row_Addr_Sig = isReady ? Count_V - 11'd313 : 11'd0; // 确保行地址从0开始endmodule
//产生有效区域像素点的坐标

//输出模块
module vga_control_module(CLK, RSTn,
Ready_Sig, Column_Addr_Sig, Row_Addr_Sig,
Red_Rom_Data, Green_Rom_Data, Blue_Rom_Data,
Rom_Addr,
Red_Sig, Green_Sig, Blue_Sig);input CLK;input RSTn;input Ready_Sig;
input [63:0]Red_Rom_Data;
input [63:0]Green_Rom_Data;
input [63:0]Blue_Rom_Data;output [5:0]Rom_Addr;input [10:0]Column_Addr_Sig;input [10:0]Row_Addr_Sig;output Red_Sig;output Green_Sig;output Blue_Sig;//reg isRectangle;//矩形标志寄存器//读取行地址低6位
reg [5:0]m;always @ ( posedge CLK or negedge RSTn )if( !RSTn )m <= 6'd0;else if( Ready_Sig && Row_Addr_Sig < 64 )m <= Row_Addr_Sig[5:0];elsem <= 6'd0;//读取列地址低6位
reg [5:0]n;always @ ( posedge CLK or negedge RSTn )if( !RSTn )n <= 6'd0;else if( Ready_Sig && Column_Addr_Sig < 64 )n <= Column_Addr_Sig[5:0];elsen <= 6'd0;assign Rom_Addr = m; //输出存储器地址/************************************/assign Red_Sig = Ready_Sig ? Red_Rom_Data[ 6'd63 - n ] : 1'b0;//读取存储器内容“逐行扫描”,"高位在前"
assign Green_Sig = Ready_Sig ? Green_Rom_Data[ 6'd63 - n ] : 1'b0;assign Blue_Sig =  Ready_Sig ? Blue_Rom_Data[ 6'd63 - n ] : 1'b0;endmodule
/***********************************/
///
//顶层
module vga_module(CLK, RSTn,VSYNC_Sig, HSYNC_Sig,Red_Sig, Green_Sig, Blue_Sig);input CLK;input RSTn;output VSYNC_Sig;output HSYNC_Sig;output Red_Sig;output Green_Sig;output Blue_Sig;/*************************************/wire CLK_40Mhz;PLL_40MHz U1(
.inclk0( CLK ),// input - from top.c0( CLK_40Mhz )// output - inter global);/**************************************/wire [10:0]Column_Addr_Sig;wire [10:0]Row_Addr_Sig;wire Ready_Sig;sync_module U2(.CLK( CLK_40Mhz ),.RSTn( RSTn ),.VSYNC_Sig( VSYNC_Sig ),// output - to U3.HSYNC_Sig( HSYNC_Sig ),// output - to U3.Column_Addr_Sig( Column_Addr_Sig ), // output - to U3.Row_Addr_Sig( Row_Addr_Sig ),// output - to U3.Ready_Sig( Ready_Sig )// output - to U3);/******************************************/
wire[63:0]Red_Rom_Data;Red_rom U3
(
.clock(CLK_40Mhz),
.address(Rom_Addr),
.q(Red_Rom_Data)
);
//
wire[63:0]Green_Rom_Data;Green_rom U4
(
.clock(CLK_40Mhz),
.address(Rom_Addr),
.q(Green_Rom_Data)
);//
wire[63:0]Blue_Rom_Data;Blue_rom U5
(
.clock(CLK_40Mhz),
.address(Rom_Addr),
.q(Blue_Rom_Data)
);
//wire[5:0]Rom_Addr;vga_control_module U6(.CLK( CLK_40Mhz ),.RSTn( RSTn ),.Ready_Sig( Ready_Sig ),// input - from U2.Column_Addr_Sig( Column_Addr_Sig ), // input - from U2.Row_Addr_Sig( Row_Addr_Sig ),// input - from U2
.Red_Rom_Data(Red_Rom_Data),
.Green_Rom_Data(Green_Rom_Data),
.Blue_Rom_Data(Blue_Rom_Data),
.Rom_Addr(Rom_Addr),.Red_Sig( Red_Sig ),// output - to top.Green_Sig( Green_Sig ),// output - to top.Blue_Sig( Blue_Sig )// output - to top);endmodule/*******************************************/

对应时钟和ROM文件用Quartus II生成即可。

基于VerilogHDL的VGA驱动设计相关推荐

  1. 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

    前言 上一篇 基于ABP落地领域驱动设计-01.全景图 概述了DDD理论和对应的解决方案.项目组成.项目引用关系,以及基于ABP落地DDD的通用原则.从这本篇开始,会更加深入地介绍在基于 ABP Fr ...

  2. 基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则

    dotNET兄弟会 专注.Net开源技术及跨平台开发!致力于构建完善的.Net开放技术文库!为.Net爱好者提供学习交流家园! 公众号 围绕DDD和ABP Framework两个核心技术,后面还会陆续 ...

  3. 基于ABP落地领域驱动设计-06.正确区分领域逻辑和应用逻辑

    系列文章 基于ABP落地领域驱动设计-01.全景图 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则 基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则 基于ABP落地领域驱动设 ...

  4. 基于FPGA的VGA接口设计(三)

    关于VGA系列文章的所有链接: 基于FPGA的VGA接口设计(一) 基于FPGA的VGA接口设计(二) 基于FPGA的VGA接口设计(三) 结篇   在之前的文章中介绍了有关VGA的扫描方式.行场同步 ...

  5. 基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写)

    基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让 ...

  6. linux 内核 scsi底层驱动程序,Linux系统下基于SCST的SCSI_Target驱动设计.doc

    Linux系统下基于SCST的SCSI target驱动设计 摘要 随着信息数字化的深入发展,数据存储的需求日益增长.存储虚拟化带给我们最直接的益处就是,提高存储利用率,降低成本,简化存储管理,而基于 ...

  7. 基于ABP落地领域驱动设计-01.全景图

    什么是领域驱动? 领域驱动设计(简称:DDD)是一种针对复杂需求的软件开发方法.将软件实现与不断发展的模型联系起来,专注于核心领域逻辑,而不是基础设施细节.DDD适用于复杂领域和大规模应用,而不是简单 ...

  8. 基于linux的驱动设计,《基于LINUX的虚拟驱动设计》-毕业论文.doc

    PAGE 40 l 摘 要 驱动程序是当前最热门.最有发展前途的IT应用技术之一.目前的驱动程序的开发主要应用在包括键盘 .鼠标.扫描仪.打印机以及存储设备等日益普及的设备之间的通讯上.但是要使这些设 ...

  9. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践

    围绕DDD和ABP Framework两个核心技术,后面还会陆续发布核心构件实现.综合案例实现系列文章,敬请关注! ABP Framework 研习社(QQ群:726299208) ABP Frame ...

  10. 基于DDD(领域驱动设计)的微服务设计实例

    目录 一.战略设计: 1.产品愿景 2.场景分析 3.领域建模 1)提取领域对象 2)构建聚合 3)划分界限上下文 4.微服务拆分 二.战术设计 1.分析微服务领域对象 1)服务识别和设计 2)聚合内 ...

最新文章

  1. C++中std::function和std::bind
  2. [渝粤题库]陕西师范大学《幼儿园科学教育》作业
  3. 被吐嘈的NodeJS的异常处理
  4. ubuntu14.04+ceres安裝(亲测)
  5. xpath下面的xpath_深入研究XPATH查询
  6. android系统耗电如何关闭,安卓手机建议关闭这4大功能,耗电快的罪魁祸首?不用一天三充了...
  7. ASP.NET输入文本框自动提示功能
  8. Label free定量蛋白质组学
  9. Linux查看最近开关机记录
  10. 留学回国人员申办上海常住户口实施细则
  11. 关于在递归中删除链表结点不会导致链表断链的理解
  12. php关键词回复源码,PHP对接微信公众号实现简单自动回复
  13. 分享120个HTML公司企业模板,总有一款适合您
  14. 小问题--电脑开机一连上网就总是会安装各种软件的问题及解决
  15. 制作可以用航模遥控器遥控的ESP32小车
  16. WPF工控组态软件之冷却塔和空气压缩机开发
  17. 9月11日 XE8移动开发入门(五)XE8中使用DataSnap三层架构和Beacon组件简介
  18. Archive of Our Own_为什么说for...of循环是JS中的宝石?
  19. 【Milvus的人脸检索】
  20. 关于xlrd.biffh.XLRDError: Excel xlsx file; not supported报错问题的两种解决方案

热门文章

  1. CSS中几种解决高度坍塌方式分析
  2. ROS学习笔记9 —— launch文件
  3. nbu新增media server过程简介
  4. Visual C++网络编程经典案例详解 第9章 实用播放器 编程基础 播放mp3文件 读取文件
  5. java辛普生公式_Java – Simpson的方法和错误
  6. 实验报告《私有云搭建》
  7. 现在dns怎么解析域名呢?dns的形式有哪些?
  8. JavaSE基础笔记——字符串常用类/ArrayList(集合)
  9. CentOS7-1810 系统DNS服务器BIND软件配置说明
  10. 基于PHP和YII框架技术的班级管理系统 | 饭饭博客