最基础的FPGA图像采集及显示的项目做完,这里小小的总结一下,也顺便聊聊项目中常用的一些调试手段。
我们先说下数据流,接收——>缓存——>处理——>发送,可以发现很多项目都存在这么一个过程,不同的只是接口而已。而系统框图也基本可以按照这个流程进行划分。
接收:根据不同的器件/接口, 有不同的时序,根据时序设计接收逻辑即可。
缓存:因为内部逻辑处理需要时间,所以数据必须要存起来,等待处理。而图像数据很大,所以一般通过DDR进行存储。
处理:本项目没有涉及,但是后续我们加入图像处理的一些逻辑。
发送:如果是本项目这种LCD显示,则需要设计LCD驱动的时序,XY扫描一帧一帧显示;但是大多都会发给上位机,这时就看使用什么接口了,再做相应的逻辑。
接口时序其实就是协议,只有双方都遵守了才能正确的通信。比如常见的图像类时序,行有效、场有效。
玩接口,FPGA最是拿手不过,一些常见的高速接口,FPGA厂家都做了IP,我们只需要学习其IP使用方法,而不需要关注内部协议细节处理。
顺手推荐下我的FPGA接口专栏:FPGA接口篇
详细使用方法可以参加另外的博客:Xilinx FPGA平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了
FIFO是逻辑设计最常用的缓存方式了,IC里面需要自己写(使用公司公共库代码),FPGA最好还是使用IP,肯定比你写的好~
所以必须要掌握FIFO IP的使用,但是呢,这个也很简单,关注下datasheet里面的读写时序就可以了。这里就不展开了,详细内容请看《PG057-FIFO》。
为了能够一眼直接看出当前项目的工作状态,可以添加LED信号灯进行指示,比如:(不同的项目可以设置不同的状态指示)
管脚 | 状态指示 |
Led[3] | ... |
Led[2] | 表示DDR3正常 |
Led[1] | 表示数据正常发送 |
Led[0] | 表示数据正常接收 |
本项目中,如果摄像头不在手上,你怎么证明自己的逻辑是正确的呢?(俗称甩锅)
我们可以在逻辑内部增加一个模块:data_gen,用来产生一个模拟的图像数据,比如灰度条数据;再增加一个寄存器开关src_slc或者VIO来做切换 :
src_slc / VIO(复位为0) | 描述 |
1 | 模拟灰度条数据 |
0 | 真实摄像头数据 |
因为最近在学习RISC-V的一些东西,所以后续准备先手搓一个简易的MPU练练手;(其他一些FPGA项目暂时先放放)然后记录一下RISC-V CPU蜂鸟e203的整体学习,以及移植到FPGA跑跑程序的整个过程。
顺便提一下,CPU设计真的是芯片设计的集大成者,博大精深,知识点又多又细又深入,头皮发麻,什么时候才能成长为系统架构师 = _=
咱们下期见~