VGA的接口很少,一个行,一个场,三个RGB信号口,不同的分辨率对应不同的时钟频率,

这里以800*600的50M的时钟为例,它的行同步脉冲长度为120,行同步后沿脉冲计数为

64,行可视区脉冲为800,行同步前沿脉冲为56,也就是说,用50M的时钟来驱动,行信号

先给120个时钟的低电平,然后是64个时钟的高平,用来指示到了后沿,再来800个时钟

的高电平信号表示到了行有效区,最后再来56个时钟的高电平表示,行同步前沿。如此循环

进行行扫描,。

场同步长度为6个时钟脉宽长度,场后沿为23个时钟脉宽长度,场可视区为600个脉宽长度,

场前沿为37个时钟脉宽长度。666行为一场。

有些东西不管你多么熟悉,总感觉过上一段时间就给忘掉了,有倒是好记性不如烂笔头

在这里做下记录。

以下是自己写的一个VGA的控制接口,只要给RGB信号赋值就能显示不同的颜色,要怎样显示

就看去怎样处理接口了。

由于想从SDRAM中读出数据来画出曲线,一时也不知道该怎么去显示,因为VGA显示是从上往下

一行一行的扫描,而数据要显示要用我们正常的坐标,便和同学聊了一下,他给提议,在每一行中

都把数据扫描一次,这才有了下面的第二个段程序。和大家一起聊聊总会有所收获的。

//---------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------
 `define tend_h_syn   ( Clk_H_cnt == (11'd119) )//行同步计数脉冲个数
 `define tend_h_pre         ( Clk_H_cnt == (11'd1039) ) //行同步前沿计数脉冲个数
 `define tend_h_back   ( Clk_H_cnt == (11'd183) )//行同步后沿脉冲计数个数
 `define tend_h_visible   ( Clk_H_cnt == (11'd983) )//行可视区脉冲个数
 `define tend_v_syn   ( Clk_V_cnt == (11'd5) ) //场同步计数脉冲个数
 `define tend_v_pre    ( Clk_V_cnt == (11'd665) ) //场同步前沿计数脉冲个数
 `define tend_v_visible  ( Clk_V_cnt == (11'd628) )//场可视区脉冲个数
 `define tend_v_back   ( Clk_V_cnt == (11'd28) )//场同步后沿脉冲计数个数
 //----------------------------------------------------------------
 //行同步状态
 //-----------------------------------------------------------------
  `define H_SYN    2'd0//行同步
 `define H_PRE         2'd1 //行同步前沿
 `define H_BACK   2'd2 //行同步后沿
 `define H_VISIBLE   2'd3//行可视区
 //-----------------------------------------------------------------
 //场同步状态
 //-----------------------------------------------------------------
  `define V_SYN    2'd0 //场同步
 `define V_PRE    2'd1 //场同步
 `define V_VISIBLE   2'd2//场可视区
 `define V_BACK   2'd3 //场同步后沿
 
module VGA_Ctrl(Clk,Rst_n,Hsync,Col_Ctrl,
   Vsync,Vga_r,Vga_g,Vga_b,H_Coord,
   V_Coord,Data_Valid
   );
input Clk;//输入50M时钟
input Rst_n;// reset signal
input [7:0] Col_Ctrl;
output [2:0] Vga_r;
output [2:0] Vga_g;
output [1:0] Vga_b;
output Hsync;//行同步信号
output Vsync;//场同步信号
output [9:0] H_Coord;//行坐标
output [9:0] V_Coord;//列坐标
output Data_Valid;//有效显示区指示信号

reg[1:0] H_State;
reg[1:0] V_State;
assign {Vga_r,Vga_g,Vga_b} = Data_Valid ? Col_Ctrl : 8'hzz;

如果在无效区就不显示RGB就不发送数据。
//****************************************************************
//计数脉冲控制信号
//*****************************************************************
reg [10 : 0] Clk_H_cnt;
reg [10 : 0] Clk_V_cnt;
always@( posedge Clk or negedge Rst_n) //行扫描计数器
if(!Rst_n) Clk_H_cnt <= 11'd0;
else if(Clk_H_cnt == 11'd1039) Clk_H_cnt <= 11'd0;
else Clk_H_cnt <= Clk_H_cnt + 1'b1;

wire V_Clk = (Clk_H_cnt ==11'd1039);

always@( posedge V_Clk or negedge Rst_n) //场扫描计数器
if(!Rst_n)  Clk_V_cnt <= 11'd0;
else if(Clk_V_cnt == 11'd665) Clk_V_cnt <= 11'd0;
else  Clk_V_cnt <= Clk_V_cnt + 1'b1;

//*****************************************************************
//行扫描状态机
//***************************************************************

always@( posedge Clk or negedge Rst_n) begin
 if(!Rst_n) begin
   H_State <= `H_SYN;
   end
 else begin
  case( H_State )
   `H_SYN : begin   
     H_State <= `tend_h_syn ? `H_BACK:`H_SYN;
    end
   `H_BACK : begin     
     H_State <= `tend_h_back ? `H_VISIBLE : `H_BACK;
    end
   `H_VISIBLE : begin
     H_State <= `tend_h_visible ? `H_PRE : `H_VISIBLE;
    end
   `H_PRE : begin
     H_State <= `tend_h_pre ? `H_SYN : `H_PRE;
    end
   default :;
   endcase
   end
end
//*********************************************************************
//场扫描状态机
//************************************************************************
always@( posedge V_Clk  or negedge Rst_n) begin
 if(!Rst_n) begin
  V_State <= `V_SYN;

end
 else
  case(V_State)
    `V_SYN : begin
     V_State <= `tend_v_syn  ? `V_BACK: `V_SYN;
    end
    `V_BACK : begin
     V_State <= `tend_v_back ? `V_VISIBLE : `V_BACK;
    end
   `V_VISIBLE : begin
     V_State <= `tend_v_visible ? `V_PRE : `V_VISIBLE;
    end
   `V_PRE : begin
     V_State <= `tend_v_pre ? `V_SYN : `V_PRE;
    end
   default:;
  endcase

end
//******************************************************************
//行场有效区计数扫描 接 口
//*****************************************************************
reg[9:0] H_Cnt;
reg[9:0] V_Cnt;
always@( posedge Clk or negedge Rst_n) begin
if(!Rst_n) H_Cnt <= 10'd0;
else if(H_Cnt == 10'd799) H_Cnt <= 10'd0;
else  if(H_State == `H_VISIBLE)
 H_Cnt <= H_Cnt + 1'b1;
else H_Cnt <= 10'd0;
 end
always@( posedge V_Clk or negedge Rst_n) begin
if(!Rst_n) V_Cnt <= 10'd0;
else if( V_Cnt == 10'd599) V_Cnt <= 10'd0;
else if( V_State == `V_VISIBLE)
 V_Cnt <= V_Cnt + 1'b1;
else V_Cnt <= 10'd0;
 end
 reg [7:0]test_r;
/*always@(posedge Clk or negedge Rst_n)
begin
if(!Rst_n) test_r <= 8'd0;
else if((H_Cnt >= 20 && H_Cnt <= 100 ) &&(V_Cnt >= 20 && V_Cnt <= 100))
 test_r <= 8'hf0;
 else test_r <= 8'hzz;
end*/
assign Hsync = ~(H_State == `H_SYN);
assign Vsync = ~(V_State == `V_SYN);
assign H_Coord = H_Cnt;
assign V_Coord = V_Cnt;
assign Data_Valid = ((H_State == `H_VISIBLE) && (V_State == `V_VISIBLE));
endmodule

*************************************************************************

以下为一个VGA的RGB产生一段程序

*************************************************************************

module VGA_Data(H_Coord,V_Coord,Clk,Rst_n,Col_Ctrl);

input Clk;
input Rst_n;
input[9 : 0] H_Coord;//读出的行
input[9 : 0] V_Coord;//读出的场
output[7 : 0] Col_Ctrl;

reg[7 : 0] Col_Ctrl_R;
wire[9 : 0] X_Coord = (H_Coord - 200) ;//转换成相应的X坐标
wire[9 : 0] Y_Coord = (500 - V_Coord) ;//转换成相应的Y坐标

always@(posedge Clk ) begin
if((X_Coord > 10'd0) && (X_Coord <= 10'd500) && Y_Coord == 10'd0 ||
 (Y_Coord >= 10'd0 && Y_Coord <= 10'd400 && X_Coord == 10'd0))
  Col_Ctrl_R <= 8'h00;
else if(Y_Coord == Cnt && X_Coord >= 0 && X_Coord <=500)
 Col_Ctrl_R <= 8'h00;
else Col_Ctrl_R <= 8'hff;

end
reg [7 : 0] Cnt;
always@(posedge Clk or negedge Rst_n) begin
if(!Rst_n) Cnt <= 8'd0;
else if(X_Coord >= 0 && X_Coord <256)Cnt <= Cnt + 1'b1;
else Cnt <= 8'd0;
end
assign Col_Ctrl = Col_Ctrl_R;
endmodule

转载于:https://www.cnblogs.com/zhongguo135/archive/2012/09/24/2700379.html

FPGA之VGA控制相关推荐

  1. 基于FPGA的VGA控制输出显示(使用GM7123高清视频编码芯片)

    目录 一.VGA原理 1.VGA接口简介 2.VGA显示原理 二.VGA模块 三.VGA接口设计 1.设计要求 2.设计实现 3.实现结果 四.总结 一.VGA原理 1.VGA接口简介 VGA的全称是 ...

  2. FPGA实现VGA显示(三)——————单个字符显示

    这里笔者首先记录一个问题,给自己提个醒,所有的模块都有一点点的问题,在行数列数都可能有一行像素的误差,有可能是在驱动和显示模块的问题,等后面修改,这里第一次做,只要不影响显示,实现功能. 字符显示只修 ...

  3. 基于FPGA的VGA/LCD显示控制器设计(中)

    今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货. 之前也有图像处理以及V ...

  4. 基于FPGA的VGA协议实现

    基于FPGA的VGA协议实现 一.VGA简述 1.VCG接口 2.原理 3.显示器扫描 4.VGA时序分析 5.VGA时钟计算 6.不同分辨率的VGA参数 二.显示彩条 1.色彩原理 2.彩条输出 三 ...

  5. imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊

    写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...

  6. 基于FPGA的VGA显示对贪吃蛇游戏的设计

    基于FPGA的VGA显示对贪吃蛇游戏的设计 摘要 目前,电子数码产品已经进入了人生活的方方面面,而大多数电子产品都依靠显示屏来传递信息,由此可见用电路对显示屏进行控制的研究有很大的实用价值和市场需求. ...

  7. FPGA学习——VGA显示

    FPGA学习--VGA显示 一.VGA原理 (一)VGA协议 (二)VGA端口结构 (三)⾊彩原理 (四)扫描原理 1.扫描方式 2.逐行扫描 3.隔行扫描 (五)⾏场信号 二.显示姓名学号 (一)实 ...

  8. FPGA——用VGA时序显示图像(3)(代码)

    FPGA--用VGA时序显示图像原理详解(1)_居安士的博客-CSDN博客_vga时序 FPGA--用VGA时序显示图像原理详解(2)_居安士的博客-CSDN博客_vga显示时序 关于VGA时序的原理 ...

  9. FPGA——SPI总线控制flash(3)含代码

    前面几篇详细 介绍了SPI的原理,并且实现了对flash芯片的写使能,读状态,擦除,页读,页写 ​​​​​​FPGA--SPI总线详解(概念)_居安士的博客-CSDN博客_fpga芯片 FPGA--S ...

最新文章

  1. 什么叫「真的理解」?我们对 AI 的要求或许有点过分
  2. 乌兰浩特市大数据平台助力就业脱贫
  3. centos7离线安装bazel
  4. PageRank行将过时 搜索引擎遭遇范式转移
  5. recycleview 清空数据 滚动顶部_爱剪辑:制作数字滚动效果,翻滚吧字幕!
  6. 前端学习(603):计算机基础
  7. 【Python】PyCharm新建PythonPackage呈现出普通Dictionary的样式的解决方法
  8. 软件工程软件产品质量要求与评价_软件工程定义
  9. Android开发笔记(一百零三)地图与定位SDK
  10. 2021牛客暑期多校训练营8,签到题ADEK
  11. mysql数据库多表查询出来多条重复数据--处理方法--distinct
  12. java中立方根方法,Java Math.cbrt() 方法
  13. C#编写的Word操作类,有换页,添加表格,文本功能
  14. PROFINET的GSD文件描述
  15. MySQL操作数据库语法及常见MySQL面试题与答案
  16. Node学习HTTP模块(HTTP 服务器与客户端)
  17. 一套用了 70 年的计算机架构 —— 冯·诺依曼架构
  18. numpy、pandas下载速度慢问题
  19. 快讯| RStudio Connect 发布
  20. 西门子200与计算机通讯,S7 200与电脑通讯不上-工业支持中心-西门子中国

热门文章

  1. Android 数据库综述(二) 程序计算器与信号量来处理多线程并发问题
  2. 事物注解方式: @Transactional
  3. Git-根据tag创建分支
  4. HTML系列(四):编辑图像
  5. vim打开出现的文档^M什么
  6. Git服务器搭建及SSH无密码登录设置
  7. Android源码-Logger日志系统
  8. 源表字段修改以后引发GoldenGate同步失败
  9. MVC3.0中使用JQuery.DataTable插件。
  10. 英语 面包为什么不可数?