VGA显示
VGA控制器的编写主要是了解VGA的显示标准和时序,如1024X768@60Hz,确定时钟频率(65MHz=1344X806X60),列像素时间等于时钟周期,扫描从左到右、从上到下(类似于电视扫描PAL)。除有效时间外,一行还有同步脉冲时间、后肩和前肩。(http://tinyvga.com/vgatiming,http://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显示的更多相关文章
- VmodCAM图像采集 VGA显示
先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...
- vga显示彩条
vga显示驱动程序可分为扫描行列和行列同步两个部分 //注意:只有在有效区域内给vga赋值才会有颜色变化 assign vga_b = isready ? vga_s[:] :'d0; assign ...
- 基于FPGA的VGA显示静态图片
终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...
- 基于FPGA的Uart接收图像数据至VGA显示
系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...
- 纠错:基于FPGA串口发送彩色图片数据至VGA显示
今天这篇文章是要修改之前的一个错误,前面我写过一篇基于FPGA的串口发送图片数据至VGA显示的文章,最后是显示成功了,但是显示的效果图,看起来确实灰度图,当时我默认我使用的MATLAB代码将图片数据转 ...
- 基于FPGA驱动VGA显示图片的小问题
学习VGA显示图片的过程中,遇到了一个小问题,我在显示屏上开了一个60x60的框,放了一张图片进去显示,但是最终的结果如下图所示. 出现了一个竖黑边,看了看代码,分析了一下逻辑没问题,然而看这个显示那 ...
- FPGA驱动VGA显示静态图片
一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...
- verilog实现VGA显示方块屏幕保护
verilog实现VGA显示方块屏幕保护 输入和输出 时钟信号 clk 复位信号 reset rgb三颜色输出 [2:0] r,g, [1:0] b 行信号输出 hs 列信号输出 vs 参数设定 设定 ...
- 基于FPGA的VGA显示设计(二)
上一篇:基于FPGA的VGA显示设计(一) 参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码 的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...
- 基于FPGA的VGA显示设计(一)
前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...
随机推荐
- sqoop从hdfs 中导出数据到mysql
bin/sqoop export \ --connect "jdbc:mysql://mini1:3306/study?useUnicode=true&characterEncodi ...
- Unix系统编程()main函数的命令行参数
命令行参数输入双引号是什么效果? 好像可以去空格化.
- C++读取Sql Server
代码如下: // ReadSqlConsole.cpp: 主项目文件. #include "stdafx.h" #include <iostream> #include ...
- Java泛型小结
本来想着写一篇总结Java泛型的文章,但是却发现了一篇不错的博文,引用自: http://www.cnblogs.com/lwbqqyumidi/p/3837629.html#undefined 现摘 ...
- Ajax.ActionLink用法
必须要引用的JS库: <script type="text/javascript" src="@Url.StaticFile("/Assets/Conte ...
- jQuery学习笔记1——操作属性
一.获得和设置内容 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容, 得到匹配元素集合中每个元素的文本内容结合,包括他们的后代, 即由所有匹配 ...
- pip使用代理下载
sudo pip install <packageName>的时候有时候会遇到connection error,原因是sudo的环境变量没有继承普通用户的环境变量,这样会导致普通用户设置的 ...
- 【统计分析】ROC曲线
http://baike.baidu.com/link?url=O8nVf39qW4UpYAegk9cJfYARCFDg8YHQ6p5wFnWxYvo151doXo-WvG5Rfz0j4R-r 受试者 ...
- 用MathType编辑反三角函数的方法
在使用文档写数学类的文章时候,常常会涉及到一些数学公式,由于数学公式中包含了很多的数学符号,如果使用文档自带的公式编辑器往往会发现很多的符号都不全或者不符合自己的要求.这个时候就需要一款专业的数学公式 ...
- CentOS 同步时间
来源:http://www.ctusky.com/16/0497/ 用date查看系统当前时间,date -R 可查看时区. CentOS 同步时间由ntp服务提供,可以用"yum inst ...