摄像头显示图像整个模块包含了摄像头对图像的捕捉 捕捉数据的传输 捕捉数据显示在LCD屏幕上。
初始时,IIC协议对摄像头初始化。由状态机完成地址和数据的配置,从ROM里读出数据(ROM事先存着VGA数据)这些数据经过iic读写时序整合模块发送到CMOS摄像头里。
CMOS初始化后开始输出数据到image_capture模块,主要信号:image_pclk、href(行同步信号,高电平有效)D[7:0](数据总线)VSync (场同步信号,一幅画面的信号,高电平表示一幅新画面,刷新,有效数据传输时 改信号低电平)时序如下图。
经过该时序写入FIFO缓存器中。FIFO在这个模块里例化起数据缓存作用,整合成RGB数据(red5bits green6bits blue5bits,一个点需要16bits表示)FIFO中Dout端口缓存 着数据,当检测到端口数据大于等于16,状态机下一状态进入读状态,将数据读进DDR模块。但是具体的发送时序是怎么样的呢? 来看看例化中的rd_en端口。只要它使能 则数据发送,那我们只要关注使能信号,分析后得,每个周期检测到状态为读数据,并且读计数小于等于16,则使能,若大于16则下一个状态停止读数据,而这个读计数也是在每个周期读状态时递增的,空闲状态时清零。同时也有一个场同步信号输入例化,相当于复位。
FIFO读出的数据image_ddr3_wrdb进入的DDR模块内部的 “ 写FIFO ”,这个写FIFO也是例化的,与其类似的还有一个例化的读FIFO。然后还有DDR3的IP核例化。在这个模块,状态机分配任务,先判断读FIFO缓存器Dout端口的数据个数,如果小于256bits并且LCD模块没有复位新的一帧画面,则下一状态进入读状态。【这里的读状态指的是:将数据从DDR3 IP核中读出数据到读FIFO缓存器里】读状态所做的事,①发送读命令app_cmd信号置001表示读。②等待IP核发来的app_rdy信号准备好,判断读计数num小于256次随后app_en使能,如果num大于256次则停止读状态并清零num计数器(num在每一次读写状态时,检测到app_rdy响应时则自增1次)③发送地址总线,每读或写一次,地址递增。
数据读到读FIFO的Dout端口成为lcd_ddr3_rfdb数据信号,等待LCD发送读请求则数据信号发送。这就是读FIFO要完成的事,那么写FIFO所接收的数据又何去何从了呢?下面来看一看。
状态机分配任务,判断读FIFO的Dout数据不小于256则再判断写FIFO的Dout端数据大于8bits(正常情况下大于256bits意味着FIFO满了,此处是为了数据格式)则开始写数据状态。这里的写状态指 将写FIFO缓存器里Dout端口数据写入DDR3IP核。写状态所做的事和读类似,但是多了一个app_wdf_rdy信号,于是也多了一个写信号计数器wrnum。在每个写状态时num自增,wrnum还需要检测到app_wdf_rdy(写准备信号)才会自增。写状态在状态机中判定,如果wrnum大于9并且num大于8则停止写操作。而在写的过程中,并且app_wdf_rdy响应,并且wrnum小于8则 写FIFO的Dout端口使能 则数据发送至app_wdf_data有效,同时wrnum如果在这个条件下还大于0的话,则app_wdf_wren写使能。app_wdf_data端口的数据被彻底发送到DDR3IP核里。这就是关于写FIFO的内容。这两个FIFO例化后,内部部分时序省略。因此用的时候可以直接调用。
经过DDR的读写后,数据被缓存在DDR读FIFO缓存器,下一步则等待LCD发送的读请求,LCD发送读请求的时序在LCD模块提到,因为等到这个请求信号,读FIFO的Dout端口才能发送出去,所以读FIFO 缓存的数据量上限 要求要尽量大一些。(图二数据走向)