基于FPGA的Uart发送图像数据到VGA显示
系统框图
前面我们设计了基于FPGA的静态图片显示,并对一幅彩色图片提取了灰度,学习了RGB转Gray算法。这是基于一幅静态图片的,那么后面我们要怎么模拟一下一幅动态图片的显示,最终对动态数据进行滤波、边缘检测等算法,下来我们首先来建立一个基于FPGA的动态图片显示基础框架,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描到VGA屏幕上显示。
从系统框图上我们可以看到,可以划分为三个部分进行设计,一个是串口接收部分,然后是RAM数据存储部分,最后是VGA驱动显示部分。
这里串口接收部分只需要用到串口接收代码,代码很多书上都有,我这里就不贴出来了,
数据存储部分需要使用的是双口RAM IP Core,一端将数据写入RAM中,一端将数据读出来用VGA显示,下面是基于Vivado的双口RAM IP Core调用方法。
打开IP Catalog,选择block memory Generater
这里按如图所示选择,我这里将写使能信号去掉,wea也可以代表写使能
设置写数据位宽和深度,使能选择always enable
设置读数据参数
这里因为我们是往RAM里面写数据,所以这里不需要添加初始化RAM文件
点击OK
最后generate综合完成。
双口RAM IP调用完成以后,接下来是在用顶层文件把串口接收模块和存储模块和VGA驱动模块连接起来。这里需要注意的是,双口RAM的读地址和写地址都是需要在其他模块进行计数的,我这里把写使能信号设置为标串口接收完成标志即rx_done,读使能设置为always enable。对于VGA显示图片部分可以参考这个图像处理系列文章第一篇基于FPGA的静态图片显示。
这样基础框架部分其实就已经完成了,现在我们需要的是一幅图片的像素数据然后通过上位机串口调试助手发送给FPGA开发板,首先找一幅200x200的图像数据,因为我这里是开出的200x200的显示区域(想必大家看过前面的文章已经做出来了),使用MATLAB就可以直接生成你想要的这幅图像的像素数据,这里的MATLAB代码我给出链接::http://pan.baidu.com/s/1dFAMPjj 密码:uu71,只需要修改下面如图所示的imread(””)这里就好了,就可以直接转化你想转化的图片。注意图片必须和这个.m文件在同一个文件夹,最后生成一个txt文件,这个txt文件里面的数据就是我们所需要的图像数据
其实这三个文件里面的数据是完全相同的,那为什么不直接用前面那两个文件的数据呢?这里博主亲身体验过,那是绝对不行的,因为前面两个文件的数据其实是有回车的(我是这么想的),可能会被串口默认为一个字符,txt文件中是没有的,空格的话这里被串口调试助手忽略了!如下图,点击发送就OK啦!
最后通过串口发送到开发板最终显示的效果如图所示,我们可以看到这里MATLAB代码生成的就直接是灰度图像,最终发送过程中其实是动态显示的,因为串口波特率的速度比VGA的扫描速度是要慢很多的,这里的动态显示视频请看我的微博链接:http://t.cn/RO7UsfK
最后经过测试我们的lena女神的显示效果最好了,看来真不愧是我们图像处理届的模特鼻祖呀!最后看来,显示效果还是不错的呢!
如果你想获得本文的所有课件和工程代码,请关注本人的个人微信订阅号:开源FPGANingHeChuan或扫描下方二维码关注订阅号,在后台回复图像处理,即可获得本文的所有课件、资料、和工程源码哦!
图像处理系列文章
第一篇:基于FPGA的静态图片显示
第二篇:基于FPGA彩色图像转灰度算法实现
自家的帖子,顶一下,希望大神们指点
使用的正好是Vivado这款软件,不同编译软件好像IP都不太一样的,谢谢小编分享,学起来会不用那么吃力一些。
学习了,但是我想视屏640X480的图片,也就是全屏显示,但是,这个计算下来,数据实在是太多了,这个就很尴尬。有没有什么好的办法,可以把图片数据存到ROM里面?
这个ROM是存不下的,有的方法是用SDRAM/DDR存储,当然小编也正在学习这块,毕竟SDRAM/DDR是很难的
前辈你好,我也是做FPGA图像传输的,能否问你几个问题?
1:显示的颜色不准确
2:每个像素点有闪烁现象
怎么解,可否指导一二
你做图片传输,还是视频流,用什么协议传?
视频传输,直接用DVI给解码芯片送给FPGA,FPGA处理完后用网口送出去给显示驱动就可以了