计算机系统论文嵌入式系统数字图像采集接口电路设计(2)
通过上述方法可以检测出场的起始位置和行起始位置。
4、用VHDL设计锁存器
在应用中,以上两个锁存器的功能和其他逻辑集中在一起,用可编程逻辑器件实现。下面分别为它们的VHDL表示。
设DO(0-7)是锁存器输出端,DI(0-7)是锁存器输入端,DM(0-7)是中间状态,Data_R是数据读信号(低电平时有效),则数据锁存器的VHDL描述为:
Process (reset, PCLK) -- 锁存图像数据
Begin
If reset='0' then
DM<="00000000"; -- 清除数据
Else if PCLK'event and PCLK='1' then
DM<=DI; -- 锁存数据
End if;
End process;
Process (DM, Data_R) -- 读取图像数据
Begin
If Data_R='0' then
DO<=DM; -- 输出图像数据
Else
DO<="ZZZZZZZZ" -- 输出高阻
End if;
End process;
进一步设数据有效状态为Dstatus, 状态读写信号为Status_R (低点平时有效),则状态锁存器的VHDL描述为:
Process (reset, PCLK,Data_R) -- 数据有效状态控制
Begin
If reset='0' or Data_R='0' then
Dstatus<='0'; -- 清除状态
Else if PCLK'enent and PCLK='1' then
Dstatus<='1'; -- 设置状态
End if;
End process;
Process (Dstatus, Status_R) --读取状态和同步信号
Begin
If Status_R='0' then
DO0<=Dstatus;
DO1<=VSYNC;
DO2<=HSYNC;
DO3<=FRAME;
Else
DO<="ZZZZZZZZ"; -- 高阻状态
End if;
End process;
四、内存直接写入接口设计
在处理器速度较慢且图像数据输出的频率不能降低的情况下,采用上述I/O接口方法不能得到完整的图像。另外,有些应用中要求能够实时采集图像。为此,我们设计了高速数据图像采集方法―内存直接写入法。由于SRAM访问控制简单,电路设计方便,被大量嵌入式系统采用,本文以SRAM作为存储器。
1、电路原理和结构
内存直接写入方法通过设计的图像采集控制器(以下简称控制器)不需处理器参与,直接将图像数据写入系统中的内存中,实现高速图像采集。
图5是接口结构图,当需要采集图像时,处理器向控制器发出采集请求,请求信号capture_r从高到低。控制器接到请求脉冲后,发出处理器挂起请求信号HOLD,使处理器的外总线处于高阻状态,释放出总线。控制器收到处理器应答HOLDA后管理总线,同时检测图像同步信号。当检测到图像开始位置时,控制器自动产生地址和读写控制信号将图像数据直接写入内存中。图像采集完成后,控制器自动将总线控制权交还处理器,处理器继续运行,控制器中与采集相关的状态复位。控制器可以根据同步信号或设定的采集图像大小确定采集是否完成。
在图5中,控制器包括同步信号检测、地址发生器、SRAM写控制器、总线控制器和处理器握手电路等主要部分。同步信号检测确定每一场(帧)和每一行的起始位置;地址发生器产生写SRAM所需的地址;SRAM写控制器产生写入时序;总线控制器在采集图像时管理总线,采集完成后自动释放;处理器握手电路接受处理器命令、发总线管理请求和应答处理器。
2、SRAM写控制时序
采集图像过程中,控制器自动将数据写入到硬件设定的内存中。写内存时,控制器产生RAM地址(A)、片选信号(/CS)、读信号(/RD)和写信号(/WD),同时锁存传感器输出的数据并送到数据总线(D)上。每写入一个数据后,地址(A)自动增1。采集时/CS保持有效(‘0’)状态而/RD处于无效状态(‘1’)。地址A的变化必须与/WD和数据锁存器协调好才能保证图像数据的有效性。
图6是控制器产生的SRAM信号时序图。用PCLK作为地址发生器的输入时钟,且在其上升沿更新地址值。同样,在PCLK的上沿锁存数据并输出到总线上。将PCLK反相,作为/WD信号,使得在/WD的上升沿地址和数据稳定,确保写入数据的有效性。
3、控制器主要功能的VHDL描述
描述控制器中全部功能的VHDL代码较长,而且有些部分是常用的(如计数器等)。图像采集状态产生和同步信号的检测是其中重要的部分。下面介绍这两部分的VHDL描述。
图像采集状态 capture_s:
处理器的采集请求信号capture_r使capture_s从‘0’到‘1’,场地址发生器(计数器)的溢出位vcount_o,清除capture_s。
process (capture_r, reset, vcount_o)
begin
if reset='0' or vcount_o='1' then
capture_s<='0'; -- 清除
转载请注明来自:http://www.uuqikan.com/jisuanjiyingyonglw/16630.html

