《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 设计应用 > 一种基于FPGA的AD9945驱动设计
一种基于FPGA的AD9945驱动设计
来源:微型机与应用2011年第18期
洪冰心, 郑力新
(华侨大学 信息科学与工程学院, 福建 厦门361021)
摘要: 介绍了AD9945高速CCD信号处理芯片,并对其工作流程进行了研究。分析了AD9945芯片内部各个驱动信号的作用及其时序关系,提出了结合FPGA运用VHDL硬件语言对该芯片的驱动信号进行编程的思想,最后通过QUARTUS II软件对程序进行时序仿真,并得到正确的仿真时序图,从而验证了这种编程思想的正确性。
关键词: FPGA AD9945 VHDL 驱动
Abstract:
Key words :

摘  要: 介绍了AD9945高速CCD信号处理芯片,并对其工作流程进行了研究。分析了AD9945芯片内部各个驱动信号的作用及其时序关系,提出了结合FPGA运用VHDL硬件语言对该芯片的驱动信号进行编程的思想,最后通过QUARTUS II软件对程序进行时序仿真,并得到正确的仿真时序图,从而验证了这种编程思想的正确性。
关键词: AD9945; FPGA; VHDL; 驱动

    随着计算机和通信技术的发展,机器视觉的应用更加广泛,而FPGA因具有高性能、高灵活性、低开发成本、低成本的结构化ASIC移植等优点,在机器视觉中发挥着越来越重要的作用。AD9945是一款12 bit的高速CCD信号处理芯片,最高频率可达到40 MHz,非常适用于处理高速CCD信号。
1 AD9945芯片简介[1]
    AD9945是一款高速CCD模拟信号处理芯片,最高频率可处理40 MHz的面阵CCD模拟信号。其信号链主要由相关双采样(CDS)、数控可变增益放大器(VGA)、黑色电平钳位、12位A/D转换器组成。
1.1 AD9945内部寄存器
    AD9945有4个内部寄存器,分别为工作寄存器、控制寄存器、暗电平钳制水平寄存器、VGA增益寄存器。4个寄存器可通过3线串行数字接口(SCK、SDATA、SL)进行编程。通过编程可改变增益、黑电平校正、输入时钟极性及掉电模式等。各个内部寄存器详细设置见其芯片手册[1]。
    对单个寄存器的赋值应满足其芯片时序图,并且注意4个寄存器应被连续写入,第一个寄存器的地址(最低的地址)被写入后,跟着写入一个测试位(置0)和4个12 bit的数据(不足12 bit的补0),其中地址位将跟着每一个12 bit的数据而自动增加。每一位SDATA的数据在SCK的上升沿被写入。在所有的寄存器的值写入期间,SL保持低电平,并且系统在SL上升沿后对寄存器的值进行更新。
1.2 AD9945工作流程
    对于来自CCD的输入信号, AD9945通过一个由0.1 μF的外部耦合隔直电容以及内置的高精度直流电平恢复电路,使CCD信号的直流分量保持在1.5 V左右,从而与3 V单电源输入的 AD9945相匹配。接着AD9945对CCD信号进行相关双采样处理,即对CCD信号采样两次以提取视频信息,这有效地防止了低频噪音。相关双采样发生在SHP(复位电平)和SHD(像元信号电平)的上升沿,这两个时钟信号是完成采样、发挥CCD性能的关键。然后AD9945可以通过10 bit的串行数字接口编程设置对CCD信号的增益进行调整,增益范围从6 dB~40 dB。其增益调整的公式为:VGA增益(dB)=(VGA代码值×0.035 dB)+5.3 dB。为了清除CCD信号链中残留的偏置并跟踪暗电平低频的变化,AD9945还设置了一个光学暗电平钳制反馈环。通过内部寄存器设置暗电平的参考值,并与ADC输出的实际暗电平的值进行比较。产生的误差信号经过数字滤波,通过一个D/A转换器反馈到ADC的输入。暗电平钳制脉冲CLPOB应处于有效的CCD光学暗电平期间。最后CCD信号通过一个12 bit的AD转换器输出,并且输出时延迟10像素时钟。
2 AD9945驱动设计
2.1 AD9945时序分析[1-2]

    AD9945要正常工作必须由时序发生器提供各种脉冲信号,以保证其内部寄存器能够正确赋值,双相关采样信号SHP和SHD时序应满足CCD信号要求以及CLPOB脉冲应处于有效的CCD光学暗电平期间。AD9945时序脉冲信号是一组周期性、关系较复杂的脉冲信号,它直接影响了对CCD信号的处理性能。本文设计的AD9945的时序包括三个部分:(1)3线串行数字接口(SCK、SDATA、SL),保证内部寄存器被正确赋值;(2)相关双采样信号SHP、SHD,确保采样的准确性;(3)光学暗电平钳制,减少钳制噪声。
    预设当CCD数据频率为40 MHz时,各个驱动信号的相位关系如表1所示。通过观察各驱动信号的相位表和时序图[1]可以得到:如果设t=T/8(T是驱动信号的周期),则SHP、SHD、DATACLK的脉冲宽度分别为2 t、2 t、4 t,并且SHP、SHD之间相位差为2 t。由于DATACLK上升沿必须处于SHD的上升沿与下一个SHP的下降沿之间,因此设DATACLK上升沿到SHP下降沿的相位为t。所以如果基准时钟信号的周期为t,根据上述分析的结果可以得到各个驱动信号。
    需要注意的是,表1中的各个驱动信号的相位关系是在CCD信号频率为40 MHz时的,如果CCD信号频率发生变化,各个驱动信号的频率也应该跟着变化。

2.2 AD9945驱动的程序设计[3]
    主控芯片选用现场可编程门阵列。FPGA可以通过QuartusII软件编程对其硬件结构和工作方式进行重构,从而使得硬件设计如同软件设计方便快捷。本设计主要使用VHDL语言来编写驱动程序。
    AD9945最高工作频率可以达到40 MHz,但是为了配合前端CCD提供的图像数据信号(CCD信号为10 MHz),把AD9945的工作频率设定为10 MHz(即SHP、SHD、DATACLK频率=10 MHz),这样与前端CCD信号达到同步。通过观察SHP、SHD、DATACLK之间的相位关系以及上文的时序分析,发现需要一个80 MHz的基准时钟(1/t=8/T),然后对基准时钟进行8分频,得到10 MHz的信号。然而FPGA的基准时钟信号是由一块50 MHz的有源晶振产生,要想得到需要的80 MHz的信号,就必须进行小数分频处理。选择利用FPGA内部的锁相环PLL完成8/5的小数分频[3-4]。
2.2.1 AD9945内部寄存器程序设计
    在AD9945对CCD信号进行采集之前,需要对其内部寄存器进行设置,使其工作在需要的状态下。此步骤需要对3线串行数字接口(SCK、SDATA、SL)进行编程。
    首先定义一个串行数据类型SPI=RAM_ARRAY,并赋初值,即是预计要向各个寄存器写入的值,总共52位(3位地址位+1位测试位+每个寄存器12位×4个寄存器=52位)。通过SPI对串行数据接口SDATA进行赋值,实现对内部寄存器的设置。
    然后编写程序产生串行数据输入时钟SCK,因为SCK是频率为10 MHz,占空比为1:1的方波,所以对80 MHz的基准时钟进行8进制计数div8=(0,1,2,3,4,5,6,7),当div8=0、1、2、3时,SCK为低电平。最后需要产生内部寄存器载入脉冲SL。定义一个52位的计数器CNT52,对SCK的脉冲计数52次(用于串行数据的写入)。计数期间SL置0,结束后置1,并且在此期间当每一个SCK上升沿到来时通过SPI对SDATA进行串行写入(共52次)。
2.2.2 AD9945采样时钟的程序设计

 


    通过对内部寄存器进行赋值,规定了AD9945的工作方式后,就可以编写程序设计AD9945的采样时钟SHP、SHD、DATACLK。其中DATACLK是数据像素同步时钟,必须与前端CCD信号严格匹配,在这里也是通过软件产生,实际验证过程中再根据具体情况进行调整。
    DATACLK占空比为1:1,所以当div8=0、1、2、3时DATACLK为低电平;SHP和SHD占空比都为3:1,但是SHP比SHD超前,所以当div8=1、2时,SHP为低电平;当div8=5、6时,SHD为低电平。
2.2.3 AD9945行钳制时钟输入
    通过观察CCD输出信号,发现CCD信号的有效像元之间夹杂着一些光学暗电平和一些空白像素,在此区间CCD是没有输出的。通过软件设计PBLK和CLPOB脉冲信号,使AD9945采集的结果更准确。
    设置CLPOB为20个像素时间宽度,而PBLK脉冲宽度的设置需要准确知道CCD空白像素的宽度,在此也是预设20个像素时间宽度,针对实际情况再进行调整。
2.3 驱动程序及仿真结果
    由于设计需要的频率较高,担心FPGA编程后的管脚输出达不到所需电压,波形也不尽如人意,所以设计通过反向器来提升FPGA的输出信号,使其达到AD9945的输入要求,同时可以对波形进行整形,这就要求在编写FPGA程序时,时序编写要反向设计,按照上述时序分析反逻辑编写。
    驱动电路实体端口定义如下:
entity ad9945 is
port(clk:    in std_logic;
     sck:     out std_logic;
     sdata:   out std_logic;
     sl:       out std_logic;
     shp:     out std_logic;
     shd:     out std_logic;
     dataclk: out std_logic;
     clpob:   out std_logic;     
     pblk:    out std_logic);
end entity ad9945;
    软件(QuartusII)仿真结果如图(图1~图3)。

 

    通过把仿真得到时序图与芯片要求的时序图进行比较,发现设计得到的驱动信号符合AD9945数据手册的要求,因此能正常驱动AD9945进行工作,完成对CCD信号的采集、处理。
参考文献
[1] ADI公司.AD9945芯片资料,2003.
[2] 常丹华.基于CPLD技术的CCD驱动时序产生方法[J].仪器技术和传感器,2001(3):26-28.
[3] 潘松,黄继业.EDA技术与VHDL(第二版)[M].北京:清华大学出版社,2007.
[4] 吴继华,王诚.Altera FPGA/CPLD设计(初级篇)[M].北京:人民邮电出版社,2010.

此内容为AET网站原创,未经授权禁止转载。