资讯详情

【正点原子FPGA连载】第四十一章OV5640摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

1)实验平台:正点原子新起点V2开发板 2)平台采购地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码 手册 视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)正点原子FPGA感兴趣的同学可以加群讨论:99424016 4)关注正点原子微信官方账号,获取最新信息更新 在这里插入图片描述

第四十一章OV5640摄像头RGB-LCD显示实验

OV5640同OV7725一样,都是OmniVision公司生产的(豪威科技)CMOS图像传感器。不同的是,OV5640支持更高的分辨率、采集率和更高的图像处理性能,主要用于手机、数码相机、计算机多媒体等领域。本章将使用FPGA实现正确的开发板OV5640数字图像采集并通过LCD实时显示。 本章包括以下几个部分: 4040.1简介 40.2实验任务 40.3硬件设计 40.4程序设计 40.5下载验证

41.1简介

OV5640是1/4英寸单芯片图像传感器,其感光阵列达到25921944(即500W像素),最快15fps QSXVGA(25921944)或者90fps VGA(640*480)图像采集的分辨率。传感器采用OmniVision推出的OmniBSI高灵敏度、低串扰、低噪声等传感器技术。图像处理功能集成在传感器内,包括自动曝光控制(AEC)、自动白平衡(AWB)等。传感器支持LED补光、MIPI输出接口和(移动工业处理器接口)DVP输出界面选择(数字视频并行)ISP(图像信号处理)和AFC(自动聚焦控制)等功能。 OV如下图所示,5640功能框图:

图 41.1.1 OV5640功能框图 从上图可以看出,时序发生器(timing generator)控制感光阵列(image array)、放大器(AMP)、AD输出外部时序信号(VSYNC、HREF和PCLK),外部时钟XVCLK经过PLL相环后输出的时钟作为系统的控制时钟;感光阵列将光信号转换为模拟信号,增益放大器后进入10位AD转换器;AD转换器将模拟信号转换为数字信号,并通过ISP对相关图像进行处理,最终输出配置格式的10位视频数据流。控制和控制增益放大器ISP通过寄存器等(registers)配置寄存器的接口是SCCB接口协议与接口兼容IIC协议。 OV5640采用两线式SCCB接口总线,相关SCCB详细介绍总线可参考OV7725摄像头RGB-LCD在显示实验中OV7725简介部分。虽然OV5640和OV7725都是采用SCCB接口总线配置寄存器,但同,OV7725用8位(1字节)表示寄存器地址OV5640是用16位(两个字节)表示寄存器地址。 OV5640 SCCB如下图所示:

图 41.1.2 SCCB写传输协议 上图中的ID ADDRESS由7位器件地址和1位读写控制位组成 1:读),OV5640器件地址为7’h3c,因此,在写传输协议时,ID Address(W)= 8’h78(设备地址左移1位,低位补0);Sub-address(H)高8位寄存器地址,Sub-address(L)在低8位寄存器地址OV在5640多个寄存器中,有些寄存器可以重写,有些寄存器只能阅读,只有可重写的寄存器才能正确写入;Write Data为8位写数据,每个寄存器地址对应8位配置数据。 在OV5640正常工作前,传感器必须初始化,即通过配置寄存器在预期的工作模式下工作,并获得更好的图像质量。因为SCCB写传输协议和IIC几乎一样,所以我们可以直接使用IIC配置摄像头的驱动程序。当然,并非所有的寄存器都需要配置,许多寄存器可以使用默认值。OV公司提供了OV5640软件应用手册(OV5640 Software Application Note,附在开发板上的信息7_硬件资料/4_OV5640资料/OV5640_camera_module_software_application_notes.pdf”),如果有些寄存器不知道如何配置,请参考本手册。下表是本程序中使用的关键寄存器的配置说明。 表 41.1.1 OV5640关键寄存器配置说明

OV5640寄存器较多,其他寄存器的描述可参考OV5640数据手册。需要注意的是,OV5640的数据手册并没有提供所有的寄存器描述,而且大多数必要的寄存器配置在ov在5640软件应用手册中可以找到,可以结合这两本手册学习如何对待OV5640进行配置。 1)设置输出图像参数 接下来,让我们介绍一下OV5640的ISP输入窗设置、预缩放窗设置和输出大小窗设置与我们的正常使用密切相关。有必要了解它们的设置关系如下图所示:

图 41.1.3 设置图像窗口 ISP设置输入窗口(ISP Input Size)允许用户设置整个传感器显示区域(physical pixel size,26321951,其中25921944像素有效),开窗范围为00~2632可任意设置1951。也就是上图中的X_ADDR_ST(寄存器地址0x3800、0x3801)、Y_ADDR_ST(寄存器地址0x3802、0x3803)、X_ADDR_END(寄存器地址0x3804、0x3805)和Y_ADDR_END(寄存器地址0x3806、0x3807)寄存器。窗口设置范围内的像素数据将进入ISP图像处理。 设置预缩放窗(pre-scaling size)允许用户在ISP在输入窗口的基础上进行切割,设置缩放窗口的大小,仅在ISP输入窗口X/Y方向的偏移。可以通过X_OFFSET(寄存器地址0x3810、0x3811)和Y_OFFSET(寄存器地址0x3812、0x3813)配置。 设置输出大小窗口(data output size)在预缩放窗的基础上,通过内部DSP缩放处理,将处理后的数据输出到外部图像窗口,控制最终图像输出尺寸。可以通过X_OUTPUT_SIZE(寄存器地址0x3808、0x3809)和Y_OUTPUT_SIZE(寄存器地址0x380A、0x380B)进行配置。注:当输出大小窗口与预缩放窗口的比例不一致时,图像将收缩(图像变形)。当两者的比例一致时,输出比为1:1(正常图像)。 图 41.1.3 图像窗设置在右侧data output size区域,才是OV5640输出到外部图像尺寸,即显示在显示器或液晶屏上的图像尺寸。当输出大小窗口与预缩放窗口的比例不一致时,将收缩放置,显示器上看到的图像将变形。 16)输出像素格式 OV5640支持多种不同的数据像素格式,包括YUV(像素格式分别表示亮度参数和色度参数),RGB(其中RGB格式包含RGB565、RGB555等)以及RAW通过寄存器地址0(原始图像数据)x4300配置成不同的数据像素格式。 因为相机收集的图像最终必须通过LCD显示,所以我们会OV5640摄像头输出的图像素数据配置成RGB565格式。由上表(表 41.1.1)可以知道寄存器0x4300寄存器的Bit[7:4]设置为0x6即可。OV5640支持调节RGB565输出格式中各种颜色变量的顺序一般用于我们的常用应用RGB或BGR序列。我们在“OV7725摄像头RGB-LCD本章介绍了显示实验,OV7725摄像头按照RGB本章我们将按顺序输出OV5640输出的RGB颜色顺序和565OV7725保持一致,寄存器0x4300寄存器的Bit[3:0]设置为0x1。因此,“OV7725摄像头RGB-LCD本章中的图像采集模块可直接用于采集OV5640输出图像。 17)彩条测试模式 图像传感器配置式后,图像传感器将输出彩色条纹,以便于测试图像传感器是否正常工作x503d的Bit[7]打开和关闭彩条模式。寄存器0x503d配置成0x80,关闭时配置0x下图为打开彩条模式后图像输出的条纹。

图 41.1.4 彩条模式下的图像条纹 18)LED闪光灯 当外界环境光较暗时,传感器采集图像会受到较大影响,此时可以通过打开LED补光灯来弥补光照不足所带来的影响,就像手机在夜晚拍照时也会打开闪光灯来提高图像质量。通过配置寄存器0x3016=0x02,0x301c=0x02来使能LED补光灯功能;配置寄存器0x3019=0x02打开闪光灯,0x3019=0x00关闭闪光灯。 19)图像输出时序 接下来,我们介绍一下OV5640的图像数据输出时序,首先我们简单介绍一些定义。 QSXGA,这里指:分辨率为25921944的输出格式,类似的还有:QXGA(20481536)、UXGA(16001200)、SXGA(12801024)、WXGA(1440900)、WXGA(1280800)、XGA(1024768)、SVGA(800600)、VGA(640480)、QVGA(320240)和QQVGA(160120)等。 PCLK:像素时钟,一个PCLK时钟输出一个像素或者半个像素(像素数据的高8位或者低8位)。 VSYNC:帧同步信号。 HREF/HSYNC:行同步信号。 D[9:0]:像素数据,在RGB565格式中,只有高8位是有效的。 tPclk:一个时钟周期 。 tp:一个像素点的周期,在RGB565和YUV422输出格式下,tp=2tPclk;Raw输出格式下,tp=tPclk。 下图为OV5640输出图像数据的行时序图。

图 41.1.5 OV5640行时序图 从上图可以看出,传感器在HREF为高电平的时候输出图像数据,当HREF变高后,每一个 PCLK时钟,输出一个8位或者10位像素数据。比如我们采用QSXGA时序,RGB565格式输出,tp=2tPclk,每2个字节组成一个像素的颜色,这样每行总共输出25922个PCLK,也就是25922个字节。 再来看看帧时序(QSXGA模式,分辨率25921944),如下图所示:

图 41.1.6 OV5640 QSXGA帧时序 由上图可知,VSYNC的上升沿作为一帧的开始,高电平同步脉冲的时间为5688tp,紧接着等待48276tp时间后,HREF开始拉高,此时输出有效数据;HREF由2592tp个高电平和252tp个低电平构成;最后一行图像数据输出完成之后等待14544tp时间,一帧数据传输结束。所以输出一帧图像的时间实际上是tFrame = 5596992tp。 从OV5640的行时序图和帧时序图可以发现,其输出时序和OV7725是非常相似的,只是时间参数不同而已,大家可以参考“OV7725摄像头RGB-LCD显示实验”中帧时序的介绍来学习OV5640的输出时序。 41.2实验任务 本节实验任务是使用新起点开发板及OV5640摄像头实现图像采集,并通过RGB-LCD接口驱动RGB-LCD液晶屏(支持目前正点原子推出的所有RGB-LCD屏),并实时显示出图像。 41.3硬件设计 我们的新起点FPGA开发板上有一个摄像头扩展接口,该接口可以用来连接OV7725/OV5640等摄像头模块,摄像头扩展接口原理图如下图所示:

图 41.3.1 摄像头扩展接口原理图 ATK-OV5640是正点原子推出的一款高性能500W像素高清摄像头模块。该模块通过2*9排针(2.54mm间距)同外部连接,我们将摄像头的排针直接插在开发板上的摄像头接口即可,模块外观如图 41.3.2所示:

图 41.3.2 OV5640摄像头连接开发板图 从图 41.3.2可以看出,模块自带有源晶振,用于产生24MHz时钟作为OV5640的输入时钟。模块的闪光灯(LEDI&LED2)由OV5640的STROBE引脚控制,用户可通过SCCB接口总线控制STROBE引脚输出高低电平,从而控制LED闪光灯的亮灭。用户在使用LED灯时不建议一直点亮或者点亮时间太长。因为LED闪光灯功率较高,发光强度较强,模块温度上升会比较快,会造成器件的可靠性降低,同时注意避免直接照射人眼。 我们在前面说过,OV5640在RGB565模式下只有高8位数据是有效的即D[9:2],而我们的摄像头排针上数据引脚的个数是8位。实际上,摄像头排针上的8位数据连接的就是OV5640传感器的D[9:2],所以我们直接使用摄像头排针上的8位数据引脚即可。 由于LCD接口和SDRAM引脚数目较多且在前面相应的章节中已经给出它们的管脚列表,这里只列出摄像头相关管脚分配,如下表所示: 表 41.3.1 OV5640摄像头管脚分配

摄像头TCL约束文件如下: set_location_assignment PIN_T14 -to cam_data[7] set_location_assignment PIN_R14 -to cam_data[6] set_location_assignment PIN_N6 -to cam_data[5] set_location_assignment PIN_P6 -to cam_data[4] set_location_assignment PIN_M8 -to cam_data[3] set_location_assignment PIN_N8 -to cam_data[2] set_location_assignment PIN_P8 -to cam_data[1] set_location_assignment PIN_K9 -to cam_data[0] set_location_assignment PIN_M9 -to cam_href set_location_assignment PIN_R13 -to cam_pclk set_location_assignment PIN_R12 -to cam_pwdn set_location_assignment PIN_L9 -to cam_rst_n set_location_assignment PIN_N9 -to cam_scl set_location_assignment PIN_L10 -to cam_sda set_location_assignment PIN_P9 -to cam_vsync 41.4程序设计 图 41.4.1是根据本章实验任务画出的系统框图。PLL时钟模块为I2C驱动模块、LCD顶层模块以及SDRAM控制器模块提供驱动时钟;I2C驱动模块和I2C配置模块、图像尺寸配置模块用于初始化OV5640图像传感器;摄像头采集模块负责采集摄像头图像数据,并且把图像数据写入SDRAM读写控制模块;SDRAM读写控制模块负责将用户数据写入和读出片外SDRAM存储器中;LCD顶层模块负责驱动RGB TFT-LCD显示屏。 OV5640摄像头RGB TFT-LCD显示系统框图如下图所示:

图 41.4.1 OV5640摄像头RGB TFT-LCD显示系统框图 顶层模块的原理图如下图所示:

图 41.4.2 顶层模块原理图 由上图可知,I2C配置模块和I2C驱动模块控制着传感器初始化的开始与结束,传感器初始化完成后图像采集模块将采集到的数据写入SDRAM读写控制模块,LCD模块从SDRAM控制模块中读出数据,完成了数据的采集、缓存与显示。其中图像数据采集模块是在SDRAM和传感器都初始化完成之后才开始输出数据的,避免了在SDRAM初始化过程中向里面写入数据。 FPGA顶层模块(ov5640_rgb565_lcd)例化了以下六个模块:PLL时钟模块(pll_clk)、I2C驱动模块(i2c_dri)、I2C配置模块(i2c_ov5640_rgb565_cfg)、摄像头图像采集模块(cmos_capture_data)、图像尺寸配置模块(picture_size)、SDRAM读写控制模块(sdram_top)和LCD顶层模块(lcd_rgb_top)。 PLL时钟模块(pll_clk):PLL时钟模块通过调用锁相环(PLL)IP核实现,总共输出3个时钟,频率分别为100Mhz、100Mhz(SDRAM相位偏移时钟)和50Mhz(LCD分频用)时钟。100Mhz时钟和100Mhz相位偏移时钟作为SDRAM读写控制模块的驱动时钟,最后一个50Mhz时钟作为LCD顶层模块的驱动时钟。 I2C驱动模块(i2c_dri):I2C驱动模块负责驱动OV5640 SCCB接口总线,用户可根据该模块提供的用户接口对OV5640的寄存器进行配置,该模块和“EEPROM读写实验”章节中用到的I2C驱动模块为同一个模块,有关该模块的详细介绍请大家参考“EEPROM读写实验”章节。 I2C配置模块(i2c_ov5640_rgb565_cfg):I2C配置模块的驱动时钟是由I2C驱动模块输出的时钟提供的,这样方便了I2C驱动模块和I2C配置模块之间的数据交互。该模块寄存需要配置的寄存器地址、数据以及控制初始化的开始与结束,同时该模块输出OV5640的寄存器地址和数据以及控制I2C驱动模块开始执行的控制信号,直接连接到I2C驱动模块的用户接口,从而完成对OV5640传感器的初始化。OV7725和OV5640寄存器配置时序非常相似,有关该模块的详细介绍请大家参考“OV7725摄像头RGB-LCD显示实验”章节。 摄像头图像采集模块(cmos_capture_data):摄像头采集模块在像素时钟的驱动下将传感器输出的场同步信号、行同步信号以及8位数据转换成SDRAM读写控制模块的写使能信号和16位写数据信号,完成对OV5640传感器图像的采集。OV7725和OV5640图像输出时序非常相似,有关该模块的详细介绍请大家参考“OV7725摄像头RGB-LCD显示实验”章节。 图像尺寸配置模块(picture_size):图像尺寸配置模块用于配置摄像头输出图像尺寸的大小,以及设置摄像头输出图像的帧率(每秒输出图像的帧数),此外还完成了SDRAM的读写结束地址设置。 SDRAM读写控制模块(sdram_top):SDRAM读写控制器模块负责驱动SDRAM片外存储器,缓存图像传感器输出的图像数据。该模块将SDRAM复杂的读写操作封装成类似FIFO的用户接口,非常方便用户的使用。有关该模块的详细介绍请大家参考“SDRAM读写测试实验”章节,修改部分请大家参考“OV7725摄像头RGB-LCD显示实验”章节。 LCD顶层模块(lcd_rgb_top):LCD顶层模块下例化了以下三个模块:读ID模块(rd_id)、分频模块(clk_div)、LCD驱动模块(lcd_driver)。 读ID模块(rd_id):读ID模块用于读取连接到开发板上的LCD的ID。 分频模块(clk_div):分频模块用于输出驱动LCD所需要的时钟。由于不同尺寸/分辨率RGB LCD的驱动时钟频率是不一样的,该模块实现不同LCD的驱动时钟适配。 LCD驱动模块(lcd_driver):LCD驱动模块负责驱动LCD液晶屏,该模块通过读取SDRAM读写控制模块来输出像素数据,本次实验将LCD驱动模块的内部信号data_req(数据请求信号)输出至端口,方便从SDRAM控制器中读取数据。有关LCD驱动模块的详细介绍请大家参考“RGB-LCD彩条显示实验”章节。 下面是顶层模块中参数设置需要注意的地方,顶层模块参数设置代码如下:

34  //parameter define
35  parameter SLAVE_ADDR = 7'h3c ; //OV5640的器件地址7'h3c
36  parameter BIT_CTRL   = 1'b1           ; //OV5640的字节地址为16位 0:8位 1:16位
37  parameter CLK_FREQ   = 27'd50_000_000 ; //i2c_dri模块的驱动时钟频率 
38  parameter I2C_FREQ   = 18'd250_000    ; //I2C的SCL时钟频率,不超过400KHz

在代码的第35行定义了OV5640的器件地址,其器件地址为7’h3c;第36行定义了寄存器地址的位宽,BIT_CTRL=0表示地址位宽为8位,BIT_CTRL=1表示地址位宽为16位。因为OV5640的地址位宽为16位,所以BIT_CTRL设置为1。 下面是顶层模块里锁相环例化部分:

82  //锁相环
83  pll u_pll(
84      .areset             (~sys_rst_n),
85      .inclk0             (sys_clk),
86              
87      .c0                 (clk_100m),
88      .c1                 (clk_100m_shift),
89      .c2                 (clk_50m_lcd),
90      .locked             (locked)
91      );

在代码的第89行输出了一个50Mhz的时钟clk_50m_lcd,作为LCD顶层模块和I2C驱动模块(i2c_dri)的驱动时钟。 为了适配现有的RGB LCD屏幕,我们对I2C配置模块的端口部分进行了修改:

104 //I2C配置模块
105 i2c_ov5640_rgb565_cfg u_i2c_cfg(
106     .clk                (i2c_dri_clk),
107     .rst_n              (rst_n),
108             
109     .i2c_exec           (i2c_exec),
110     .i2c_data           (i2c_data),
111     .i2c_rh_wl          (i2c_rh_wl),        //I2C读写控制信号
112     .i2c_done           (i2c_done), 
113     .i2c_data_r         (i2c_data_r),   
114                 
115     .cmos_h_pixel       (cmos_h_pixel),     //CMOS水平方向像素个数
116     .cmos_v_pixel       (cmos_v_pixel) ,    //CMOS垂直方向像素个数
117     .total_h_pixel      (total_h_pixel),    //水平总像素大小
118     .total_v_pixel      (total_v_pixel),    //垂直总像素大小
119         
120     .init_done          (cam_init_done) 
121     );   

在本实验中,cmos_h_pixel、cmos_v_pixel这两个配置需要依据LCD尺寸的大小而改变。此外,total_h_pixel及total_v_pixel的参数也需要进行配置,它们会影响到输出图像的帧率。 在顶层模块中例化了图像尺寸配置模块(picture_size),它输出了上一段提到的四个变量的具体数值:

93  //摄像头图像分辨率设置模块
94  picture_size u_picture_size (
95      .clk                (clk_50m_lcd   ),
96      .rst_n              (rst_n         ),
97      .id_lcd             (lcd_id        ),   //LCD的ID,用于配置摄像头的图像大小 
98      .cmos_h_pixel       (cmos_h_pixel  ),   //摄像头水平方向分辨率 
99      .cmos_v_pixel       (cmos_v_pixel  ),   //摄像头垂直方向分辨率 
100     .total_h_pixel      (total_h_pixel ),   //用于配置HTS寄存器
101     .total_v_pixel      (total_v_pixel ),   //用于配置VTS寄存器
102     .sdram_max_addr     (sdram_max_addr)    //sdram读写的最大地址
103     );

模块内部的代码如下:

1   module picture_size (
2       input              rst_n         ,
3       input              clk           ,         
4       input       [15:0] id_lcd        ,
5               
6       output reg  [12:0] cmos_h_pixel  ,
7       output reg  [12:0] cmos_v_pixel  ,   
8       output reg  [12:0] total_h_pixel ,
9       output reg  [12:0] total_v_pixel ,
10      output reg  [23:0] sdram_max_addr
11  );
12  
13  //parameter define
14  parameter  ID_4342 =   16'h4342;
15  parameter  ID_7084 =   16'h7084;
16  parameter  ID_7016 =   16'h7016;
17  parameter  ID_1018 =   16'h1018;
18  
19  //*****************************************************
20  //** main code 
21  //*****************************************************
22  
23  //配置摄像头输出尺寸的大小
24  always @(posedge clk or negedge rst_n) begin 
25      if(!rst_n) begin
26          cmos_h_pixel <= 13'b0;
27          cmos_v_pixel <= 13'd0;
28          sdram_max_addr <= 23'd0;        
29      end 
30      else begin    
31          case(id_lcd ) 
32              16'h4342 : begin
33                  cmos_h_pixel   = 13'd480;    
34                  cmos_v_pixel   = 13'd272;
35                  sdram_max_addr = 23'd130560;
36              end 
37              16'h7084 : begin
38                  cmos_h_pixel   = 13'd800;    
39                  cmos_v_pixel   = 13'd480;           
40                  sdram_max_addr = 23'd384000;
41              end 
42              16'h7016 : begin
43                  cmos_h_pixel   = 13'd1024;    
44                  cmos_v_pixel   = 13'd600;           
45                  sdram_max_addr = 23'd614400;
46              end    
47              16'h1018 : begin
48                  cmos_h_pixel   = 13'd1280;    
49                  cmos_v_pixel   = 13'd800;           
50                  sdram_max_addr = 23'd1024000;
51              end 
52          default : begin
53                  cmos_h_pixel   = 13'd800;    
54                  cmos_v_pixel   = 13'd480;           
55                  sdram_max_addr = 23'd384000;
56          end
57          endcase
58      end    
59  end 
60  
61  //对HTS及VTS的配置会影响摄像头输出图像的帧率
62  always @(*) begin
63      case(id_lcd)
64          ID_4342 : begin 
65              total_h_pixel = 13'd1800;
66              total_v_pixel = 13'd1000;
67          end 
68          ID_7084 : begin  
69              total_h_pixel = 13'd1800;
70              total_v_pixel = 13'd1000;
71          end 
72          ID_7016 : begin  
73              total_h_pixel = 13'd2200;
74              total_v_pixel = 13'd1000;
75          end 
76          ID_1018 : begin 
77              total_h_pixel = 13'd2570;
78              total_v_pixel = 13'd980;
79          end 
80      default : begin
81              total_h_pixel = 13'd1800;
82              total_v_pixel = 13'd1000;
83      end 
84      endcase
85  end 
86  
87  endmodule  

我们通过组合逻辑对变量进行赋值,在代码的第31至第59行,对摄像头输出图像尺寸相关的参数(cmos_h_pixel、cmos_v_pixel)进行了配置。同时还配置了一帧图像在SDRAM里的结束缓存地址sdram_max_addr,它是cmos_h_pixel、cmos_v_pixel的乘积。 在代码的61至85行,对影响帧率的参数total_h_pixel、total_v_pixel进行了配置。 在顶层代码例化SDRAM顶层模块的170和179行,我们进行了修改。如下所示,SDRAM顶层模块的wr_max_addr与rd_max_addr端口和sdram_max_addr信号直连。

158  //SDRAM 控制器顶层模块,封装成FIFO接口
159  //SDRAM 控制器地址组成: {bank_addr[1:0],row_addr[12:0],col_addr[8:0]}
160  sdram_top u_sdram_top(
161  .ref_clk      (clk_100m),                   //sdram 控制器参考时钟
162  .out_clk      (clk_100m_shift),             //用于输出的相位偏移时钟
163  .rst_n        (rst_n),                      //系统复位
164                                              
165   //用户写端口 
166  .wr_clk       (cam_pclk),                   //写端口FIFO: 写时钟
167  .wr_en        (wr_en),                      //写端口FIFO: 写使能
168  .wr_data      (wr_data),                    //写端口FIFO: 写数据
169  .wr_min_addr  (24'd0),                      //写SDRAM的起始地址
170  .wr_max_addr  (sdram_max_addr),             //写SDRAM的结束地址
171  .wr_len       (10'd512),                    //写SDRAM时的数据突发长度
172  .wr_load      (~rst_n),                     //写端口复位: 复位写地址,清空写FIFO
173                                              
174   //用户读端口 
175  .rd_clk       (clk_lcd),                    //读端口FIFO: 读时钟
176  .rd_en        (rd_en),                      //读端口FIFO: 读使能
177  .rd_data      (rd_data),                    //读端口FIFO: 读数据
178  .rd_min_addr  (24'd0),                      //读SDRAM的起始地址
179  .rd_max_addr  (sdram_max_addr),             //读SDRAM的结束地址
180  .rd_len       (10'd512),                    //从SDRAM中读数据时的突发长度
181  .rd_load      (~rst_n),                     //读端口复位: 复位读地址,清空读FIFO

在顶层模块代码的最后,例化了LCD顶层模块(lcd),如下所示:

207 //LCD顶层模块
208 lcd_rgb_top  u_lcd_rgb_top(
209     .sys_clk                (clk_50m_lcd  ),
210     .sys_rst_n             (rst_n ),
211     .sys_init_done          (sys_init_done),        
212                         
213     //lcd接口 
214     .lcd_id                (lcd_id),                //LCD屏的ID号 
215     .lcd_hs                (lcd_hs),                //LCD 行同步信号
216     .lcd_vs                (lcd_vs),                //LCD 场同步信号
217     .lcd_de                (lcd_de),                //LCD 数据输入使能
218     .lcd_rgb               (lcd_rgb),               //LCD 颜色数据
219     .lcd_bl                (lcd_bl),                //LCD 背光控制信号
220     .lcd_rst               (lcd_rst),               //LCD 复位信号
221     .lcd_pclk              (lcd_pclk),              //LCD 采样时钟
222     .lcd_clk               (lcd_clk),               //LCD 驱动时钟
223     //用户接口 
224     .out_vsync             (rd_vsync),              //lcd场信号
225     .h_disp                (),                      //行分辨率 
226     .v_disp                (),                      //场分辨率 
227     .pixel_xpos            (),
228     .pixel_ypos            (),       
229     .data_in               (rd_data),               //rfifo输出数据
230     .data_req              (rd_en)                  //请求数据输入
231     );   

LCD顶层模块里例化了读ID模块(rd_id)、分频模块(clk_div)、LCD驱动模块(lcd_driver),如下所示:

1   module lcd_rgb_top(
2       input           sys_clk      ,  //系统时钟
3       input           sys_rst_n,      //复位信号 
4       input           sys_init_done, 
5       //lcd接口 
6       output          lcd_clk,        //LCD驱动时钟 
7       output          lcd_hs,         //LCD 行同步信号
8       output          lcd_vs,         //LCD 场同步信号
9       output          lcd_de,         //LCD 数据输入使能
10      inout  [15:0]   lcd_rgb,        //LCD RGB颜色数据
11      output          lcd_bl,         //LCD 背光控制信号
12      output          lcd_rst,        //LCD 复位信号
13      output          lcd_pclk,       //LCD 采样时钟
14      output  [15:0]  lcd_id,         //LCD屏ID 
15      output          out_vsync,      //lcd场信号 
16      output  [10:0]  pixel_xpos,     //像素点横坐标
17      output  [10:0]  pixel_ypos,     //像素点纵坐标 
18      output  [10:0]  h_disp,         //LCD屏水平分辨率
19      output  [10:0]  v_disp,         //LCD屏垂直分辨率 
20      input   [15:0]  data_in,        //数据输入 
21      output          data_req        //请求数据输入
22      
23      );
24  
25  //wire define
26  wire  [15:0] lcd_rgb_565;           //输出的16位lcd数据
27  wire  [15:0] lcd_rgb_o ;            //LCD 输出颜色数据
28  wire  [15:0] lcd_rgb_i ;            //LCD 输入颜色数据
29  //*****************************************************
30  //** main code
31  //***************************************************** 
32  //将摄像头16bit数据输出
33  assign lcd_rgb_o =lcd_rgb_565 ;          
34  
35  //像素数据方向切换
36  assign lcd_rgb = lcd_de ?  lcd_rgb_o :  { 
        16{ 
        1'bz}};
37  assign lcd_rgb_i = lcd_rgb;
38              
39  //时钟分频模块 
40  clk_div u_clk_div(
41      .clk                    (sys_clk  ),
42      .rst_n                  (sys_rst_n),
43      .lcd_id                 (lcd_id   ),
44      .lcd_pclk               (lcd_clk  )
45      );  
46  
47  //读LCD ID模块
48  rd_id u_rd_id(
49       

标签: 7p8pin连接器21pin翻盖连接器数码fpc连接器fpc补强连接器d40传感器wl1260单点式传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台