![基于FPGA的视频采集与显示模块设计_第1页](http://file4.renrendoc.com/view12/M08/30/33/wKhkGWcoVGKAHaauAAHgO_SZ3eo934.jpg)
![基于FPGA的视频采集与显示模块设计_第2页](http://file4.renrendoc.com/view12/M08/30/33/wKhkGWcoVGKAHaauAAHgO_SZ3eo9342.jpg)
![基于FPGA的视频采集与显示模块设计_第3页](http://file4.renrendoc.com/view12/M08/30/33/wKhkGWcoVGKAHaauAAHgO_SZ3eo9343.jpg)
![基于FPGA的视频采集与显示模块设计_第4页](http://file4.renrendoc.com/view12/M08/30/33/wKhkGWcoVGKAHaauAAHgO_SZ3eo9344.jpg)
![基于FPGA的视频采集与显示模块设计_第5页](http://file4.renrendoc.com/view12/M08/30/33/wKhkGWcoVGKAHaauAAHgO_SZ3eo9345.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于FPGA的视频采集与显示模块设计摘要视频监控是一种可以执行视频采集并实时显示的电路系统,我们可以根据需求设计不同的监控系统,在实际应用中较为普遍,可见对于视频监控值得去探索学习。设计所采用的芯片是FPGA,FPGA如同一张白纸,我们可以通过硬件描述语言自由的设计。通过软件仿真,我们可以事先验证设计的正确性,使用FPGA来开发数字电路,可以大大缩短设计时间,提高系统的可靠性。本文对视频采集、存储、显示的设计进行阐述。在这次的课题设计中其具体的操作流程为:借助于OfficeVisio软件完成了相应框图、流程图的设计,UltraEdit软件完成了RTL代码的编辑,Modelsim软件完成了RTL代码的仿真,Quartus软件完成了代码的综合以及板级调试等。本次设计通过简单的方式实现电路模块的设计,经过板级调试成功后。将手机上的钟点放到摄像头前,这时在CRT显示器上就会显示摄像头采集到的手机钟点信息。关键词:FPGA;OV7670;异步RAM;VGADesignofVedioCollectandDisplayModulesBasedonFPGAAbstractThevediosurveillanceisacircuitsystemcanperformvedioacquisitionandvediodisplaywhichrealtime,wecandesigndifferentmonitoringsystemaccordingtotherequirement,infactitisuniversalforwetouse,soitisworthtolearningvideosurveillance.ThechipusedinthedesignisFPGA,FPGAislikeablankpaper,wecanfreetodesignbyusinghardwaredescriptionlanguage,wecansimulatebysomesoftware,Wecanjudgethecorrectnessofthedesigninadvance,useFPGAtodevelopdigitalcircuits,wecangreatlyshortenthedesigntime,makethesystemismoresafer.Thispaperdescribesthedesignofvideocapture,storageanddisplay.thespecificoperationprocess:thecorrespondingblockdiagramandflowchartaredesignedwiththeaidofVisioOfficesoftware.UltraEditsoftwaretocompletetheRTLcodeeditor,Wecandesigndifferentmonitoringsystemaccordingtotherequirement.thecorrespondingblockdiagramandflowchartaredesignedwiththeaidofVisioOfficesoftware.ModelsimsoftwaretocompletethesimulationoftheRTLcode,Quartussoftwarecompletedthecodeintegratedandboardleveldebugging,etc.Thisdesignthroughasimplewaytoachievethedesignofthecircuitmodule,afterthesuccessofboardleveldebugging.wecanplacecellphoneinthefrontofthecamera,meanwhiletheCRTdisplaywillshowhourofthecameratocapturethephoneinformation.Keywords:FPGA,OV7670,Asynchronousram,VGA目录摘要 IAbstract II1绪论 11.1研究背景及目的 11.2设计创新点 11.3开发软件简介 22选型分析 32.1视频采集器件简介 32.2FPGA芯片及开发板简介 32.3视频显示器简介 43整体方案设计 64视频信号的采集 74.1SCCB_CTRL模块介绍 74.1.1SCCB协议简要说明 74.1.2SCCB_CTRL模块操作时序说明 74.1.3SCCB_CTRL模块流程说明 74.1.4SCCB_CTRL模块结构框图 84.1.5SCCB_CTRL模块接口信号 94.1.6SCCB_CTRL模块仿真波形 94.2OV7670模块介绍 94.2.1OV7670模块操作时序说明 94.2.2OV7670模块结构框图 104.2.3OV7670模块接口信号 104.2.4OV7670模块仿真波形 104.2.5OV7670模块输出数据结构 115视频信号存储 125.1ASYN_RAM模块结构框图 125.2ASYN_RAM模块操作流程 125.3ASYN_RAM模块接口信号 125.4ASYN_RAM模块仿真波形 136视频显示说明 146.1颜色空间的认识 146.2RGB颜色空间 146.3YUV颜色空间 156.4VGA时序图 156.5VGA接口介绍 166.6VGA模块接口框图 166.7VGA模块接口信号 176.8VGA模块仿真波形 177开发板调试 188总结 19参考文献 20致谢 21附录 22SCCB_CTRL模块代码代码 22AUTO_CFG_OV7670模块代码代码 28OV7670_SCCB模块代码代码 31CLK_GEN模块代码代码 32OV7670模块代码代码 33VGA模块代码代码 341绪论1.1研究背景及目的随着科技的不断进步,人们的生活水平也得到了提高,生活质量有了相当大的进步。当然,人们生活水平和质量提高后,人们开始渴望精神生活改善,比如,娱乐、健身消费开始成为越来越多的人的青睐。能够确保人们的财产生命安全成了各商家、企业关注的焦点。因此,越来越多的商家、企业都装上了视频监控系统,以便尽量确保人们的生命和财产的安全。可以说,视频监控设备对一个国家的国防安全、社会安全起到了一个至关重要的作用。本文旨在研究一种基于FPGA视频采集与显示模块的设计方法,采用Verilog硬件描述语言设计并验证了系统中的OV7670视频信息采集模块、视频信息缓存模块、视频信息显示模块。通过模块的设计,完成了通过OV7670实现对外界模拟视频信息的采集(A/D转换)、并能够通过VGA接口实现在显示器上进行实时的显示。基于FPGA的设计为视频采集与显示提供了更加灵活高效的实现可能性,该设计模块具有体积比较小、效率较高等优点,在视频处理、安防监控、视频传输等有广泛的应用。1.2设计创新点1.设计的实用性。视频采集并显示模块是一种可以采集并显示视频的方案,也是现在视频监控设备的核心基础。除此之外,此方案如果加上算法级处理后,便可以监控移动的物体、进行人脸识别等。可见对视频采集和显示模块的研究具有实用性。2.设计标准化。模块化设计在本次课题设计中被普遍采用,它贯穿整个设计系统。使各个模块功能相互独立。增加了代码的易读性,使设计标准化。3.设计显示的多元化。设计要求是OV7670采集数据并在VGA显示器上将其显示出来,由于视频的存储采用了异步RAM存储器,因此,如果添加一个TFT彩屏控制器,那么这个系统就可以使视频信息在TFT彩屏上显示,使显示多元化。1.3开发软件简介完成视频采集与显示模块设计所需要的软件如表1-1所示。表1-1开发软件及功能软件功能OfficeVisio画框图、流程图等UltraEdit编辑verilog代码Modelsim仿真代码Quartus对代码进行综合、板级调试等2选型分析2.1视频采集器件简介图2-1OV7670实物图OV7670图像传感器是一种将A/D转换器,它将外界的模拟图像信号进过A/D转换为数字信号。OV7670具有体积小、工作电压低、价格便宜等特点,还支持输出图像的调节功能。使用者可以通过FPGA对OV7670进行配置(通过SCCB总线进行配置),从而使OV7670可以以整帧方式输出8位数据、子采样方式输出8位数据、取窗口方式输出8位数据[1]。该产品的图像刷新频率最高达到30帧/秒。所有图像的处理方式包括伽玛曲线处理方式、白平衡处理方式、饱和度处理方式、色度处理方式等都可以通过SCCB接口编程配置[2]。OV7670图像传感器应用独有的传感器技术,通过采用先进的固定图案降噪技术、浮散处理技术等,降低了图像的不稳定,提高图像质量,从而能够得到用户想要的清晰地稳定的彩色图像。OV7670实物如图2-1所示。2.2FPGA芯片及开发板简介该FPGA的型号是CycloneII系列的EP4CE10C8,此款FPGA内部拥有4608个LES,RAM资源共计119808bits,18*18硬件乘法器总共有13个、高性能PLL有两个、自定义IO多达142个。开发板上提供了大容量片上RAM,如:SDRAM和FlashROM等存储器件。为用户提供了标准的2.54mm间距的扩展插座,只需要外接5V电源即可。FPGA芯片介绍如表2-1、表2-2所示。表2-1EP4CE10硬件逻辑资源情况ResourcesEP4CE6EP4CE10EP4CE10LEs62721032015408PLLs224Glockclk101020I/OBank888UsersI/O179179343表2-2EP4CE10硬件管脚封装兼容升级设计PackageU256F256F324Size(mm)14*1417*1719*19DeviceI/OLVDSI/OLVDSI/OLVDSEp4ce61796617966--Ep4ce101796617966--Ep4ce151655316553--Ep4ce221535215352--Ep4ce3019368Ep4ce40193682.3视频显示器简介图2-2VGA显示器实物图显示器采用CRT显示器,CRT显示器是一种常见的彩色显示器,RGB(绿Green红Red蓝Blue)三基色按照不同比例的混合可以使CRT显示器显示不同的颜色。通常CRT显示器的扫描方式是逐行扫描的方式(有的是隔行进行扫描),CRT显示器内的阴极射线枪发出电子束,这些电子束便会打在涂有萤光粉的荧光屏上,产生了RGB三基色,然后再通过RGB三基色合成一个彩色像素[3]。电子束从屏幕左上方开始扫描,从左到右,从上到下,逐行进行扫描,当电子束扫描完一行后,电子束便重新回到下一行的起始位置(屏幕的左边),在这段时间内,CRT对电子束进行消隐,当扫描完一行时,行同步信号进行行同步[4];当扫描完所有行时,场同步信号进行场同步,并使扫描重新回到屏幕的左上方,同时进行场消隐,预备下一场的扫描[5]。VGA显示器如图2-2所示。3整体方案设计图3-1整体结构图视频采集与显示模块是基于FPGA进行实现的,该系统通过OV7670(摄像头)将外界视频信号采集过来并对其进行A/D转换,然后通过内部控制逻辑将其存放带片内的异步RAM里,VGA显示模块当行、场信号都有效的情况下将数据从内部的异步RAM里取出来,从而保证视频的实时显示。整体框图如图3-1所示。4视频信号的采集4.1SCCB_CTRL模块介绍4.1.1SCCB协议简要说明SCCB总线协议规定SCCB总线是由数据线SIO_D和时钟SIO_C构成的串行总线,可发送和接收数据,在主机与从机之间最高传送速率400kbps。在SCCB总线上可以挂多个从机,各个从机都是并联在SCCB总线上,每个从机都有唯一的地址(器件地址)[6],在主机与从机进行信息的传输过程中,SCCB总线上并接的每一模块电路既是主机又是从机,这是因为主机要想与特定从机进行数据的传输,主机首先需要向总线发送该从机的器件地址以及控制信息,从机需要向主机发送相应信号,当从机将自己的数据送给主机时,这时候从机需要主机给的响应信号,那么这个时候主机就成了从机,从机也就变成了主机。由于通过地址选择,即使有多个从机挂在同一条总线上,却彼此独立,互不影响。4.1.2SCCB_CTRL模块操作时序说明图4-1SCCB时序图当SIO_C信号为高电平,SIO_D信号由高电平变为低电平时,表示一个传输即将开始。SIO_C在低电平的时候,SIO_D信号发生变化,SIO_C为高电平的时候,将SIO_D数据送出去(或接收SIO_D数据)。在第九个时钟周期的时候判断SIO_D是否为低电平,如果是低电平,说明从机有应答,一个字节传输完成,否则,传输失败。当SIO_C信号为高电平时,SIO_D信号由低电平转为高电平时,表示此次传输结束。SCCB时序图如图4-1所示。4.1.3SCCB_CTRL模块流程说明在字节写模式下,主机通过SCCB_CTRL模块发送起始命令和OV7670地址信给OV7670,OV7670在接收到这个地址信息后,OV7670开始发送第一次应答信号;主器件在接收到OV7670产生的应答信号后,发送1个字节地址给OV7670,作为数据将要写入的地址单元,OV7670接收到这个地址后,OV7670开始发送第二个应答信号;主器件接收到应答后,发送待写入数据给OV7670,OV7670接收到后数据后,OV7670开始发送第三次应答信号;然后主器件发送停止信号,OV7670接收到该停止信号后开始内部数据配置,在内部数据配置过程中,OV7670不再响应主器件的任何请求。SCCB_CTRL模块流程图如图4-2所示。图4-2SCCB流程图4.1.4SCCB_CTRL模块结构框图该模块名称是SCCB_CTRL,主要负责对OV7670进行配置。来保证OV7670输出正确格式的数据。SCCB_CTRL结构框图如图4-3所示。图4-3SCCB_CTRL模块结构框图4.1.5SCCB_CTRL模块接口信号表4-1SCCB_CTRL模块接口信号表信号名位宽(BITS)IO说明rst1I系统上电复位信号clk1I系统时钟50MHZsio_c1OSCCB协议时钟信号200KHZsio_d1INOUTSCCB协议数据信号4.1.6SCCB_CTRL模块仿真波形图4-4SCCB_CTRL模块仿真波形波形分析:由图4-4可知当SIO_C为电平时改变SIO_D的值,在SIO_C为高电平时将数据发送出去,在第九个时钟周期的时候将SIO_D释放为高阻态‘Z’,检测到SIO_D为低电平。对OV7670配置成功。4.2OV7670模块介绍4.2.1OV7670模块操作时序说明由图4-5可知当VSYNC信号处于有效阶段并且HREF信号为高电平的时候,从OV7670输出的数据是有效的,当HREF信号为低电平的时候数据输出无效。我们可以在HREF为高电平时来采样数据。图4-5OV7670操作时序图4.2.2OV7670模块结构框图图4-6OV7670模块结构框图该模块名称是OV7670,主要负责将外界的视频信息(模拟信息)经过适当配置后转为我们所需要的视频信息(数字信息),并将转换后的视频信息存储到异步RAM中。因此,通过SCCB配置模块初始化完成后,OV7670将从外界采集到的模拟视频信号转化为数字信号送出去。一个像素点为转化为数字信号需要16bits,而实际上OV7670模块数据信号部分只有8bits,因此,OV7670要将一个像素点的数据送出去需要两个时钟周期(第一个时钟周期发送像素点的低8位数据,第二个周期将发送此像素点的高8位数据)。经过SCCB模块配置成功后,OV7670输出的视频格式将是RGB565格式(RGB555、RGB888等格式都可以通过SCCB模块来配置)、像素点的个数为320*240个。OV7670模块结构框图如图4-6所示。4.2.3OV7670模块接口信号表4-2OV7670模块接口信号表信号名位宽(BITS)IO说明rst1I复位信号pclk1IOV7670输入时钟50MHZvsync1IOV7670模块场同步信号href1IOV7670模块行同步信号data8IOV7670数据输入ram_wren1O数据输出使能位data_ram8O数据输出4.2.4OV7670模块仿真波形图4-7OV7670模块仿真波形波形分析:由图4-7可知OV7670的行、场信号分别是通过行计数器和场计数器控制的。当OV7670的场同步信号处于场有效状态并且OV7670的行同步信号为高电平的时候,OV7670开始将转换好的数字图像信息送出来。与此同时,内部的逻辑会将RAM_WREN信号拉为高电平,从而保证了OV7670模块实时的将数字图像信息写到异步RAM中。4.2.5OV7670模块输出数据结构图4-8OV7670输出数据结构说明:由图4-8可知OV7670的数据输出位宽是8位的,一个像素由16bits构成(RGB565格式),因此,得到一个像素的数据需要OV7670两个时钟周期,第一个时钟周期送出数据的低8位,低二个时钟周期送出数据的高8位,两个时钟数据的结合就构成一个像素点的数据。5视频信号存储5.1ASYN_RAM模块结构框图图5-1ASYN_RAM模块结构框图该模块名称是ASYN_RAM,负责视频数据的存储和数据的合并。本次设计中,OV7670图像的像素位宽为16bits。然而OV7670模块的数据位宽是8bits,FPGA采集一个像素点的视频数据将被分为低8位和高8位。实时显示CRT显示器的VGA模块数据的输入位宽是16bits,所以CRT显示器的显示每个时钟周期需要16bits的数据位宽(即一个像素点的数据)。这时我们需要将OV7670模块低8位数据和高8位数据合并(即一个像素点的数据)。当传输开始时,ASYN_RAM首先对OV7670出来的低8为数据进行缓存,然后再对OV7670出来的高8位数据进行缓存,结合低8位和高8位数据,根据CRT显示器的VGA模块数据输入格式将数据送出去。ASYN_RAM模块结构框图如图5-1所示。5.2ASYN_RAM模块操作流程写数据时,将写使能拉为高电平(读使能为低电平),与此同时CPU送出要写的地址和数据信息;读数据时,将读使能拉为高电平(写使能为低电平),与此同时CPU送出要写的地址信息。5.3ASYN_RAM模块接口信号表5-1ASYN_RAM模块接口信号表信号名位宽(BITS)IO说明wrclock1I写时钟wren1I输入使能wraddress13I写地址data8I数据位输入rdclock1I读时钟rden1I读使能rdaddress12I读地址q16O数据位输出5.4ASYN_RAM模块仿真波形图5-2ASYN_RAM模块仿真波形波形分析:由图5-2可知当WREN为高电平的时候,开始向ASYN_RAM写数据,当RDEN为高的时候开始从ASYN_RAM将视频数据读出来。当两者同时为高时,读写数据就会同时进行。6视频显示说明6.1颜色空间的认识人们为了描述大自然的颜色,通常将颜色用三个相对独立的属性来描述,这三个独立的属性综合作用后,构成了一个如同x、y、z轴的空间坐标,而空间坐标的x、y、z就好比颜色空间的R、G、B信号分量(当然也可以其他表示),每一点对应不同的颜色,而这就是颜色空间[7]。颜色空间也称彩色模型(又称彩色空间或彩色系统)。颜色空间按照基本结构可以分两大类:基色颜色空间和色、亮分离颜色空间。前者的典型是RGB颜色空间;后者包括YUV、以及一批‘色相类颜色空间’。6.2RGB颜色空间图6-1RGB颜色空间图RGB颜色空间是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色[8],这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。RGB格式分为RGB555、RGB565、RGB888等。6.3YUV颜色空间人眼对亮度比较敏感,而对色差不是特别的敏感,因此人们根据这一特性,将颜色空间的亮度和色差分离出来,即这就是我们所说的YUV颜色空间[9]。YUV是一种基本色彩空间,被欧洲的电视系统所采用。它被PAL,NTSC和SECAM用作复合色彩视频标准。其中“Y”指颜色的透明度即亮度,其实“Y”就是图像的灰度值;而“U”和“V”则是指色调,即描述图像色彩及饱和度的属性。图6-2Y、UV采样方式说明:由图6-2可知YUV444格式,每一个Y分量对应一组UV分量;YUV422格式,每两个Y分量对应一组UV分量;YUV420格式,每四个Y分量对应一组UV分量[10]。6.4VGA时序图图6-3VGA行时序图说明:由图6-3可知VGA时序分为行同步信号和场同步信号,行同步信号分为四个阶段,它们分别是(a)行同步阶段、(b)行后沿阶段、(c)行有效阶段、(d)行前沿阶段。其中数据部分黑色表示数据处于无效状态,数据部分白色表示数据处于有效状态。说明:由图6-4可知VGA时序分为行同步信号和场同步信号,场同步信号分为四个阶段,它们分别是(a')场同步阶段、(b')场后沿阶段、(c')场有效阶段、(d')场前沿阶段。其中数据部分黑色表示数据处于无效状态,数据部分白色表示数据处于有效状态。图6-4VGA场时序图6.5VGA接口介绍图6-5VGA接口VGA接口是一种D型接口,共有15个针孔,每排五个。是显卡上应用最为广泛的接口类型,绝大多数显卡都带这种接口。其中,5个信号比较重要,它们分别是红色分量信号、绿色分量信号、蓝色分量信号、水平同步信号和垂直同步信号。VGA接口如图6-5所示。6.6VGA模块接口框图该模块名称是VGA,主要负责将OV7670采集并存放在异步RAM里的视频数据取出来并通过CRT显示器显示出来。因此,VGA模块从异步RAM中读出合并好的数据以后,按照VGA接口的时序送到CRT显示器。VGA模块接口框图如图6-6所示。图6-6VGA模块接口框图6.7VGA模块接口信号表6-1VGA模块接口信号表信号名位宽(BITS)IO说明clk1IVGA时钟信号rst1IVGA复位信号hsync1Ohorizontalsynchronizationpulsevsync1Overticalsynchronizationpulser5Oredcolordatag6Ogreencolordatab5Obluecolordataram_rden1OVGA数据读RAM使能信号rd_data16IVGA模块从RAM读取的RGB数据6.8VGA模块仿真波形图6-7VGA模块仿真波形波形分析:由图6-7可知VGA的行场信号分别由行场计数器控制,当行信号属于行有效阶段并且场信号属于场有效阶段,这个时候VGA模块开始将使能信号拉高,r、g、b信号开始输出有效数据。7开发板调试图7-1调试现象说明:如图7-1所示。打开开发板,开发板上面的灯就会亮起,我们用电脑将RTL代码下载到开发板后,在CRT显示器上就会显示摄像头采集的视频信息。图7-2调试现象说明:如图7-2所示。将手机放在摄像头前,摄像头采集到手机上的钟点信息,CRT显示器显示“24”字样。8总结通过本次设计我们可以得到以下收获,由于受开发板上FPGA芯片EP4CE10C8的约束。按照正常的时序来说,在VGA显示器上最大只能显示160*120的视频图像信息。然而,实际上我们的OV7670和VGA显示器的分辨率都是320*240。如果只在VGA显示器上显示160*120的图像信息,那么,这样就会造成了硬件上的浪费同时也不能满足于我们当初的设计要求,为了让视频图像信息能够实现全屏显示,那么在实际的设计中我们对其进行了相关的优化,即将OV7670采集而来的一行数据及时的送给VGA显示器,那么,当OV7670采集而来的二行数据也及时的送给VGA显示器。以此类推。虽然开发板上的FPGA芯片没有足够多的RAM资源,结果而实现了图像信息的全屏显示。本次毕业设计要求视频的采集、存储并将视频信息显示出来的设计,这要求我们掌握相关的理论知识以及熟练使用相关的开发软件。刚开始接触到该课题时并不熟悉各个模块的设计,通过查阅相关版图设计的书籍以及向老师请教才顺利的完成了本次的设计。在此次的设计过程中,既巩固了所学的理论知识,又能够熟练的掌握了OfficeVisio、UltraEdit编辑器、QUARTUSII、Modelsim的使用方法,系统地掌握了FPGA模块化设计的方法。参考文献[1]李飞鹏.基于FPGA的H.264视频压缩编码系统研究与实现[D].南京航空航天大学,2011:12-13.[2]赵冬红,刘文颖,李静,等.Delphi在电力系统中的应用[C].中国电机工程学会青年学术会议.2008.[3]董兵,朱齐丹,文睿.基于FPGA的VGA图像控制器的设计与实现[J].应用科技,2006,33(10):42-45.[4]姜军,卓嘎,周子敬.VGA图像显示控制的片上系统实现[J].西藏科技,2008(10):71-72.[5]徐洋.基于VerilogHDL的FPGA设计与工程应用[M].北京:人民邮电出版社,2009:44-49.[6]何浩.面向红外摄像电子白板的SOC原型设计[D].电子科技大学,2012.[7]张振花.基于内容图像检索的若干技术研究[D].吉林大学,2009.[8]杨尧.计算机图像的色彩模式[J].黑龙江科技信息,2010(7):30-30.[9]胡维友.颜色空间RGB与CMYK之间的变换[J].印刷世界,2007(3):9-12.[10]宋雪臣,单振清.数字电子技术[M].北京:北京大学出版社,2011:18-20.致谢本人的学位论文是在导师洪作奎老师的亲切关怀和细心指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深的感染和激励着我。从课题的选择到项目的最终完成,洪老师都始终给予我细心的指导和不懈的支持。在此谨像洪老师以诚挚的谢意和崇高的敬意。在此,我还要感谢在一起愉快度过大学时光的每个可爱的同学们和尊敬的老师们,正是由于你们的帮助和支持,我才能克服一个个的困难和疑惑,直至本文的顺利完成。在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里接受我诚挚的谢意!谢谢你们!附录SCCB_CTRL模块代码代码modulesccb_ctrl(clk,reset_l,i2c_exc,i2c_addr,i2c_data_w,i2c_data_r,i2c_done,sda_dir,sda_wr, scl_wr);inputclk;inputreset_l;inputi2c_exc;input [7:0]i2c_addr;input [7:0]i2c_data_w;output[7:0]i2c_data_r;outputi2c_done;outputsda_dir;outputsda_wr;outputscl_wr;reg[7:0]wr_addr_reg;reg[7:0]wr_data_reg;regsda_dir;regsda_wr;regscl_wr;regstarti2c_done;regi2cwrite_0x42_done;regi2cwrite_addr_done;regi2cwrite_data_done;regstopi2c_done;reg[3:0]starti2c_cnt;reg[5:0]i2cwrite_0x42_cnt;reg[5:0]i2cwrite_addr_cnt;//reg[5:0]i2cwrite_addr_cnt;reg[5:0]i2cwrite_data_cnt;reg[3:0]stopi2c_cnt;regi2cwrite_start;regi2c_done;reg[7:0]i2cwrite_data;reg [5:0]CUR_STATE;reg [5:0]NEXT_STATE;wirei2cwrite_done;wirei2cwrite_ind;wirei2c_sda_dir;wirei2c_sda_wr;wirei2c_scl_wr;parameter STAT_IDLE = 6'b000001,STAT_STARTI2C = 6'b000010, STAT_I2CWRITE_0X42= 6'b000100, STAT_I2CWRITE_ADDR= 6'b001000, STAT_I2CWRITE_DATA= 6'b010000, STAT_STOPI2C = 6'b100000;always@(negedgereset_lorposedgeclk)beginif(reset_l==1'b0)begin CUR_STATE<=STAT_IDLE; end elsebegin CUR_STATE<=NEXT_STATE; endendalways@(*)begin case(CUR_STATE) STAT_IDLE:begin if(i2c_exc==1'b1)begin NEXT_STATE<=STAT_STARTI2C; end elsebegin NEXT_STATE<=STAT_IDLE; end end STAT_STARTI2C:begin if(starti2c_done==1'b1)begin NEXT_STATE<=STAT_I2CWRITE_0X42; end elsebegin NEXT_STATE<=STAT_STARTI2C; end end STAT_I2CWRITE_0X42:begin if(i2cwrite_0x42_done==1'b1)begin NEXT_STATE<=STAT_I2CWRITE_ADDR; end elsebegin NEXT_STATE<=STAT_I2CWRITE_0X42; end end STAT_I2CWRITE_ADDR:begin if(i2cwrite_addr_done==1'b1)begin NEXT_STATE<=STAT_I2CWRITE_DATA; end elsebegin NEXT_STATE<=STAT_I2CWRITE_ADDR; end end STAT_I2CWRITE_DATA:begin if(i2cwrite_data_done==1'b1)begin NEXT_STATE<=STAT_STOPI2C; end elsebegin NEXT_STATE<=STAT_I2CWRITE_DATA; end end STAT_STOPI2C:begin if(stopi2c_done==1'b1)begin NEXT_STATE<=STAT_IDLE; end elsebegin NEXT_STATE<=STAT_STOPI2C; end end default:begin NEXT_STATE<=STAT_IDLE; end endcaseend always@(negedgereset_lorposedgeclk)if(reset_l==1'b0)begin wr_addr_reg<=8'b0; wr_data_reg<=8'b0; end elsebegin if(i2c_exc==1'b1)begin wr_addr_reg<=i2c_addr; wr_data_reg<=i2c_data_w; end end always@(negedgereset_lorposedgeclk)beginif(reset_l==1'b0)begin sda_dir <=1'b0; sda_wr <=1'b0; scl_wr <=1'b0;starti2c_done <=1'b0; i2cwrite_0x42_done<=1'b0; i2cwrite_addr_done <=1'b0; i2cwrite_data_done <=1'b0; stopi2c_done <=1'b0; starti2c_cnt <=4'b0;i2cwrite_0x42_cnt <=6'b0;i2cwrite_addr_cnt <=6'b0;i2cwrite_data_cnt <=6'b0;stopi2c_cnt <=4'b0;i2cwrite_start <=1'b0;i2cwrite_data <=8'b0;i2c_done <=1'b0; end elsebegin i2c_done<=stopi2c_done; case(CUR_STATE) STAT_STARTI2C:begin if(starti2c_cnt<4'hf)begin starti2c_cnt<=starti2c_cnt+4'b1; end case(starti2c_cnt) 0:sda_wr <=1'b1; 2:scl_wr <=1'b1; 4:sda_wr <=1'b0; 6:scl_wr <=1'b0; 7:starti2c_done <=1'b1; default:beginstarti2c_done<=1'b0; end endcase end STAT_I2CWRITE_0X42:begin if(i2cwrite_0x42_cnt<6'b111111)begin i2cwrite_0x42_cnt<=i2cwrite_0x42_cnt+6'b1; end i2cwrite_0x42_done<=1'b0; case(i2cwrite_0x42_cnt) 0:sda_dir <=1'b1; 2:sda_wr <=1'b0; 4:scl_wr <=1'b1; 6:scl_wr <=1'b0; 8:sda_wr <=1'b1; 10:scl_wr <=1'b1; 12:scl_wr <=1'b0; 14:sda_wr <=1'b0; 16:scl_wr <=1'b1; 18:scl_wr <=1'b0; 20:sda_wr <=1'b0; 22:scl_wr <=1'b1; 24:scl_wr <=1'b0; 26:sda_wr <=1'b0; 28:scl_wr <=1'b1; 30:scl_wr <=1'b0; 32:sda_wr <=1'b0; 34:scl_wr <=1'b1; 36:scl_wr <=1'b0; 38:sda_wr <=1'b1; 40:scl_wr <=1'b1; 42:scl_wr <=1'b0; 44:sda_wr <=1'b0; 46:scl_wr <=1'b1; 48:scl_wr <=1'b0; 50:sda_dir <=1'b0; 52:scl_wr <=1'b1; 54:scl_wr <=1'b0; 56:sda_dir <=1'b1; 57:begini2cwrite_0x42_done<=1'b1; end default:; endcase end STAT_I2CWRITE_ADDR:begin if(i2cwrite_addr_cnt<6'b111111)begin i2cwrite_addr_cnt<=i2cwrite_addr_cnt+6'b1; end i2cwrite_addr_done<=1'b0; case(i2cwrite_addr_cnt) 0:sda_dir <=1'b1; 2:sda_wr <=wr_addr_reg[7]; 4:scl_wr <=1'b1; 6:scl_wr <=1'b0; 8:sda_wr <=wr_addr_reg[6]; 10:scl_wr <=1'b1; 12:scl_wr <=1'b0; 14:sda_wr <=wr_addr_reg[5]; 16:scl_wr <=1'b1; 18:scl_wr <=1'b0; 20:sda_wr <=wr_addr_reg[4]; 22:scl_wr <=1'b1; 24:scl_wr <=1'b0; 26:sda_wr <=wr_addr_reg[3]; 28:scl_wr <=1'b1; 30:scl_wr <=1'b0; 32:sda_wr <=wr_addr_reg[2]; 34:scl_wr <=1'b1; 36:scl_wr <=1'b0; 38:sda_wr <=wr_addr_reg[1]; 40:scl_wr <=1'b1; 42:scl_wr <=1'b0; 44:sda_wr <=wr_addr_reg[0]; 46:scl_wr <=1'b1; 48:scl_wr <=1'b0; 50:sda_dir <=1'b0; 52:scl_wr <=1'b1; 54:scl_wr <=1'b0; 56:sda_dir <=1'b1; 57:begini2cwrite_addr_done<=1'b1; end default:; endcase end STAT_I2CWRITE_DATA:begin if(i2cwrite_data_cnt<6'b111111)begin i2cwrite_data_cnt<=i2cwrite_data_cnt+6'b1; end i2cwrite_data_done<=1'b0; case(i2cwrite_data_cnt) 0:sda_dir <=1'b1; 2:sda_wr <=wr_data_reg[7]; 4:scl_wr <=1'b1; 6:scl_wr <=1'b0; 8:sda_wr <=wr_data_reg[6]; 10:scl_wr <=1'b1; 12:scl_wr <=1'b0; 14:sda_wr <=wr_data_reg[5]; 16:scl_wr <=1'b1; 18:scl_wr <=1'b0; 20:sda_wr <=wr_data_reg[4]; 22:scl_wr <=1'b1; 24:scl_wr <=1'b0; 26:sda_wr <=wr_data_reg[3]; 28:scl_wr <=1'b1; 30:scl_wr <=1'b0; 32:sda_wr <=wr_data_reg[2]; 34:scl_wr <=1'b1; 36:scl_wr <=1'b0; 38:sda_wr <=wr_data_reg[1]; 40:scl_wr <=1'b1; 42:scl_wr <=1'b0; 44:sda_wr <=wr_data_reg[0]; 46:scl_wr <=1'b1; 48:scl_wr <=1'b0; 50:sda_dir <=1'b0; 52:scl_wr <=1'b1; 54:scl_wr <=1'b0; 56:sda_dir <=1'b1; 57:begini2cwrite_data_done<=1'b1; end default:; endcase end STAT_STOPI2C:begin if(stopi2c_cnt<4'hf)begin stopi2c_cnt<=stopi2c_cnt+4'b1; end stopi2c_done<=1'b0; case(stopi2c_cnt) 0:sda_wr <=1'b0; 2:scl_wr <=1'b1; 4:sda_wr <=1'b1; 5:beginstopi2c_done<=1'b1; end default:; endcase end default:begin starti2c_done <=1'b0; i2cwrite_0x42_done <=1'b0; i2cwrite_addr_done <=1'b0; i2cwrite_data_done <=1'b0; stopi2c_done<=1'b0; i2cwrite_start <=1'b0; starti2c_cnt <=4'b0; i2cwrite_0x42_cnt <=6'b0; i2cwrite_addr_cnt <=6'b0; i2cwrite_data_cnt <=6'b0; stopi2c_cnt <=4'b0; i2c_done <=1'b0; end endcase endendendmoduleAUTO_CFG_OV7670模块代码代码moduleauto_cfg_ov7670(clk,reset_l, i2c_exc,i2c_addr,i2c_data_w,i2c_data_r,i2c_done,init_done);inputclk;inputreset_l;outputi2c_exc;output[7:0]i2c_addr;output[7:0]i2c_data_w;input[7:0]i2c_data_r;inputi2c_done;output init_done;reg[7:0] start_init_cnt;reg[7:0] init_reg_cnt;regi2c_exc;reg[7:0]i2c_addr;reg[7:0] i2c_data_w;reginit_done;always@(negedgereset_lorposedgeclk)beginif(reset_l==1'b0)begin start_init_cnt<=8'b0;endelsebegin if(start_init_cnt<8'hff)begin start_init_cnt<=start_init_cnt+1; end endendalways@(negedgereset_lorposedgeclk)if(reset_l==1'b0)begin init_reg_cnt<=8'b0; i2c_exc <=1'b0; i2c_addr <=8'b0; i2c_data_w <=8'b0; init_done<=1'b0;endelsebegin i2c_exc<=1'b0; if(init_reg_cnt<8'd27)begin i2c_exc<=i2c_done; end if(start_init_cnt==8'hfd)begin i2c_exc<=1'b1; end if(i2c_exc==1'b1)begin init_reg_cnt<=init_reg_cnt+1; end case(init_reg_cnt) 0:begin i2c_addr <=8'h12; i2c_data_w <=8'h80; end 1:begin i2c_addr<=8'h12; i2c_data_w<=8'h04; end 2:begin i2c_addr<=8'h40; i2c_data_w<=8'hd0; end 3:begin i2c_addr<=8'h3a; i2c_data_w<=8'h04; end 4:begin i2c_addr<=8'h3d; i2c_data_w<=8'hc8; end 5:begin i2c_addr<=8'h1e; i2c_data_w<=8'h31; end 6:begin i2c_addr<=8'h6b; i2c_data_w<=8'h00; end 7:begin i2c_addr<=8'h32; i2c_data_w<=8'hb6; end 8:begin i2c_addr<=8'h17; i2c_data_w<=8'h13; end 9:begin i2c_addr<=8'h18; i2c_data_w<=8'h01; end 10:begin i2c_addr<=8'h3d; i2c_data_w<=8'hc8; end default:; endcaseendendmoduleOV7670_SCCB模块代码代码moduleov7670_sccb(rst,clk, sio_c,sio_d,reset,pwdn,init_done);inputrst;inputclk;output sio_c;output sio_d;output reset;output pwdn;output init_done;wire clk_100khz;wire i2c_exc ;wire [7:0] i2c_addr;wire [7:0] i2c_data_w;wire [7:0] i2c_data_r;wire i2c_done;wire sda_wr;assignreset =1'b1 ;assignpwdn =1'b0 ;clk_gen clk_gen_u1(.reset_l(rst),.clk(clk),.clk_100khz(clk_100khz));sccb_ctrlu2(. clk (clk_100khz ),. reset_l (rst), . i2c_exc (i2c_exc ),. i2c_addr (i2c_addr),. i2c_data_w (i2c_data_w),. i2c_data_r (i2c_data_r),. i2c_done (i2c_done),. sda_dir (sda_dir),. sda_wr (sda_wr),. scl_wr (sio_c));assignsio_d=(sda_dir==1'b1)?sda_wr:1'bz;auto_cfg_ov7670auto_cfg_ov7670_u1(. clk (clk_100khz ),. reset_l (rst) ,. i2c_exc (i2c_exc ),. i2c_addr (i2c_addr),. i2c_data_w (i2c_data_w ),. i2c_data_r (i2c_data_r ),. i2c_done (i2c_done),. init_done (init_done));endmoduleCLK_GEN模块代码代码moduleclk_gen(inputreset_l,inputclk,outputregclk_100khz);reg[11:0]clk_100khz_cnt;parameterclk_100khz_cnt_MAX=12'd249;always@(negedgereset_lorposedgeclk)beginif(!reset_l)begin clk_100khz_cnt<=12'b0;clk_100khz<=1'b0;endelsebeginif(clk_100khz_cnt==clk_100khz_cnt_MAX)begin clk_100khz_cnt<=12'b0; clk_100khz <=~clk_100khz;endelsebegin clk_100khz_cnt<=clk_100khz_cnt+12'b1;endendendendmoduleOV7670模块代码代码moduleov7670( rst, pclk , initial_done, vsync, href , data , ram_wren, data_ram );input rst;input pclk ;input initial_done;input vsync;input href ;input[7:0] data;output reg ram_wren;output reg[7:0] data_ram;reg[7:0] href_count;wire[7:0] href_count_1; reg [17:0] vsync_count ;wire[17:0] vsync_count_1;assign vsync_count_1 = vsync_count ;assign href_count_1 = href_count;always@(posedgepclkornegedgerst)beginif(rst==1'b0)begin href_count <= 8'd0 ; end elsebegin if(ini
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国银杏树数据监测研究报告
- 《心脏讲课用》课件
- 《路基路面定额》课件
- 海洋知识竞赛复习测试卷含答案
- 《担当的命题作文》课件
- 银行保险衔接训练课件-客户类型分析
- 《功率高中物理》课件
- 《高等数学A习题课》课件
- 【语文】《促织》课件++2024-2025学年统编版高一语文必修下册
- 《POP字体书写》课件
- 《服装品牌策划》课件
- 近五年陕西中考数学真题及答案2024
- 二零二五年度集团公司内部项目专项借款合同范本3篇
- 低空飞行旅游观光项目可行性实施报告
- 2024年版:煤矿用压力罐设计与安装合同
- 2024年贵州云岩区总工会招聘工会社会工作者笔试真题
- 《算法定价垄断属性问题研究的国内外文献综述》4200字
- 2024年04月浙江义乌农商银行春季招考笔试历年参考题库附带答案详解
- 涉密计算机保密培训
- 美国药典-USP-561-植物源性物质
- 挂靠免责协议书范本
评论
0/150
提交评论