基于FPGA的线阵CCD子图像提取模块的设计与仿真

根据线阵CCD 图像检测和识别系统的要求 , 分析线阵CCD 图像与子图像的位置关系 , 采用“图像转置缓冲区”和读写状态机的处理方式 , 设计基于FPGA 的线阵CCD 子图像提取模块 , 具有FPGA 资源占用少、逻辑清晰的特点 。 用MATLAB 和Modelsim 软件进行联合仿真 , 验证了设计的正确性 。
0
在工业生产自动化系统中 , 通过计算机视觉和图像处理技术来实现产品的质量监测和控制 , 已逐渐成为一种有效的应用技术 。 线阵CCD 图像传感器广泛地应用于产品尺寸测量和分类、非接触尺寸测量、条形码、形态识别等众多领域 。 在图像检测系统中 , 应具备一个高速的子图像提取和输出模块 , 本文采用FPGA 器件EP3C25F256C8 和CCD 线阵图像传感器RL1024P,实现线阵CCD 图像检测系统中的子图像提取和输出功能 。
1 子图像提取模块的设计
子图像提取模块的功能可描述为:采用FPGA 器件实现 , 根据串行输入的黑白图像和同步信号 , 提取该图像中设定尺寸大小的子图像 。 假设输入图像大小为i * j,某一像素点的坐标位置为(X,Y) , 要取出子图像的大小为m * n,则用c 代码描述为:for(b=0;b<j ; b++){for (a=0;a<i; a++){ // 取出Xa,Yb 到 Xa+m,Yb+n 的子图像;} }
根据系统设计的要求 , 线阵CCD 图像采集模块采用串行的方式输出1×1024 像素的一行图像 , 子图像提取模块接收该图像数据、缓冲、再输出16×16 像素的子图像 。 子图像提取模块的外部端口 , 如图1 所示 。 主要信号有:像素同步时钟信号CCD_CLK、像素数据CCD_DATA、当前输入像素的坐标CCD_ADDR[90] ;另外 , N_RST 和SYS_CLK 为系统提供的复位信号和处理时钟信号 。 其中 , 每个CCD_CLK 的上升沿出现时CCD_DATA 像素有效 , 且该像素所在的位置为CCD_ADDR[90] 值 。
【基于FPGA的线阵CCD子图像提取模块的设计与仿真】

基于FPGA的线阵CCD子图像提取模块的设计与仿真

文章插图

为了实现每个CCD_CLK 周期内均输出一个子图像 , SYS_CLK应该为CCD_CLK 的10 倍左右 。
本文采用“图像转置缓冲区”的方法来实现子图像提取模块 。 “图像转置缓冲区”是一个按行写入(更新)、按列读出的一个RAM 缓冲区 。 在FPGA 内部设置一个1024 个单元的RAM 缓冲区 , 每个单元的位宽为16bits.线阵CCD 采集模块输出的线阵图像与子图像的关系 , 如图2 所示 。 其中 , 第0 行表示图像的当前行 , 第N 行为历史行 , 每行有1024 个像素 , 按照p0 至p1023 的像素顺序输出 。 假设当前CCD_CLK 输入的像素为第0行的p16 像素 , 则其对应的16X16 子图像为图中的阴影部分 。
基于FPGA的线阵CCD子图像提取模块的设计与仿真

文章插图

“图像转置缓冲区”RAM 块存储图像的结构 , 如图3 所示 。
RAM 块共有1024 个单元 , 每个单元为16 位的宽度 , 可存放最近的16 行图像数据 。 对比图2 和图3,可以发现 , RAM 块的地址编号相当于线阵CCD 图像的某一行像素的位置 , 某个RAM单元的位D15 ~ D0 对应某一列的最近16 个像素 , 相当于对线阵图像转置后再存放到RAM 块中 。 对RAM 缓冲区进行写操作时 , 由于线阵CCD 图像的数据是按行逐位输入的 , 每个CCD_CLK 时钟上升沿出现时 , 仅需更新RAM 缓冲区中当前像素对应的比特 , 因此在逻辑上是根据图像按行写入RAM 区的 。 在FPGA器件中 , 可设计一个状态机来实现“图像转置缓冲区”的读写操作 , 如图4 所示 。