FPGA实现VGA显示图片

2023-11-20

利用FPGA在带有VGA接口的液晶显示器上显示图片。

电路原理图:

端口说明: VGA_R2-VGAB0的8个端口位VGA的RGB数据位, VGA_HS为行同步信号,VGA_VS为场同步信号。

        以分辨率为640x480为例,刷新速率为60Hz,每幅图像每行有800个clk,有525个行,完成一幅图像的时间是1s/60=16.6ms,完成一行的时间为16.6/525=31.75us,完成一个像素的时间约为31.75us/800=40ns(16.6/(525*800))。因此为了方便设计,接口时钟设置为25MHz,每个时钟送一个数据。

        VGA时序图:

 行信号的时序图如上图hys。行同步信号的低电平时间为96个clk,高电平期间延时45个clk后才能显示有效的数据,周期为800个clk。

场同步信号如上图vys。场同步信号低电平时间为2个行周期,两个低电平之间的时间为一帧画面。场同步信号确定数据显示点在哪一行,期间的484个行周期数据有效。每个有效的行周期时间内对应646个有效的数据点,所以分辨率为640x480。

        VGA显示的时钟信号为25MHz是由PLL模块分频的到的。图片的数据存在FPGA的ROM中,VGA显示程序如下:

//VGA显示

module vga( clk_25M , rst_n , 
            hys , vys , 
			   rgb_data );
					  
input clk_25M;     //25MHz时钟信号
input rst_n;       //复位信号
output hys;        //行同步信号
output vys;        //场同步信号
output [7:0] rgb_data; //RGB数据

reg hys;
reg vys;
reg [7:0] rgb_data;  //高3位R 中3位G 低2位B

//----------------------------------------------
//计数器

reg [9:0] cnt_hs;  //行信号clk计数
reg [9:0] cnt_vs;  //场信号clk计数

wire add_cnt_hs;   //行信号clk计数器加1条件
wire end_cnt_hs;   //行信号clk计数器结束条件

wire add_cnt_vs;   //场信号clk计数器加1条件
wire end_cnt_vs;   //场信号clk计数器结束条件

always @( posedge clk_25M or negedge rst_n ) begin
	if( !rst_n )
		cnt_hs <= 10'd0;
	else if( add_cnt_hs ) begin
		if( end_cnt_hs )
			cnt_hs <= 10'd0;
		else 
			cnt_hs <= cnt_hs + 1'b1;
	end	
end

assign add_cnt_hs = 1'b1;
assign end_cnt_hs = add_cnt_hs && ( cnt_hs == 800-1 );  //end_cnt_hs=1 结束计数

always @( posedge clk_25M or negedge rst_n ) begin
	if( !rst_n ) 
		cnt_vs <= 10'd0;
	else if( add_cnt_vs ) begin
		if( end_cnt_vs )
			cnt_vs <= 10'd0;
		else 
			cnt_vs <= cnt_vs + 1'b1;
	end	
end

assign add_cnt_vs = end_cnt_hs;
assign end_cnt_vs = add_cnt_vs && ( cnt_vs == 525-1 );

wire [9:0] vga_x;	//VGA的x坐标
wire [9:0] vga_y;	//VGA的y坐标

assign vga_x = cnt_hs - 10'd144;
assign vga_y = cnt_vs - 10'd35;

//-------------------------------------------------------------------
//行信号与场信号
always @( posedge clk_25M or negedge rst_n ) begin
	if( !rst_n )
		hys <= 1'b1;
	else if( cnt_hs == 10'd95 )
		hys <= 1'b1;
	else if( end_cnt_hs )
		hys <= 1'b0;
end

always @( posedge clk_25M or negedge rst_n ) begin
	if( !rst_n )
		vys <= 1'b1;
	else if( cnt_vs == 10'd1 ) 
		vys <= 1'b1;
	else if( end_cnt_vs )
		vys <= 1'b0;
end

//--------------------------------------------------------------
//rom存储

reg [14:0] bmp_rom_add;   //存储地址
wire [7:0] bmp_rom_data;	//图片rom的数据

snake Rom
(
	.clock( clk_25M ),
	.address( bmp_rom_add ),
	.q( bmp_rom_data	)
);
//---------------------------------------------------------------

`define picture_x 10'd150    //图片宽度
`define picture_y 10'd150    //图片高度

`define origin_x  10'd245    //图片显示起点(x,y)
`define origin_y  10'd150

wire	bmp_add;	//图片位置信号
wire  bmp_en;	//图片使能信号

//组合电路,用于生成图片位置信号
assign 	bmp_add = (vga_x >= `origin_x - 10'd3 ) && (vga_x < `origin_x + `picture_x - 10'd3 ) && (vga_y >= `origin_y) && (vga_y < `origin_y + `picture_y); 	
//组合电路,用于生成图片使能信号
assign 	bmp_en = (vga_x >= `origin_x) && (vga_x < `origin_x + `picture_x) && (vga_y >= `origin_y) && (vga_y < `origin_y + `picture_y); 	

//时序电路,用来给bmp_rom_add寄存器赋值
always @ (posedge clk_25M or negedge rst_n) begin
	if(!rst_n)
		bmp_rom_add <= 15'd0;
		
	else if( (vga_x == `origin_x - 10'd3) && (vga_y == `origin_y ) && bmp_add )  //图片起始点 地址清0
		bmp_rom_add <= 15'd0;
		
	else if(bmp_add)  //图片生成位置
		bmp_rom_add = bmp_rom_add + 1'b1;
end

//---------------------------------------------

//时序电路,用来给rgb_data寄存器赋值
always @ (posedge clk_25M or negedge rst_n) begin    //每个时钟上升沿赋值
	if(!rst_n) 
		rgb_data <= 8'b0;
	else if( bmp_en )
		rgb_data <= bmp_rom_data;   //图片RGB数据
	else 
		rgb_data <= 8'b000_000_00;
end

endmodule



在顶层模块中将50MHz时钟分频,对VGA模块例化


module game( clk , rst_n ,  
             hys , vys , rgb_data ,
				 been );

input clk;
input rst_n;

output [7:0] rgb_data;    //VGA数据输出
output hys;
output vys;

output been;              //喇叭输出

wire clk_25M;
wire locked;

//------------------------------------------------------------

pll i2(
	.inclk0(clk),   //50MHz输入
	.c0(clk_25M),   //25Mhz输出  
	.locked(locked) );

vga i1( .clk_25M(clk_25M) , .rst_n(rst_n) , 
        .hys(hys) , .vys(vys) , 
		  .rgb_data(rgb_data) );

endmodule

效果图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA实现VGA显示图片 的相关文章

随机推荐

  • 成功的硬件公司不仅是产品,更是一种创新文化

    目录 内容简介 客户 建立公司 而不仅仅是产品 CSDN学院 作者简介 内容简介 很多时候 你决定去做一件事 一款产品 往往都始于一个想法 一个灵感 然后 许多硬件创业者会花费数月 甚至是数年的时间来确定并分析他们的想法或者说是创意 一旦产
  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • 腾讯云函数的Python依赖库打包注意事项

    云函数Python3 6依赖库 官网文档链接 前两天写了一个Python程序要用pycryptodome库 但是腾讯云函数并没有自带这个库 感觉还是记录一下比较好 要使用CentOS 7下的Python Python版本要是3 6的 我一开
  • VIM选择文本块/复制/粘贴

    在正常模式下 按ESC进入 按键v进入可视化模式 然后按键盘左右键或h l键即可实现文本的选择 其它相关命令 v 按字符选择 经常使用的模式 所以亲自尝试一下它 V 按行选择 这在你想拷贝或者移动很多行的文本的时候特别有用 CTRL v 按
  • QT中修改QCalendarWidget样式时,令周几(表头)与日期文字颜色不同的方法,设置文字样式冲突的问题

    太长不看版 Qt日历中使用setWeekdayTextFormat修改周末文字颜色和setHeaderTextFormat修改表头文字颜色发生冲突 通过找到每个周末日期来修改文字颜色 效果图和代码见文末 在Qt中用到了QCalendarWi
  • Prometheus Blackbox Exporter 的 HTTP 探测指标中各个阶段的时间统计信息

    在 Prometheus Blackbox Exporter 的 HTTP 探测指标中 probe http duration seconds 指标包含各个阶段的时间统计信息 这些阶段代表了 HTTP 探测的不同阶段和指标 以下是各个阶段的
  • 同步时间

    系统时间与硬件时间 一台计算机有两个时钟 一是硬件时间时钟 RTC Real Time Clock 又实时时钟 二是系统时钟 System Clock 1 概念 硬件时钟是嵌在主板上的特殊电路 平时关机后还可计算时间 系统时钟是操作系统的k
  • 安装tensorflow version `CXXABI_1.3.7' not found

    现象 ImportError usr lib64 libstdc so 6 version CXXABI 1 3 7 not found required by root anaconda3 lib python3 6 site ntern
  • mybatis+oracle+map入参,并获取主键ID的返回值

    insert id insert parameterType map useGeneratedKeys true keyProperty id gt insert into person name pswd values name pswd
  • 第五章 Gateway--服务网关

    接上一篇文章开始网关之旅 首先告诉大家网关是什么 Gateway简介 怎么配置 怎么入门 执行流程等等相关介绍 第一章 微服务的架构介绍发展第二章 微服务环境搭建第三章 Nacos Discovery 服务治理第四章 Sentinel 服务
  • 基于深度学习的关系抽取综述

    论文 https arxiv org pdf 1705 03645 pdf 一 介绍 信息抽取是NLP的一个基本任务 从非结构化文本中抽取机器或程序能够理解的结构化知识 信息抽取包括以下子任务 NER 关系抽取 事件抽取等等 本文中 我们着
  • Java list判空

    if null list list size 0 list isEmpty 和list size 0 没有区别 isEmpty 判断有没有元素 而size 返回有几个元素 如果判断一个集合有无元素 建议用isEmpty 方法 这清晰 简明
  • 0基础,自学3个月转行软件测试,从月薪3k到12k我整理的超全学习指南

    大家好我是小娜 现在是一名软件测试测试工程师 工资在1w2阶段还需努力 我大学期间学的是电气工程及其自动化专业 可以说是一事无成哈哈 大学三天打鱼 两天筛网导致专业水平学的不怎么样 毕业后从事了一份销售 买房子 的工作 但是 销售工作压力大
  • GIT代码仓库迁移

    GIT代码仓库迁移 保留原有的提交记录 查看原有提交路径 git remote v 变更为新的提交路径 git remote set url origin 新路径 拉取新路径下的内容 允许不相关历史提交 并强制合并 git pull ori
  • 亲密关系沟通-【正向情绪】创造一场愉快的沟通体验

    为什么有的时候聊天越聊越开心 有时候却让你意兴阑珊 正向情绪体验 积极议题 充分发挥 谁都喜欢被看见 让他不断得到关注 得到你持续的关注 你知道吗 我这个月业绩第一 哇 你超棒的 哪里哪里 话题聊不下去 你给他夸奖 他只能谦虚 天哪你怎么做
  • [转]使用Midjourney命令输出稳定的漫画角色

    转载自 用对Midjourney命令你也可以输出稳定的漫画角色 qq com 昨天的文章已经教会了大家如何成为15分钟快速制作一幅小漫画 有兴趣的可以翻阅上一篇文章 但是不少同学会发现 Midjourney的随机性比较强 即使输入相同的命令
  • 转载:《七周成为数据分析师》

    百日计划第一周总结 1 计划 1 彻底结束之前预定暑假完成的天善学院课程 七周数据分析师 2 总结 七周数据分析师 2 完成情况 1 完成 七周成为数据分析师 任务 2 周总结与 七周数据分析师 一起完成 七周数据分析师 总结 第一周 数据
  • 【Python零基础入门篇 · 17】:模块、模块的使用、过滤执行代码写法、包的使用

    文章目录 模块 内置模块 第三方模块 自定义模块 模块的使用 import 模块名 导入自定义模块 from import 模块起别名 as 导入多模块 模块 模块 就是 py文件 里面定义了一些函数和变量 需要的时候就可以导入这些模块 执
  • 零基础Java详细的jdk的下载以及安装配置

    文章目录 一 下载jdk 二 配置jdk 三 查看配置是否成功 一 下载jdk 1 登录oracle官网 2 3 4 点进去往下拉 会有jdk新版本 接受许可协议 直接下载 zip压缩文档就行 也可以直接下载 exe安装版本 5 找到压缩包
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图