VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右、从上到下(类似于电视扫描PAL)。除有效时间外,一行还有同步脉冲时间、后肩和前肩。(http://tinyvga.com/vgatiminghttp://wenku.baidu.com/view/13b3140102020740be1e9b94.html,

http://www.cnblogs.com/qiweiwang/archive/2011/01/17/1937688.html

然后根据时序实现显示标准的功能模块,完成同步信号的输出、有效区域标志和当前坐标。一行列像素计数完成后,行计数器加1,列像素计数器清零后继续计数,知道最后一行计数完成后,行计数器清零,重复上述过程。

 `timescale  ps/ ps
module sync_module(
output VSYNC_Sig,HSYNC_Sig,Ready_Sig,Frame_Sig,
output [:]Column_Addr_Sig,Row_Addr_Sig,
input CLK,RSTn
);
//VGA format: 640 X 480 @ 60Hz,pix width:0.039683us≈40ns,25MHz
//场扫描时序: 2--30--484-- 9, 525
//一般: 2--33--480-- 10
//行扫描时序:96--45--646--13, 800
//一般: 96--48--640--16 //VGA format: 1024 X 768 @ 60Hz,pix width:1/65MHz
//场扫描时序: 6-- 29-- 768-- 3, 806
//行扫描时序:136--160--1024--24, 1344
/********************************/ reg [:]Count_H; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Count_H <= 'd0;
else if( Count_H == 'd1343 )
Count_H <= 'd0;
else
Count_H <= Count_H + 'b1; /********************************/ reg [:]Count_V; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Count_V <= 'd0;
else if( Count_V == 'd805 )
Count_V <= 'd0;
else if( Count_H == 'd1343 )
Count_V <= Count_V + 'b1; /********************************/
wire isReady; assign isReady = ( ( Count_H >= 'd296 && Count_H <= 11'd1319 ) && //有效时间1024
( Count_V >= 'd35 && Count_V <= 11'd802 ) ) ? 'b1 : 1'b0; // /*********************************/ assign VSYNC_Sig = ( Count_V < 'd6 ) ? 1'b0 : 'b1; //场同步信号
assign HSYNC_Sig = ( Count_H < 'd136 ) ? 1'b0 : 'b1; //行同步信号
assign Ready_Sig = isReady;
assign Frame_Sig = ( Count_V == 'd805 ) ? 1'b1 : 'b0; //帧结束标志 /********************************/ assign Column_Addr_Sig = isReady ? Count_H - 'd296 : 11'd0; // Count from 0; 列地址
assign Row_Addr_Sig = isReady ? Count_V - 'd35 : 11'd0; // Count from 0; 行地址 /********************************/ endmodule

sync_module.v

第二个模块根据有效区域标志和当前坐标完成图像的显示,输出需要的RGB值,相对简单。

 `timescale  ps/ ps
module vga_control_module(
output Red_Sig,Green_Sig,Blue_Sig,
output[:]Rom_Addr,
input[:]Rom_Data,
input [:]Column_Addr_Sig,Row_Addr_Sig,
input Ready_Sig,Frame_Sig,CLK,RSTn
); /**********************************/
//greenman 16X16,6pics
//16X96,reg [15:0] mem [6:0],帧偏移量16 reg [:]m;
wire[:]row_addr;
wire row_valid;
assign row_addr = Row_Addr_Sig - 'd300; //图片显示起始位置y坐标:300
assign row_valid = row_addr < && row_addr >= ; //图片行有效0-15 always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
m <= 'd0;
else if( Ready_Sig && row_valid )
m <= row_addr[:];
else
m <= 'd0; /************************************/ reg [:]n;
wire[:]col_addr;
wire col_valid;
assign col_addr = Column_Addr_Sig - 'd500; //图片显示起始位置x坐标:500
assign col_valid = col_addr < && col_addr >= ; //图片列有效0-15 always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
n <= 'd0;
else if( Ready_Sig && col_valid )
n <= col_addr[:];
else
n <= 'd0; /**********************************/ parameter FRAME = 'd10; //每幅图像显示10帧 X 6 = 60Hz /**********************************/ reg [:]Count_Frame; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Count_Frame <= 'd0;
else if( Count_Frame == FRAME )
Count_Frame <= 'd0;
else if( Frame_Sig )
Count_Frame <= Count_Frame + 'b1; //帧计数 /************************************/
///// 帧偏移地址16,状态机控制,跳转条件计数到10帧切换下一幅图像 reg [:]rAddr;
reg [:]state; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
rAddr <= 'd0;
state <= 'd0;
end
else
case ( state ) 'd0 :
if( Count_Frame == FRAME ) state <= 'd1;
else rAddr <= 'd0; 'd1 :
if( Count_Frame == FRAME ) state <= 'd2;
else rAddr <= 'd16; 'd2 :
if( Count_Frame == FRAME ) state <= 'd3;
else rAddr <= 'd32; 'd3 :
if( Count_Frame == FRAME ) state <= 'd4;
else rAddr <= 'd48; 'd4 :
if( Count_Frame == FRAME ) state <= 'd5;
else rAddr <= 'd48; 'd5 :
if( Count_Frame == FRAME ) state <= 'd6;
else rAddr <= 'd64; 'd6 :
if( Count_Frame == FRAME ) state <= 'd0;
else rAddr <= 'd80; endcase /************************************/ assign Rom_Addr = rAddr + m; //图像起始地址 + 行寻址 assign Red_Sig = Ready_Sig ? Rom_Data[ 'd15 - n ] : 1'b0; //扫描到图片大小区域时获取ROM数据,
assign Green_Sig = Ready_Sig ? Rom_Data[ 'd15 - n ] : 1'b0; //row_valid && col_valid
assign Blue_Sig = Ready_Sig ? ~Rom_Data[ 'd15 - n ] : 1'b0; //不在图片区域内时显示底色:蓝色 /***********************************/ // /**********************************/
//
// reg [5:0]m;
// wire[10:0]row_add;
// assign row_add = Row_Addr_Sig - 11'd300;
//
// always @ ( posedge CLK or negedge RSTn )
// if( !RSTn )
// m <= 6'd0;
// else if( Ready_Sig && row_add < 64 && row_add >= 0 )
// m <= row_add[5:0];
// else
// m <= 6'd0;
//
// /************************************/
//
// reg [5:0]n;
// wire[10:0]col_add;
// assign col_add = Column_Addr_Sig - 11'd500;
//
// always @ ( posedge CLK or negedge RSTn )
// if( !RSTn )
// n <= 6'd0;
// else if( Ready_Sig && col_add < 64 && col_add >= 0 )
// n <= col_add[5:0];
// else
// n <= 6'd0;
//
// /************************************/
//
// assign Rom_Addr = m;
//
// assign Red_Sig = Ready_Sig ? Red_Rom_Data[ 6'd63 - n ] : 1'b0; //3个ROM读取不同的RGB值
// 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; ////---------显示一个圆--------------------
//parameter radius = 11'd100; //半径
//parameter radius2 = radius * radius; //半径的平方
//parameter x_pos = 11'd400; //圆心x坐标
//parameter y_pos = 11'd500; //圆心y坐标
//
//reg[10:0] x_temp,y_temp;
//reg[21:0] x_temp_2,y_temp_2;
//wire is_flag;
//
//always@*
// if(Column_Addr_Sig >= x_pos)
// x_temp = Column_Addr_Sig - x_pos;
// else
// x_temp = x_pos - Column_Addr_Sig;
//
//always@*
// if(Row_Addr_Sig >= y_pos)
// y_temp = Row_Addr_Sig - y_pos;
// else
// y_temp = y_pos - Row_Addr_Sig;
//
//always@*
// x_temp_2 = x_temp * x_temp;
//
//always@*
// y_temp_2 = y_temp * y_temp;
//
//assign is_flag = (x_temp_2 + y_temp_2) <= 10000;
//
//assign Red_Sig = Ready_Sig ? is_flag : 1'b0;
//assign Green_Sig = Ready_Sig ? ~is_flag : 1'b0;
//assign Blue_Sig = Ready_Sig ? ~is_flag : 1'b0; //--------------------------------------------------
//显示一个矩形框
//wire a_dis,b_dis,c_dis,d_dis; //矩形框显示区域定位
//
//assign a_dis = ( (Column_Addr_Sig>=200) && (Column_Addr_Sig<220) )
// && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<460) );
//
//assign b_dis = ( (Column_Addr_Sig>=580) && (Column_Addr_Sig<600) )
// && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<460) );
//
//assign c_dis = ( (Column_Addr_Sig>=220) && (Column_Addr_Sig<580) )
// && ( (Row_Addr_Sig>=140) && (Row_Addr_Sig<160) );
//
//assign d_dis = ( (Column_Addr_Sig>=220) && (Column_Addr_Sig<580) )
// && ( (Row_Addr_Sig>=440) && (Row_Addr_Sig<460) );
//
// //显示一个小矩形
//wire e_rdy; //矩形的显示有效矩形区域
//
//assign e_rdy = ( (Column_Addr_Sig>=385) && (Column_Addr_Sig<=415) )
// && ( (Row_Addr_Sig>=285) && (Row_Addr_Sig<=315) );
//
////--------------------------------------------------
// //r,g,b控制液晶屏颜色显示,背景显示蓝色,矩形框显示红蓝色
//assign Red_Sig = Ready_Sig ? e_rdy : 1'b0;
//assign Green_Sig = Ready_Sig ? (a_dis | b_dis | c_dis | d_dis) : 1'b0;
//assign Blue_Sig = Ready_Sig ? ~(a_dis | b_dis | c_dis | d_dis) : 1'b0; //wire a_pos;
//assign a_pos = Column_Addr_Sig > 11'd0 && Row_Addr_Sig < 11'd100 ;
//// /************************************/
////
// assign Red_Sig = Ready_Sig ? a_pos: 1'b0;
// assign Green_Sig = Ready_Sig ? a_pos : 1'b0;
// assign Blue_Sig = Ready_Sig ? ~a_pos : 1'b0; endmodule

vga_control_module.v

VGA显示的更多相关文章

  1. VmodCAM图像采集 VGA显示

    先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...

  2. vga显示彩条

    vga显示驱动程序可分为扫描行列和行列同步两个部分 //注意:只有在有效区域内给vga赋值才会有颜色变化 assign vga_b = isready ? vga_s[:] :'d0; assign ...

  3. 基于FPGA的VGA显示静态图片

    终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...

  4. 基于FPGA的Uart接收图像数据至VGA显示

    系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...

  5. 纠错:基于FPGA串口发送彩色图片数据至VGA显示

    今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...

  6. 基于FPGA驱动VGA显示图片的小问题

    学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示. 出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那 ...

  7. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...

  8. verilog实现VGA显示方块屏幕保护

    verilog实现VGA显示方块屏幕保护 输入和输出 时钟信号 clk 复位信号 reset rgb三颜色输出 [2:0] r,g, [1:0] b 行信号输出 hs 列信号输出 vs 参数设定 设定 ...

  9. 基于FPGA的VGA显示设计(二)

    上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...

  10. 基于FPGA的VGA显示设计(一)

    前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...

随机推荐

  1. RTT工程管理

    一.RTT工程管理 RTT采用SCons管理工程. 本次安装版本:Python-2.7.3.1.exe,python-2.7.11.msi,scons-2.3.1-setup.exe 安装完成后,需要 ...

  2. OkHttp+Stetho+Chrome调试android网络部分(原创)

    android网络调试一直是一个比较麻烦的部分,因为在不同序列的请求中,返回的数据会有不同的变化,如果能像web开发一样使用调试功能查看页面的访问数据该是多么美好的事情! 很幸运的是,现在Androi ...

  3. 偶遇 sqlserver 参数嗅探

    需求: 费用统计 环境: 查询设计多张大表 解决方案: 优化查询语句,封装成存储过程,建立索引,最终查询速度很不错.部署上线,告一段落... 一段时间后投诉来了... 客户投诉说查询没内容,我看了日志 ...

  4. css3 图片 悬停效果

    纯css实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  5. 几种排序算法的java实现

    import java.util.Arrays; /** * 各种排序算法从小到大进行排序 */ public class Test { public static void main(String ...

  6. 2014-04-17-网易有道-研发类-笔试题&amp;參考答案

    一套卷子,共10道小题,3道编程大题 一.填空&选择 1.选择:给了一个递归求Fibonacci的代码,问算法复杂度 指数复杂度 2.选择:忘记了,应该不难 3.选择:给你52张除掉大小王的扑 ...

  7. 开启GitHub模式,now!

    (原文地址为:http://www.karottc.com/blog/2014/06/15/current-doing/) 最近看到了一篇文章,该文章的作者将自己连续177天在github上commi ...

  8. Python相对完美的URL拼接函数

    首先说下什么叫URL拼接,我们有这么一个HTML片段:   <a href="../../a.html">click me</a> 做为一只辛苦的爬虫,我们 ...

  9. 《C++程序设计》朝花夕拾

      (以后再也不用破Markdown写东西了,直到它有一个统一的标准,不然太乱了--) 函数签名 int f (int a, int b) ↑ ↑ ↑ ↑ 返回类型 函数名 形 式 参 数 其中,函数 ...

  10. ObjectTools反射实例

    ObjectTools反射实例 package com.shitou.deposit.chinapnr.utils; import org.apache.commons.logging.Log; im ...