FPGA学习入门:流水灯;
FPGA项目入门:图像采集及显示。
----FPGA大叔·沃自己硕得
目录
前言
一、项目要求
二、方案设计
三、代码实现
前言
很多小伙伴在学习FPGA的时候,肯定都是先了解了verilog语法后,写了几个加法器;然后搞块学习开发板,跑跑流水灯、搞搞数码管显示对吧。流水灯的点亮,也可以说是点亮了我们FPGA殿堂的第一盏灯。
而同样的,图像采集及显示,在笔者看来可以说是FPGA项目入门的第一个项目也不为过。在该系统中,涉及到接口时序、缓存(FIFO、DDR3)、显示驱动(LCD)等,一个较为完整而又较为容易理解的系统。另外,上板调试还会涉及到约束文件的编写、硬件的连接、bit文件及mcs文件的生成、程序固化等,一个完整的入门项目。
其他图像处理类项目,基本可以在此基础上进行扩展。包括图像前处理(图像滤波、伽马矫正、图像增强etc)、图像后处理(锐化、边沿提取etc)等。
所以,笔者在此对其进行整理。温故而知新。
一、项目要求
对摄像头信号采集并传输到LCD屏上显示。
硬件平台:
摄像头型号 :MT9V034(灰度摄像头,8位并行接口,分辨率:752*480 ,帧率:15-60fps)
FPGA型号 :Xilinx A7
软件平台:
Vivado 2018.3
二、方案设计
首先,我们拿到项目要求,第一件事情就是分析其需求。而且,需求分解尽可能细致、详尽。那么,对于本项目要求来说,我们也可以大致对其需求分解:
摄像头信号采集 图像数据传输 LCD屏显示针对各个需求,我们再进一步深究其内涵。
摄像头信号采集,如何采集、根据什么采集?根据摄像头手册可知,摄像头将采集到的模拟信号转为数字信号,包括: 场同步信号、行同步信号、8位并行数据信号;这里,简单解释下,场同步信号代表一帧图像的有效范围;行同步信号确定有效像素数据。在场同步信号以及行同步信号都有效时,数据为有效像素数据。
所以,我们只需要在同步信号有效时,采集这8位并行数据即可。
图像数据传输,从采集到输出显示,如何保证不丢帧,不撕裂?一般来说,由于FPGA内部存储容量有限,会外挂DDR芯片作为存储扩展;所以,常用的做法是,先通过FIFO进行数据缓存,然后写入DDR,进行缓存一定帧数的图像(通常,项目也会要求xxM大小的缓存容量)。同时,FIFO还能起到跨时钟域数据同步的作用。最后,再从DDR读出图像数据,根据发送接口的不同,对发送模块设计相应的时序控制。
LCD屏显示,需要我们设计驱动模块,提供LCD显示所需的行/场同步信号以及RGB信号。RGB数据为565格式。即:R[4:0]G[5:0]B[4:0]
接下来,我们可以初步画出系统框图了:(后面使用电脑重新画图,便于查看)
根据系统设计,我们将项目分为以下三个子模块:
图像采集子模块(接收模块) image_capture.v DDR缓存子模块(缓存模块) ddr_top.v LCD驱动子模块(发送模块)lcd_drive.v——>接收——缓存——发送——>
接下来,我们再仔细讨论这几个子模块。
三、代码实现
各模块的详细规划设计以及代码实现,我们下期见。
项目涉及到DDR3部分可以参考博文:
Xilinx FPGA平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了