基于CCD的FPGA图像采集控制系统设计.docx
- 文档编号:30301159
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:23
- 大小:1.57MB
基于CCD的FPGA图像采集控制系统设计.docx
《基于CCD的FPGA图像采集控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于CCD的FPGA图像采集控制系统设计.docx(23页珍藏版)》请在冰豆网上搜索。
基于CCD的FPGA图像采集控制系统设计
基于CCD的FPGA图像采集控制系统设计
----IIC从设备接口协议的VerilogHDL模拟
摘要:
标准CCD图像采集系统除了标准图像输出端口外还需预留与后端数字图像处理控制器之间通讯接口。
目前常见的通讯接口有串口、SPI、IIC等通信接口。
本文采用通过FPGA设计一个以IIC协议通讯的从设备接口,以便实现CCD图像采集器与图像处理器之间的通信。
本课题采用VerilogHDL硬件描述语言,以FPGA为载体来实现IIC总线控制器的设计。
课题组首先研究了IIC总线的规范,针对传统IIC总线接口的FPGA设计可重用性不高的问题,设计了一种基于FPGA的可配置IIC总线接口设计方案。
该方案采用同步有限状态机设计方法和硬件描述语言VerilogHDL,对IIC总线的数据传输时序进行模块化设计。
重点介绍了IIC控制器的总体设计方案,详细描述了时序状态机的工作原理和VerilogHDL语言的实现。
采用了自顶向下的设计方法,利用了VerilogHDL语言的结构描述风格,把整个设计拆分为6个模块,时钟分频模块,寄存器组模块,数据接收模块,数据发送模块,缓冲输出模块,时序控制模块,顶层模块也采用硬件描述语言设计。
因此,基于FPGA的I2C总线设计为数字图像处理电路设计硬软件方面打下了坚实的基础。
关键词:
CCD采集;FPGA;IIC总线接口;VerilogHDL;设计
1.前言
常见的视频采集系统主要有两种,一种是基于微处理器如单片机、ARM等的视频采集卡,其特点是结构简单,易于实现。
缺点是,无法实时地对视频数据完成处理,需要使用外部处理器来完成特定的视频处理算法,因而成本高,升级维护难度大;另一种是基于主从处理器FPGA+CCD或者CMOS等的嵌入式视频采集卡,特点是系统高度集成,易于维护升级,可以满足视频采集的需求,同时可以完成特定的视频算法,成本较低。
目前市场上主流的嵌入式设备主要有单片机微处理器、DSP等,但FPGA以其独有的高抗干扰性、高安全性正在逐步取得开发公司的青睐,在FPGA平台开发I2C势在必行。
并且利用EDA工具设计芯片实现系统的功能,已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。
模块化的设计思想在软件设计过程中越来越被重视。
I2C总线是Philips公司推出的双向两线串行通讯标准,具有接口线少、通讯效率高等特点。
此外,在嵌入式系统开发中越来越多的应用到FPGA,而一些嵌入式CPU,比如STM32为了降低成本,减小封装尺寸,没有外接专门的CPU读写总线,而只提供了一些如SPI和I2C的接口。
而且在应用中经常有数据要配置到FPGA中,如FPGA中的应用配置寄存器,和配置表项,图像传感器中对比度、亮度的设置、白平衡等的设置,都需要CPU配置。
这些数据的数据量不大,速度也不要求很高,很适合用I2C总线来配置。
IIC总线的连线少,具有结构简单,可不用专门的母板和插座直接用导线互连各个设备,因而可大大简化系统的硬件设计。
许多半导体厂商都引进了此项总线技术,并推出了不少带IIC总线接口的芯片。
已有不少文献讨论了IIC总线接口的单片机编程技术,本文着眼于基于CCD的FPGA图像采集系统中IIC用户交互接口的设计,介绍了一种基于FPGA的IIC总线接口驱动的实现方法。
通常,从图像传感器的制作工艺上分,图像采集主要有两种工艺,一种是CCD,另一种是CMOS。
CCD是集成在半导体单晶硅材料上,而CMOS是集成在互补金属氧化物半导体材料上。
从图像传感器的架构上分:
CCD的曝光由XSG1、XSG2及XSUB控制,读出由XH1、XH2、XV1、XV2、XV3、XV4控制,这些信号都来自DSP,因此CCD是被动器件;而CMOS的曝光及读出,都来自于芯片内部的时基生成模块,因此CMOS是主动器件。
从彩色滤光阵列来看,一般的CCD使用互补色CMYG的滤光阵列,而CMOS使用原色RGB的滤光阵列。
CMYG阵列对光线的衰减少,但是色彩延时不如RGB的阵列丰富,因此更加适合于对光灵敏度要求高的安防行业。
然而近年来出现的MCCD既不是CMOS又不是CCD,它汲取了CMOS与CCD的特点,MCCD使用CMYG互补色滤光阵列,具有如CCD一样的画质,比CCD高的可见光灵敏度及超高的红外光灵敏度、更大的动态范围。
MCCD使用与CCD兼容的曝光、读出控制方式(使用XSUB、XSG1、XH1、XH2、XV2、XV4信号),因此MCCD是与CCD相同的被动器件。
MCCD利用CMOS工艺集成度高的特点,将先进的图像信号处理器及AFE的功能集成到芯片中,有效提高了图像质量。
图1基于DSP的CCD驱动器设计图
由于CIS集成度优势,使得CIS相比于CCD拥有更丰富的接口种类。
目前监控用CIS不仅能够输出RGB,YUV,CCIR656等数字信号,而且可以输出PAL/NTSC制式的模拟电视信号,既满足传统的CCTV应用,也能满足诸如IPCamera等数字应用。
此外CIS还提供I2C控制接口,便于外部MCU对CIS的控制。
CCD图像传感器本身只能输出模拟电信号,如果要增加各种接口,就需要“套片”(FPGA)配合使用。
现在大多数监控专用CIS产品在现有接口基础上,创新性提供了MasterI2C接口和模拟差分电视信号接口。
MasterI2C接口使客户将调试最佳图像效果参数存于I2C接口EEROM中,等CIS上电则读取EEROM中的参数并自行配置到最佳效果,可见如图2所示,基于PFGA的IIC驱动的设计在工程实践中具有极大的指导意义,在工程实际应用和CCD驱动电路设计方面打下了坚实的基础。
图2基于FPGA的CCD驱动器设计图
2.IIC通讯总线基础理论
2.1IIC总线的基本原理
IIC总线的系统结构如图3所示。
IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,IIC总线上并接的每一模块电路既是主控器,又是发送器,这取决于它所要完成的功能[1]。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别如对比度、亮度等及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
图3IIC总线的系统结构图
IIC(Inter-IntegratedCircuit)总线最早是由PHILIPS公司开发的两线式串行通信总线,主要用于连接微控制器及其外围设备。
IIC总线的最主要的优点是其简单性和有效性[2]。
由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
另外,IIC总线支持线与逻辑,即支持多个从设备同时挂在同一总线上,主设备根据不同的从设备地址可实现对不同从设备的访问。
IIC总线在传送数据过程中共有三种类型信号,它们分别是开始信号、结束信号和应答信号。
开始信号的特点是SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号的标志是SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据为应答信号。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了IIC接口。
常见带有IIC接口的单片机有C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列AVR等[3]。
很多外围器件如存储器、监控芯片等也提供IIC接口。
IIC规程运用主或从双向通讯。
器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。
主器件和从器件都可以工作于接收和发送状态。
总线必须由主器件,通常为微控制器控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。
SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件,参见图4。
图4串行总线上的数据传送顺序图
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010,接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作,如图5所示。
1
0
1
0
A2
A1
A0
W/R
图5控制字节配置图
IIC总线共有两根信号线,数据线SDA及时钟线SCL,两根信号线都是双向线路,其中SDA线上的数据方向可为主设备到从设备,也可为从从设备到主设备,SCL通常由主设备产生,但从设备在忙状态时可将SCL拉低,从而使主机保持等待状态,等从设备忙完时再释放SCL。
由于IIC设备的接口电路通常都是集电极开路或漏极开路(OC/OD)门电路,所以一般都通过一个电流源或上拉电阻连接到正的电源电压上。
IIC总线上的数据传输速率在标准模式下可达100Kbit/s,在快速模式下可达400Kbit/s,在高速模式下可达3.4Mbit/s。
连接到总线的接口数量只受总线电容最大400pF的限制[4]。
在IIC总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的所有器件的逻辑“与”完成的。
SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号变为低电平,将使SCL线上所有器件开始并保护低电平期。
此时,低电平周期短的器件的时钟由低至高的跳变并不影响SCL线的状态,这些器件将进入高电平等待的状态。
当所有器件的时钟信号都变为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。
其后,第一个结束高电平期的器件又将SCL线拉成低电平。
这样就在SCL线上产生一个同步时钟。
可见,时钟低电平时间由时钟低电平期最长的器件决定,而时钟高电平时间由时钟高电平期最短的器件决定[5]。
IIC总线时序如图6所示,IIC数据传输时关键是有一个START条件和一个STOP条件,并且每来一个时钟传输一个数据。
主机产生一个START条件启动一次新的与从机之间的数据传输。
SCL保持高电平期间,SDA由高电平到低电平的跳变将产生一个START条件,实际时序如图6所示。
主机产生一个STOP条件以终止与从机之间的数据传输。
SCL保持高电平期间,SDA由低电平到高电平的跳变将产生一个STOP条件,实际时序如图6所示。
重复START条件同普通START条件一样,该条件通常表示对一个特定的存储地址反复读写。
写位时SDA的跳变只能发生在SCL的低平期间,在整个SCL脉冲为高电平以及所要求的建立、保持时间内,SDA上的数据必须保持有效且不变,如图6所示。
读位时主机应在读数期间释放SDA总线,并在SCL的下一个上升沿之前保持适当的建立时间,在前一个SCL脉冲的下降沿,器件将每一位数据通过SDA移出,并在当前SCL脉冲的上升沿保持数据位有效[6]。
图6IIC数据传输时序图
图6中的ACK为应答信号,接收数据的器件在第9位期间发送0表示正确接收到数据,读操作期间的主机或者是写操作期间的从机,同时主机应在读取最后一个字节后发送NACK,终止通信,使从机将SDA的控制权交还给主机。
2.2IIC模块设计与实现
图7IIC模块结构
IIC模块结构如图7虚线框内所示,主要包括以下三个部分。
分频:
IIC通信的最大工作频率为400kHz,而FPGA锁相环输出时钟一般较大,因此需要分频到较低工作时钟。
数据寄存器:
本模块主要是对读到的和需要写入的时间信息进行整合,使得该信息按规定格式传输。
IIC总线接口控制模块:
本模块是设计的核心,实现IIC通信协议,产生读写时序,完成数据交互功能。
介绍下硬件模块总体设计思想:
本IIC模块实现的主要功能是完成并行数据与串行数据的转换,在转换过程中串行数据的输入与输出必须满足IIC总线规范[7]。
图7为IIC总线接口框图,主要包括以下几个单元。
分频器:
由FPGA的锁相环输出的稳定时钟信号,由于频率很高所以必须经过分频模块输出满足IIC总线要求的数据传输速率。
IIC总线接口控制时序逻辑块:
IIC总线数据传输的所有时序控制逻辑都由它产生,是这个IIC模块的核心。
数据锁存器:
根据读写使能信号(r/w)存储IIC己接收的或待发送的数据[8]。
移位寄存器:
在时序控制逻辑模块的控制下根据读写使能信号(r/w)对数据进行正确地处理。
2.3IIC总线的读写操作
IIC总线的写操作如图8所示。
S:
STARTA条件;A:
ACKNOWLEDGE;P:
STOP条件;wordAddress(n):
即为存储地址,该地址为首地址,当器件收到该地址后,依次往后写数据。
图8IIC总线的写操作
IIC总线的读操作如图9所示。
S:
STARTA条件;Sr:
重复START条件;A:
ACKNOWLEDGE;A:
NOTACKNOWLEDGE;P:
STOP条件;wordAddress(n):
即存储地址,该地址为首地址,当器件收到该地址后,地址依次往后自加1。
图9IIC总线的读操作
2.4VerilogHDL语言
VerilogHDL(HardDescriptionLanguage)是硬件描述语言的一种,用于数字电子系统设计,该语言允许设计者进行各种级别的逻辑设计,进行数字逻辑系统的仿真验证、时序分析、逻辑综合。
据统计,目前在美国硅谷约有90%以上的ASIC和FPGA已经采用Verilog硬件描述语言方法进行设计。
在进行FPGA的开发时,利用EDA工具设计芯片实现系统的功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。
模块化的设计思想在软件设计过程中越来越被重视[9]。
目前针对IIC总线的相关开发的资料都是利用VHDL语言或AHDL语言实现的。
由于Verilog相比VHDL等其它硬件描述语言具有代码量少、支持自动类型转换、对于初学者来说比较容易入门等优点,故本文选择Verilog语言作为基于FPGA的IIC通讯总线的驱动设计语言。
3.基于FPGA的IIC通讯总线驱动设计
3.1IIC总线接口模块结构设计
IIC总线接口结构设计如图10所示,主要包括内部分频器和IIC总线接口控制时序逻辑模块两部分。
内部分频器:
通常FPGA的外部输入时钟频率比较高,例如50MHz,所以必须经过内部的分频器输出符合I2C总线要求的数据传输速率标准模式100kbit/s,快速模式400kbit/s,才能满足IIC总线数据传输的时序要求[10]。
图10IIC总线接口模块结构框图
IIC总线接口控制时序逻辑模块:
此部分是IIC总线接口模块的控制核心,IIC总线数据传输的所有时序控制逻辑都由它产生,例如,启动信号和停止信号的产生,对从器件的寻址,总线上数据的发送和接收。
同时,其内部集成数据锁存器和移位寄存器,其中,数据锁存器主要用于暂存发送的数据、地址和控制信息和接收数据,移位寄存器主要用于对发送的数据进行并/串转换,然后发送到数据线SDA上,或者从数据线SDA上接收的数据进行串/并转换,然后由主机进行接收[11]。
3.2IIC总线端口映射及功能说明
IIC总线端口映射及功能如表1所示。
由图10和表1可知,本文设计的IIC总线接口模块能够实现数据传输的两种基本数据操作模式即单字节数写模式和单字节数据读模式[12]。
表格1IIC总线端口映射及功能说明
端口名
功能说明
端口
功能说明
Clk
FPGA外部输入时钟
Rst
总线接口模块复位信号,0为有效
Clk_Type
SCL输出时钟模式:
0为标准模式,1为快速模式
Done
当主机对从机完成一次读写操作时,该信号出现下降沿,否则为高电平
Rd/Wr
读写控制信号,1为主机从从机读取数据,0为主机向从机写入数据
Ack
从机对主机的回应信号
Machine_Addr[6:
0]
从机器件的唯一地址标识符
AckCounter[2:
0]
主机接收从机应答信号计数器
Inter_Addr[7:
0]
从机器件要进行操作的存储单元地址
SDA
IIC总线接口数据线
SCL
IIC总线接口时钟线
Data_Send[7:
0]
主机向从机发送的字节数据
Start
接口模块读写操作启动信号,下降沿有效
Data_Rece[7:
0]
主机接收从机的字节数据
由于该模块提供读写前、读写过程中和完成后的相应的标志信息(Start、Inter_Addr,Done、Ack、AckCounter),所以,主机能够根据这些信息判断是否进行下一字节数据的读写操作,从而实现从机内部连续存储单元的读写操作,最终实现IIC总线数据传输的4种操作模式,分别为单字节数据写、单字节数据读、多字节数据连续写、多字节数据连续读[13]。
例如,多字节数据连续写模式,当主机通过该总线接口对从机成功完成一次写操作后,Done端口会现下降沿脉冲,主机检测到该信号后,这时只要配置好Clk_Type、Rd/Wr、Start、Ma⁃chine_Addr[6:
0]、Inter_Addr[7:
0]、Data[7:
0]这些信号,即可进行相邻地址单元的数据存储,直到写入完指定数据长度的字节数据为止。
至于连续读写多少数据,由主机控制程序决定,从而避免了从器件连续读写操作传统模式数据长度的限制。
3.3IIC总线接口模块的VerilogHDL设计
IIC总线接口时钟SCL信号产生,本系统设计的时钟信号SCL有两种输出频率100kHz和400kHz,通过主机输入信号Clk_Type进行选择确定,当其为1时,SCL输出频率为100kHz,当其为0时,SCL输出频率为400kHz。
时钟信号SCL的产生是将FPGA外部输入时钟信号经过分频计数器而得到所需要的信号。
系统产生100kHz的时钟信号所用的分频计数器常数为249,而400kHz的时钟信号所用的分频计数器常数为62。
此外,对IIC总线接口控制时序逻辑模块进行设计时,需要对时钟线SCL一个完整周期内的上升沿SCL_POS、下降沿SCL_NEG、时钟周期高电平部分的中间时刻SCL_HIGH、时钟周期低电平部分的中间时刻SCL_LOW这些信号进行正确检测,才能设计出符合IIC总线协议规范的逻辑控制时序。
所以,还要利用本分频计数器产生SCL_POS、SCL_HIGH、SCL_NEG、SCL_LOW这4种脉冲信号[14]。
本系统在FPGA外部始终为25MHz时,用VerilogHDL对时钟分频计数器进行设计工作。
其产生100kHz的SCL信号的主要VerilogHDL代码如下:
/*-------------------100kHz_Counter--------------------*/
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
cnt2<=8’d0;
elseif(cnt2==8’d249)
cnt2<=8’d0;
else
cnt2<=cnt2+8’d1;//cnt2为分频得到100kHz计数
//--------IIC_SCL-----------------------------------//
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
begin
scl_r<=1’b0;
SCL_NEG<=1’b0;
SCL_LOW<=1’b0;
SCL_POS<=1’b0;
SCL_HIG<=1’b0;//复位值
end
elseif(cnt2==8’d62)//SCL高电平中间时刻,用于数据采样
SCL_HIG<=1’b1;//持续一个时钟周期的高电平
Elseif(cnt2==8’d124)//SCL下降沿
scl_r<=1'b0;
elseif(cnt2==8’d128)//SCL下降沿滞后稍许时刻
SCL_NEG<=1’b1;//持续一个时钟周期的高电平
Elseif(cnt2==8’d186)//SCL低电平中间时刻,用于数据发送
SCL_LOW<=1’b1;//持续一个时钟周期的高电平
Elseif(cnt2==8’d245)//SCL上升沿提前稍许时刻
SCL_POS<=1’b1;//持续一个时钟周期的高电平
Elseif(cnt2==8’d249)//SCL上升沿
scl_r<=1’b1;
else
begin
scl_r<=scl_r;//保持占空比为1/2的方波
SCL_HIG<=1’b0;//持续一个时钟周期的高电平,然后为0
SCL_NEG<=1’b0;//持续一个时钟周期的高电平,然后为0
SCL_LOW<=1’b0;//持续一个时钟周期的高电平,然后为0
SCL_POS<=1’b0;//持续一个时钟周期的高电平,然后为0
end
assignscl=scl_r;//SCL为IIC的时钟
/***************************************************************/
3.4IIC总线接口数据传输中的基本功能模块设计
3.4.1主机产生启动信号设计
当IIC接口模块检测到主机发送过来的有效START信号后,该模块由空闲状态转入到产生IIC接口模块启动信号状态,然后检测SCL是否处于高电平状态,如是,则置SDA由高电平转为低电平状态,即可产生该模块的启动信号。
该模块的主要设计代码如下:
If(SCL_HIG)
Begin//sc为高电平期间,拉低数据线sda,产生启动信号
sda_link<=1’b1;//数据线sda为output
sda_r<=1’b0;//拉低数据线sda,产生启动信号
cstate<=ADD1;//转入ADD1工作状态
end
else
cstate<=START1;//等待scl高电平中间位置到来
3.4.2主机产生停止信号设计
当主机不需要向从机发送数据或从从机接收数据时,在应答信号产生后,即可转到终止数据传输状态,然后检测SCL是否处于高电平状态,如是,则置SDA由低电平转为高电平状态,即可产生该模块的停止信号。
该模块的主要VerilogHDL代码如下:
sda_link<=1’b1;
if(SCL_LOW)
begin
sda_r<=1’b0;//scl为低时,置sda为低电平状态
cstate<=STOP1;//转入工作状态STOP1
end
elseif(SCL_HIG)
begin
sda_r<=1’b1;//scl为高时,sda产生上升沿(结束信号)
cstate<=IDLE;//转入工作状态IDLE
end
3.4.3主机发送和接收一个字节数据设计
由于IIC是串行数据传输总线,主机要发送个字节的数据,必须将字节数据经过并串转换,然后在时钟线SCL的作用下将每一个BIT位发送到数据线SDA上。
主机要接收一个字节的数据,必须将数据线SDA上每个数据位经过串并转换,组合成一个字节的数据,供主机进行接收和处理。
该模块的VerilogHDL主要代码如下(以写操作为例):
//主机进行单字节写操作或读操作
if(Byte_Write)
begin//写操作
sda_link<=1'b1;
if(nu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 CCD FPGA 图像 采集 控制系统 设计