对基于 FPGA 以及 NIOS 的图像采集与处理系统进行了深入研究,在完成硬件实验平台设计的基础上,完成了嵌入式操作系统的移植及应用程序的设计。以 PDF417 二维条码的识别为例,对识别过程及识别算法进行研究,并对所设计的系统进行测试,达到了较好的识别效果。

 

随着计算机技术和人工智能技术的快速发展,图像识别技术已成为人工智能的基础技术,它涉及的技术领域越来越广泛,应用越来越深入。随着现代工业生产向高速化、自动化方向的发展,以形状为特征的图像识别在现代生产中的应用日益增加,不论是材料、工业自动化、遥感技术,还是产品质检都需要对形状进行检测。因此,开发集图像信号的采集与处理于一体、具有高集成度、高保密性的图像处理系统将成为行业的发展趋势。此外,基于 32 bit 微处理器纯嵌入式系统的图像采集处理技术正处于方兴未艾阶段,发展前景广阔,可广泛应用于工业自动化生产、监护 / 防盗系统、机器人视觉等技术中。SoPC 技术是 Altera 公司提出的一种灵活、高效的 SoC 解决方案,是一种新的软硬件协同设计的系统设计技术。本系统就是在这种背景下提出的。其主要工作是设计一个实用的图像采集和处理平台,能完成目标图像的采集输入,并能对采集到的图像进行处理和识别。


1 系统整体方案及硬件设计

系统要求在 FPGA 片内利用 SoPC 技术实现便携式的图像采集与处理。它通过对原始图像的扫描,经数字图像处理与识别后即可将得到的大容量的承载信息(包括文字、头像、指纹等个人信息)在 LCD 上显示,并可通过 USB 接口将信息拷贝,或通过 RS-232 接口将信息上传给 PC 机,也可以通过 GPRS 将获得的信息方便快捷地发往数据中心作验证。


整个系统的核心部分是内嵌 Nios II 软核的 FPGA,外围设备和芯片包括图像获取设备、显示器及片外 SDRAM 和 FLASH 存储器、输入设备等。系统结构框图如图 1 所示。

 


系统的工作过程是:系统配置完成后,视频获取设备获取视频图像,每帧图像经模数转换生成图像数据进入预处理模块,经预处理后的图像数据送入 SDRAM 存储器,由 Nios II 处理器进行图像的后续处理和控制。处理后的图像经数模转换在监视器上实时显示。

 

1.1 图像采集接口电路设计

本系统采用美国 OmiVision 公司的数字式彩色 CMOS 图像传感器 OV7640。该芯片分辨率为 640×480 像素,成像速度为 30 帧 /s,采取逐行扫描方式,输出为数字信号。工作原理如图 2。

 

 

图像采集的程序流程是:首先 Nios 初始化 OV7640 的各个寄存器,主要包括状态寄存器(STA)、数据和时钟控制寄存器(CLKRC)、自动增益控制寄存器(AGC)的设置;然后查询等待,条码图像被 OV7640 采集进入数据寄存器后,通过 DMA 方式存入 SDRAM,Nios 再从 SDRAM 中提取数据进行译码。


1.2 基于 Nios 的 SoPC 系统硬件设计

基于 Nios 软核的 SoPC 系统设计是整个系统硬件设计的核心,包括 Nios 软核处理器的设计、数据采集控制的设计、图像信号 FFT 分析的实现、参数显示以及 RS232 通信模块的设计等。另外,使用 Nios 进行嵌入式设计在硬件上必需使用 Altera 公司的 FPGA。


Nios 处理器核的硬件设计是根据系统的功能要求定制合适的 CPU 和外设,然后在 SoPC 和 Quartus II 中实现。在硬件设计流程中,可以灵活定制 Nios CPU 的许多特性甚至指令,可以使用 Altera 提供的 IP Core 来加快设计者开发 Nios 外设的速度并提高外设性能,也可以使用第三方的 IP Core,或者使用 VHDL、Verilog 自行定制外设。


系统 Nios 外设主要包括:


(1)CMOS 图像传感器接口模块。由于 Altera 没有提供 CMOS 图像传感器接口模块,所以使用 VHDL 编程自行定制。通过 VHDL 编程设计一个 CMOS 图像传感器控制模块,采用接入 Avalon 总线的方式自定制外设。


(2)由于要对数字图像信号进行 FFT 运算,所以采集的数据必须先进行存储,然后再作 FFT 计算。因此,必须设计 FIFO 存储器和 FFT 实现的硬件。


(3)RS232 通信电路模块。RS232 通信可以通过串行口 UART 加上一个转换芯片来实现。所以,本系统利用 SoPC 中提供的 UART 组件来实现 RS232 通信接口的设计。


(4)LCD 液晶显示模块。LCD 液晶显示是通过配置 Nios 的 PIO 接口来控制的。


除上面所述之外,根据系统要求,Nios 处理器核应当配置以下组件及接口模块:cpu、boot_rom(用于系统引导)、uart1(用于系统的仿真调试)、uart_rs232(用于串口通讯)、Timer1(系统内部时钟)、lan_timer(以太网通信用时钟)、button_pio(用于参数设置)、lcd_pio(用于参数显示)、user_logic_ad_nv_ctl 和 user_logic_ad_power_ctl(自定义的 AD 转换的接口模块)、Ethernet(用于以太网通信)、ext_ram(外部 SRAM)、dma(用于将采集的数据直接存入 SRAM 中)和 ext_flash(外部 flash)。


本系统中数据的存储是通过设计 FIFO 存储器电路实现的。FIFO 存储器电路主要由一个双口 RAM 模块(Dual-Port RAM)和状态机模块(State Machine Table)组成,通过先进先出(FIFO)堆栈把数据存储在双口 RAM 中。其设计是在 Matlab 环境下利用 Altera DSP Builder 设计工具实现的。


电路设计完成并仿真验证成功后,应用 DSP Builder 中的 signal Compiler 进行编译分析,经 signal Compiler 转换后可以变成 VHDL 语言的程序。同时,在 Quartus II 中,可以将 VHDL 语言程序转换成电路符号,便于应用原理图的方法设计硬件系统。由 FIFO 存储器的 VHDL 程序生成的电路符号如图 3 所示。在设计过程中,需要用到 Quartus II 软件和其内嵌的 IP Toolbench。按照本系统的要求设置 FFT 的参数为:点数为 1 024 点,数据宽度为 12 bit。最后设计生成 FFT 的 MegaCore Function 模块,包含一些 VHDL 程序及其他相关的文件。由 VHDL 程序生成的 FFT 模块电路符号如图 4 所示。

 

 

2 系统软件设计

系统软件部分包括实时操作系统μC/OS-II 和数据采集与处理部分的应用程序。在 Nios II IDE 中将软件开发分为两大部分,一部分是底层系统软件的开发,主要完成 BSP(板级支持包)的功能;另一部分则是用户应用软件的开发(包括用户硬件驱动及用户上层应用软件)。整个用户软件的开发及调试工作都可以在 Nios II IDE 中完成。


2.1 实时操作系统μC/OS-II 在 Nios 上的移植

在本课题中使用的是μC/OS-II 的 v2.83 版本,源码可以从 Micrium 的网站上获得。同时还要从网站上获得μC/OS-II 在 EDK 中使用的配置文件μCOS-II_v2_1_0.mld 和μCOS-II_v2_1_0.tcl。将这两个文件放到 EDK 能找到的路径下,这样在 EDK 中才能配置使用μC/OS-II。在 EDK 中通过菜单 Software->Software Platform Settings 打开配置窗口,在 OS 中选择μC/OS-II,OS Version 中选择 v2.83a,然后进入 OS & Library 对μC/OS-II 进行配置。


在 Nios II IDE 中,可以对μC/OS-II 的源码位置、BSP 包源码位置、移植程序文件位置、应用程序文件位置进行修改,同时还可对μC/OS-II 进行剪裁配置,如是否使用事件、互斥信号量、消息邮箱及任务是否可删除等。


2.2 实时操作系统下的软件设计

μC/OS-II 在 ALTERA 的 Nios 微处理器上移植并测试完成后,建立了基于μC/OS-II 实时多任务内核的硬件开发平台,但μC/OS-II 仅是一个有源码的内核,在实际应用中,对外设的操作需要自行编写底层的代码。在此平台下进一步开发,实现数据采集功能,需要建立相关的应用程序,也就是要根据整个系统的要求,划分不同的任务,这些任务交由实时内核来调度管理。一般一个任务对应于一段独立的主程序,它可能调用各种子程序,并使用各种系统资源,以完成某种特定的功能,并且实时内核允许多个任务并行运行。采用实时操作系统,使应用程序的编写简单且易于调试。


主程序用 C 语言编写,其主要程序如下:


void main()
{sys_initialize();// 系统初始化
while(1)
{ad_fft_ctl();// 数据采集及 FFT 计算子程序
case collection_order: // 图像采集命令
image_collection();// 图像采集
image_process();// 图像处理
image_save();// 图像保存
mps_decoder();// 调用相应的解码算法
case rs232_transfer:// 传输数据命令
lcd_display(p1,p2,p3);//LCD 液晶显示子程序
}
}


3 系统调试与应用实例

调试包括硬件和软件调试。硬件调试分析电路的设计合理性及焊接工艺的可靠性,以保证所设计的各个模块合理,重点放在调试自己所设计的 IP 核和硬件逻辑的可靠性与适用性。软件调试主要是集中在系统内核的应用程序,以保证各个功能都成功实现。这是一个相当复杂的过程。


3.1 系统硬件调试

为了验证 FPGA 能否正常工作,把 CMOS 图像传感器的输出连接到 Nios II 开发板的扩展插座上,编写 VHDL 程序,读取 CMOS 图像传感器的输出并存储到 FPGA 的内部 RAM 中,利用 Quartus II 的工具 In-System Memory Content Editor,读取内部 RAM 的值。


要设计用户逻辑或者外设,除了要编写实现特定功能的逻辑之外,还要编写与 Avalon 总线的接口,这就要求对 Avalon 总线的规范很熟悉。测试结果表明,程序能够通过 JTAG 接口成功下载到 FPGA 上,显示在 LCD 上的运行结果也正确。这说明 FPGA、JTAG 接口、电源、晶振和 LCD 显示等电路均能正常工作。


3.2 系统软件调试

Nios II 集成开发环境(IDE)是 Nios II 系列嵌入式处理器的基本软件开发工具,所有的开发任务都可以在 Nios II IDE 下完成,包括编辑、编译、调试程序和下载。系统的软件设计和调试全部在 Nios II IDE 下完成,使用 C/C++语言编程。


3.3 系统应用实例——PDF417 二维条码的识别

二维条码扫描器开始工作时,首先采集二维条码图像数据,由于实际工作中条码图像会出现污损等情况,对码字的正确译出造成影响,所以必须对采集到的图像进行降噪、校正等预处理。条码图像为灰度图像,对其进行二值化才能进行码字识别。在将 PDF417 码的所有码字正确分割后,以查表方式在码本中查找与码字相对应的值,将编码数据译出。为确认扫描的有效性,必须进行前向错误校验。如出错,则进行纠错。最后,将译码的正确数据传输到上位计算机或 LCD 显示。识别过程如图 5 所示。

 

 

二维条码数据全部识别完以后,Nois 控制输出一个中断申请信号,开始执行中断服务程序。首先选定数据传输口地址,然后译码结果可通过 RS-232 接口被送至计算机,计算机接收该译码数据后,中断结束。重复该过程,直至全部译码结果输出结束。整个软件处理过程控制在 0.3 s 以内,完全可以满足系统实时性要求。


本文对基于 FPGA 以及 Nios 的图像采集与处理系统设计进行了深入研究,并在设计完成硬件实验平台的基础之上,完成了嵌入式操作系统的移植及应用程序的设计。系统采用 Nios 处理器和 FPGA,必要的外围电路和处理器能集中在一块芯片上,减少了系统体积,简化了系统规模,同时可以方便地进行扩展和升级。μC/OS-II 操作系统移植到 Nios 处理器上,提高了系统的运行效率和可靠性。嵌入式图像处理系统作为一种新型的智能化视觉系统,以其种种优点使之具有广阔的应用前景和良好的经济价值。研究与推广嵌入式图像处理系统无疑是科技进步的表现,尤其当嵌入式图像处理系统应用于工业生产上时,必能提高生产效率,推动生产力的发展。