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. spring读取配置文件PropertyPlaceholderConfigurer类的使用

    这里主要介绍PropertyPlaceholderConfigurer这个类的使用,spring中的该类主要用来读取配置文件并将配置文件中的变量设置到上下文环境中,并进行赋值. 一.此处使用list标 ...

  2. 数据库设计(四)数据库的规范化(Normalization)

    数据库的规范化 Database Normalization is a technique of organizing the data in the database. Normalization ...

  3. EMMC与nand flash的区别

    1.NAND Flash 是一种存储介质,要在上面读写数据,外部要加主控和电路设计. 2.eMMC是NAND flash+主控IC ,对外的接口协议与SD.TF卡类似:对厂家而言简化了电路设计,降低了 ...

  4. ExtJS TreeGrid的使用方法

    假设您是第一次使用ExtJS的TreeGrid的话,我相信总会有一些小麻烦的,以下就来说一说ExtJS中TreeGrid的使用. 本人使用的ExtJS版本号为4.1.1,而且使用了MVC模式.假设不了 ...

  5. jQuery DataTables添加自定义多个搜索条件

    效果如下: 一.在前台页面定义输入搜索条件的文本框 <div class="ibox-tools"> <span>年度</span> @Html ...

  6. 网络协议之rtp---rtp 传输视频及加密

    http://read.pudn.com/downloads170/sourcecode/windows/788977/es%20ParkertTS/ESToTS.cpp__.htm http://w ...

  7. numpy和TensorFlow的函数

    pycharm  jupyter notebook 环境配置

  8. 下载VMware

    1.进入VMware官网:http://www.vmware.com/cn 2.找到下载,点击Workstation Pro,此时需要账号登录. 3.选择需要下载的版本.对应的操作系统,点击转至下载

  9. GL 纹理 格式 资料备份

    分别转载至:http://www.tuicool.com/articles/qAbYfq    和 http://www.verydemo.com/demo_c161_i114362.html 在手机 ...

  10. IOS开发报错之Undefined symbols for architecture armv6

    本文转载至  http://blog.csdn.net/sanpintian/article/details/7575434 今天在项目中引入SVSegmentedControl.h/.my以及SVS ...