1.vga分辨率的选择和显示屏分辨率、显示屏尺寸、型号无关。显示器能自动识别输入信号并调整分辨率,输入640*480信号就自动分配到整个屏幕上。PLL的时钟配置时注意别填错,显示器会报错 输入信号不匹配。
2.注意uart 接受模块rx的busy端口,也就是接受完一个字节后拉高的信号。拉高后在下一个时钟沿就要立刻拉低。因为双端口ram写入的使能信号是busy,若拉高时间过长则导致rom_addra不能按一个字节接受完写入一次的时序递增。
3.串口助手的选择及xcom发送数据的格式。
所有串口发送的都是2进制数。
XCOM 正点原子的免费软件。
发送时:
勾选 以16进制发送 代表要发的都是纯数字,则xcom会在缓冲区里每两位16进制数读取一次,加入开始和终止信号制成一帧发送。比如以16进制发送数据 12 ,则发送0-00010011-1(开始信号,数据,终止信号),注意,12不是10进制数,即不是00001100。(12)H = 18 = 00010011 。
不勾选 以16进制数发送 代表要发的数据是字符串格式。xcom会一位一位的读取并发送。比如发送12 ,则实际发送0-00110001-1 0-00110010-1(1的ASCII码是49,转换为16进制是31(00110001),2的ASCII码是50,转换为16进制32(00110010))。
接收时:
勾选以16进制接收:在串口回环实验中,以16进制发送12,则接收12。
不勾选以16进制接收:发送31,会在屏幕上显示接收到1。
xcom有一个发送文件的功能,文件默认是txt格式,根据我实践出的结论,发送文件默认是以字符串格式发送,不论有没有勾选以16进制发送。 所以想发送大文件只能复制到缓冲区里发送,但缓冲区有存储上限,过大的文件只能分别复制然后发送。这篇说的很清楚了。常见串口工具比较(详细)
友善串口调试助手。
没有发送文件的功能,至少我现在没找到。但是发送缓冲区的容量很大,我试过将38.6k的txt直接复制到缓冲区,换成xcom至少要分段复制三次。
4.图片格式转换为RGB444或RGB332可以尝试用MATLAB,非常方便,但是要注意三种颜色分量的顺序,一般是B-G-R,高字节在前。串口传图 不注意顺序结果能显示但颜色对不上。红橙黄绿蓝靛紫黑白灰彩条,下图是RGB分量没对上时的显示结果。
5.注意图片大小和显示区域。哪怕显示区域长宽只多了一个像素,显示的图片就会扭曲很多,运气好的话还能看出原本的图案从而改进,运气不好的话就是一堆像素块,完全找不到代码要修改的地方在哪里。
6.RGB332对画面色彩降低非常多,整体偏暗,实用性不强。可以尝试把rx接受模块改造成接收16位bit,效果大概会好很多。
video_20230328_103309
7.有很多可以改进的点。比如设定串口发送的前几位数据为图片长,图片宽,图片大小,这样就不局限于只能显示分辨率一样的图片。代价是ram的容量必须设计成640480rgb位宽,因为必须容纳最大的图片,图片小的话空间就浪费了。8位宽的话容量是2.34MB,看FPGA资源再改进。
uart接收模块也可以替换为摄像头OV5640。
VGA替换成HDMI或DDR3。
8.杂项
FPGA开发板是EG01,里面有vga显示rom图像的工程。EG01用户手册 。
uart模块是从一个非易失性存储器开源项目open-fpga-nvm里拿来用的,里面的uart在接受完一个字节busy信号拉高后不会立刻拉低,要等到下一个开始信号到来后才拉低,这个特点对于这个项目来说无所谓,甚至下板做数据回环也可以正常运行,但是加上vga和rom后就不行,参考2 。当时先做完数据回环和vga显示rom图像后想当然的认为所有模块没有问题,以为简单的模块组合就能完成,大意了。。。
还有学姐的博客对我帮助非常大。基于RS232的VGA图像显示
最后,别放弃,成功不远。