40
1 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉 基于FPGA的嵌入式开发与应用 案例分析() IP摄像头 解放军理工大学通信工程学院 [email protected] 徐光辉 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉 Part I MicroC/OS-IINios II下的应用 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉 一、uCOS2简介 uCOS2是由Micrium公司开发的一款可移 植、可固化、可裁剪、占先式多任务实时操作 系统内核。 uCOS自发布以来,已经得到了40多种结构处 理器的支持和移植。 Altera公司已经将uCOS2移植到Nios II软核处 理器上,并将其整合到Nios II EDS中。 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉 1.1 实时系统概念 实时系统的特点是,如果逻辑和时序出现偏差 将引起严重后果。 软实时系统中,系统的宗旨是使各个任务运行 得越快越好,并不要求限定某一任务必须在多 长时间内完成。 硬实时系统中,各任务不仅要执行无误而且要 作到准时。 大多数实时系统是二者的结合。

基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

  • Upload
    vodieu

  • View
    229

  • Download
    5

Embed Size (px)

Citation preview

Page 1: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

1

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

基于FPGA的嵌入式开发与应用案例分析(三)

IP摄像头

解放军理工大学通信工程学院[email protected]

徐光辉

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

Part I

MicroC/OS-II在Nios II下的应用

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一、uCOS2简介

uCOS2是由Micrium公司开发的一款可移

植、可固化、可裁剪、占先式多任务实时操作系统内核。

uCOS自发布以来,已经得到了40多种结构处

理器的支持和移植。

Altera公司已经将uCOS2移植到Nios II软核处理器上,并将其整合到Nios II EDS中。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.1 实时系统概念

实时系统的特点是,如果逻辑和时序出现偏差将引起严重后果。

软实时系统中,系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。

硬实时系统中,各任务不仅要执行无误而且要作到准时。

大多数实时系统是二者的结合。

Page 2: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

2

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.2 前后台系统

应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分被看作后台(background)行为,也称为任务级。

中断服务程序处理异步事件,这部分被看作前台(foreground)行为,也称为中断级。

时间相关性很强的关键操作(critical operation)一定是靠中断服务程序来保证的。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

前后台系统

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.3 多任务的概念

多任务的运行是靠CPU在多个任务之间转换和

调度来实现的。

CPU只有一个,轮番服务于一系列任务中的某

一个。多任务运行很像前后台系统,只不过后台任务有多个。

多任务运行大大提高CPU的效率,并使应用程

序模块化。在实时应用中,开发人员可以将复杂的应用层次化,应用程序更容易设计与维护。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

任务控制块TCB

Page 3: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

3

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

任务的切换

当多任务内核决定运行另外的内核时,它保存正在运行任务的当前状态,即CPU寄存器中的

全部内容。这些内容保存在该任务自身的栈区中。

把下一个将要运行任务的当前状态从该任务的栈区中重新装入CPU的寄存器,并运行该任

务,这个过程就称为任务切换。

任务的切换增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

内核(Kernel)

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之

间的通信。内核提供的基本服务是任务切换。

使用实时内核可以大大简化应用系统的设计,因为它允许将应用分成若干个任务。

内核本身也增加了应用程序的额外负荷。内核对CPU的占用时间一般在2~5%。内核的数据结

构增加了内存用量,但更重要的是,每个任务有自己的栈空间,占用内存相当大。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.3 多任务的概念

任务,也称线程,是一个简单的程序,程序可以认为CPU完全属于该程序自己。

设计实时多任务应用程序时,需要将一个项目分割成多个任务,每个任务被赋予一定的优先级,分别有自己的一套CPU寄存器和自己的栈空间。

每个任务都可以是一个无限的循环。每个任务都处在以下五种状态:休眠态、就绪态、运行态、挂起态(等待某一事件发生)和中断态。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

任务的状态

任务驻留在内存中,但并不被多任务内核所调度。

该任务已经准备好,可以运行了。但由于该任务的优先级比正在运行的任务的优先级低,暂时还不能运行。

该任务掌握了CPU的控制

权,正在运行中。

也叫等待事件态,指该任务在等待某一事件的发生。如等待某外设的I/O操作,等待某共享资源由暂时不能使用变成能使用状态,等待定时脉冲的到来,或等待超时信号的到来以结束目前的等待等。

发生中断时,CPU提供相应

的中断服务,原来正在运行的任务暂不能运行,就进入了中断状态 。

Page 4: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

4

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.4 占先式内核

非占先式(non-preemptive)内核要求每个任务自我放弃CPU的所有权。其优点一是响应中断快,二是几乎不需要使用信号量保护共享数据。

当系统响应时间很重要时,要使用占先式(preemptive)内核 。uCOS2以及绝大多数商业实时内核都是占先式内核。

使用占先式内核,最高优先级的任务什么时候可以执行,可以得到CPU的控制权是可知的。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

调度(Scheduler)

也称dispatcher,这是内核的主要职责之一,

就是决定该轮到哪个任务运行了。

多数实时内核是基于优先级调度法的,每个任务根据其重要程序的不同被赋予一定的优先级。基于优先级的调度法:CPU总是让处在就

绪态的优先级最高的任务先运行。

究竟何时让高优先级任务掌握CPU使用权,就

得看用的是非占先式还是占先式内核。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.4 占先式内核

中断服务子程序使一个高优先级的任务进入就绪态

中断完成时,中断了的任务被挂起,优先级高的任务开始运行

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.5 信号量(Semaphore)

信号量是60年代中期Edgser Dijkstra发明

的。

信号量实际上是一种约定机制,在多任务内核中普遍使用信号量用于:1. 控制共享资源的使用权(满足互斥条件)2. 标志某事件的发生

3. 使两个任务的行为同步

信号像一把钥匙,任务要运行,就得先拿到钥匙。如果信号已被别的任务占用,则该任务只能等待。

Page 5: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

5

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

对信号量的操作

初始化(INITIALIZE),也称作建立(CREAT)。初始化时给信号量赋初值,等待信号量的任务表(waiting list)应清为空。

等信号(WAIT),也称作挂起(PEND)给信号(SIGNAL),也称作发信号(POST)

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.5 信号量

当多任

务共享

输入输

出设备

时,信

号量特

别有用

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

如何防止死锁(dead lock)

死锁也称抱死(deadly embrace),指两个任

务无限期地互相等待对方控制着的资源。设T1独享着R1,T2独享着R2,此时T1需要独享R2,T2也要独享R1,就发生了死锁。

最简单的防止死锁的方法是让每个任务:

先得到全部需要的资源再作下一步工作

用同样的顺序去申请多个资源

释放资源时使用相反的顺序

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.6 同步

用信号量使任务与中断服务同步

Page 6: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

6

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.6 同步

两个任务用信号量彼此同步

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.7 事件标志

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.8 消息邮箱

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.9 消息队列

Page 7: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

7

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二、uCOS2 on Nios II

在Altera的Nios II EDS中,提供了一组已经编译测试通过的uCOSII例程,供用户参考,并可作为基本的uCOS2程序框架使用。

Altera的uCOS2 on Nios II移植以方便易用为目标,将uCOS2的开发整合到Nios IDE中,提供了图形界面来完成uCOS2的配置和开发,无需再手工修改OS_CFG.h文件。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.1 uCOS2移植与Nios2相关的代码

<NiosII path>/components/altera_nios2/UCOSIIincludes.hos_cpu.hos_cpu_a.Sos_cpu_c.calt_usleep.c

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.2 uCOS2移植与Nios2无关的代码

os_core.cos_dbg.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.c

在Nios IDE中,uCOSII的使用方法类似Nios II处理器

的外设驱动。

在Nios II IDE中,Project被指定支持uCOSII组件,相应的uCOSII头文件和源代码就会被包含到Project的路径中,使uCOSII能够被编译并链接到Project中。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.3 uCOS2的结构

Altera的uCOS2本质上是Nios II HAL的一个超集,是uCOS2任务调度器和相关API函数在HAL环境上的扩展。

在uCOS2 Project中,所有Nios II本身的HAL API都可以被调用。

HAL API

User ProgramC Standard

LibraryMicroC/OS-II

API

Nios II Processor System Hardware

Device Driver

Device Driver

Device Driver……

Page 8: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

8

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.4 uCOS2的配置

在Nios II IDE 中新建工程,选择Hello MicroC/OS-II为模板。新建的工程和对应的系统库对MicroC/OS-II的相应配置都已经选择上。接着以此Hello MicroC/OS-II工程为基础开发应用程序。

新建好工程和对应的系统库,在系统库上点击右键选择Properties进入属性设置界面,在属性设置页面RTOS选项选择MicroC/OS-II并通过RTOS Options对MicroC/OS-II的具体属性做进一步的选择。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.4 uCOS2的配置

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.4 uCOS2的配置

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

Part II

LwIP和NicheStack协议栈的应用

Page 9: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

9

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

要实现嵌入式TCP/IP协议栈,最关键的一个

问题就是,如何结合系统资源有限的嵌入式系统软硬件环境以及具体的嵌入式Internet应用对标准的TCP/IP协议栈进行简化, 从而实现一种“轻量级”的TCP/IP协议栈。

这就是所谓的Light-weight IP。由瑞典计算机科学院的Adam Dunkels创建。

LWIP是开源的TCP/IP协议栈,不需要支付专

利费。

一、LwIP协议栈

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

LWIP是TCP/IP协议栈的一种实现。

主要目的是减少存储器利用量和代码尺寸,几十K字节的程序空间和几十K字节的数据RAM空间就可以实现。

很适合应用于小的、资源有限的处理器如嵌入式系统。

可以移植到操作系统上,也可以在无操作系统的情况下独立运行。

一、LwIP协议栈

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一、LwIP协议栈

LwIP(Lightweight)是一个轻量级的TCP/IP协议栈实现,其目的是用最小的资源提供完整的TCP/IP协议功能。LwIP适合内存资源紧凑的嵌入式系统,包括Nios II系统。

LwIP提供了完成的TCP/IP协议功能,支持IP,ICMP,UDP,TCP,DHCP,ARP。实现了标准的sockets API接口。

从Nios II IDE 6.1开始,LWIP逐渐削弱,取而代之的是Niche Stack TCP/IP协议栈。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

LwIP on Nios II

Altera在Nios II上的LwIP移植基于uCOS2的多任务环境,在Nios IDE中开发LwIP应用程序需要工程首先配置为支持uCOS2。Nios II上LwIP支持的网络芯片为SMSC的LAN91C111。在Altera的Nios II EDS中,提供了一组已经编译测试通过的LwIP例程,供用户参考,并可作为基本的LwIP程序框架使用。

Page 10: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

10

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.1 LwIP的配置

在Nios IDE 中新建工程,并选择Simple Socket Server为模板,新建的工程和对应的系统库对MicroC/OS-II和LwIP的相应配置都

已经选择上。接着以此工程为基础开发基于LwIP的应用程序。

在系统库上点击右键,点击Properties进入属性设置界面,在属性设置页面RTOS选项选择MicroC/OS-II。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

实时操作系统:MicroC/OS-II

Altera的uCos本质上是Nios HAL的一个超集。是uCos任务调度器和相关API函数在HAL环境上的扩展。在uCos Project中,所有的Nios HAL API都可以同样使用。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

软件组件(Software Component)

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

协议实现的进程模型以把系统划分成为不同的进程的方法进行描述。

用于实现通信协议的进程模型使每个协议作为孤立的进程运行。

这种模型使用严格的协议分层,协议之间的通信结点必须被严格定义。

1.2 LwIP的进程模型

Page 11: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

11

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

TCP/IP 的体系结构

网络接口层

IP

各种应用层协议HTTP, FTP,

SMTP, DNS 等

TCP网际层

运输层 UDP

应用层

TCP: 传输控制协议(Transmission Control

Protocol)

IP: 网际协议

UDP: 用户数据报协议(User Datagram

Protocol)

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

TCP/IP的进程模型

物理层设备

网络接口

IP

TCP

应用程序

操作系统OS

:表示进程切换

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

这种方法有其诸多优势,如协议能在运行时被增加,代码一般容易理解和调试。但也有不利因素,严格的分层并不总是实现协议的最好方法。

数据跨层传递时将不得不产生进程切换(context switch)。对于接收一个TCP段来说,将会引起三次进程切换,从网络设备驱动层进程到IP进程,从IP进程到TCP进程,最终到应用层进程。对于大部分操作系统来说,进程切换的代价可是相当昂贵的。

1.2 LwIP的进程模型

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

lwIP所使用的进程模型是:把所有协议封装到一个单一的进程中,从而与操作系统内核分开。

应用程序可能也驻留在lwIP处理过程中,或者在单独的过程中。

TCP/IP栈和应用程序之间的通信可以通过函数调用实现,也可以通过更为抽象的API。

1.2 LwIP的进程模型

Page 12: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

12

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

物理层设备

应用程序

uc/OS LWIP协议栈

:表示进程切换

1.2 LwIP的进程模型

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

有些学者把这种方法称为零拷贝技术。

所谓“零拷贝”,是指TCP/IP协议栈没有

用于各层数据传输的缓冲区,协议栈各层之间传递的都是数据指针。

只有当数据最终要被驱动程序发送出去或者是被应用程序取走时,才进行真正的数据搬移。这样就大大减少了系统开销,从而提高系统性能。

1.2 LwIP的进程模型

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

1.3 Nios II程序中使用LwIP协议栈

LwIP协议栈的主要接口是标准sockets接口

在Nios II + uCOS2 + LwIP这个环境下编写Socket程序和在Unix,Windows环境下调用Socket接口编程原理一样

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑴网络接口的初始化

在uCOS2启动OSStart()函数进入多任务状态

之前,调用如下两个函数完成网络接口的初始化:

lwip_stack_ini( )lwip_devices_init( )

Page 13: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

13

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑵TCP/IP协议栈初始化

void lwip_stack_init(int thread_prio,void (* init_done_func)(void *), void *arg)

thread_prio:主TCP/IP线程的优先级

init_done_func():lwip_stack_init函数执行

完成后就转向执行这个指针指向的函数

arg:传递给init_done_func的参数,视init_done_func()而定,通常置为0功能:创建一个TCPIP协议栈主线程,完成TCP/IP协议栈的初始化并转向init_done_func

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑶编写init_done_func函数

void init_done_func(void* arg){//创建一个包接收处理线程

if lwip_devices_init( )调用成功;

{创建一个任务执行用户Socket程序

}else ……

}注意:设备初始化在init_done_func中完成

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑷网络设备初始化

由lwip_devices_init()函数完成

int lwip_devices_init(int rx_thread_prio)Lwip_devices_init从system.h中遍历所有安装的网络设备驱动并注册。成功后返回一个非零值,此时如果TCPIP栈准备就绪,就可以为应用程序创建任务。

此函数创建了一个接收线程,其优先级由参数rx_thread_prio给定

此函数会调用get_mac_addr和get_ip_addr二函数,这两个函数必须由用户编写。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑸get_mac_addr和get_ip_addr

LwIP系统代码必须根据此二函数设置网络设备的MAC和IP地址。

通过写这两个函数,系统可以灵活地将MAC和IP地址存放在任意位置,而不是设备驱动的某个固定位置。如可以存放在FLASH中,也可存放在片内RAM中。

两个函数都使用了LwIP内部使用的结构体。

用户无需知道结构体的细节,只需知道如何填充MAC和IP地址。

Page 14: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

14

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

get_mac_addr

err_t gat_mac_addr(alt_lwip_dev* lwip_dev);在函数内,用户必须填充alt_lwip_dev结构体的下列区域以设置MAC地址:

①unsigned char lwip_dev->netif->hwaddr_len:MAC地址的长度应该等于6。

②unsigned char lwIP_dev->netif->hwaddr[0-5]:设备的MAC地址

用户的代码还可以检验初始化设备的名称

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

get_mac_addr实例

#include <alt_lwip_dev.h>#include <lwip/netif.h>#include <io.h>err_t get_mac_addr(alt_lwip_dev*

lwip_dev){

err_t ret_code = ERR_IF;//The name here is the device

name defined in system.hif (!strcmp(lwip_dev->name,

"/dev/lan91c111")){//Read the 6-byte MAC address from wherever it is stored

lwip_dev->netif->hwaddr[0] = IORD_8DIRECT(0x7f0000, 4);

lwip_dev->netif->hwaddr[1] = IORD_8DIRECT(0x7f0000, 5);

lwip_dev->netif->hwaddr[2] = IORD_8DIRECT(0x7f0000, 6);

lwip_dev->netif->hwaddr[3] = IORD_8DIRECT(0x7f0000, 7);

lwip_dev->netif->hwaddr[4] = IORD_8DIRECT(0x7f0000, 8);

lwip_dev->netif->hwaddr[5] = IORD_8DIRECT(0x7f0000, 9);

ret_code = ERR_OK;}return ret_code; }

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

get_ip_addr

函数get_ip_addr为协议栈分配IP地址。

用户程序可以请求DHCP以获取IP地址,或者分配一个静态地址。

int get_ip_addr(alt_lwip_dev* lwip_dev,struct ip_addr* ipaddr, struct ip_addr* netmask,struct ip_addr* gw,int* use_dhcp);

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

get_ip_addr实例

#include <lwip/tcpip.h>#include <alt_lwip_dev.h>int get_ip_addr(alt_lwip_dev*

lwip_dev,struct ip_addr* ipaddr,struct ip_addr* netmask,struct ip_addr* gw,int* use_dhcp){int ret_code = 0;//The name here is the device name

defined in system.hif (!strcmp(lwip_dev->name,

"/dev/lan91c111")){#if LWIP_DHCP == 1*use_dhcp = 1;

#else//Assign Static IP AddressesIP4_ADDR(&ipaddr, 10,1 ,1 ,3);//Assign the Default Gateway

AddressIP4_ADDR(&gw, 10,1 , 1,254);//Assign the NetmaskIP4_ADDR(&netmask,

255,255 ,255 ,0);*use_dhcp = 0;

#endif /* LWIP_DHCP */ret_code = 1;}

Page 15: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

15

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑹调用sockets接口

以太网设备初始化完成后,程序的剩余部分就是用sockets API访问IP栈。

创建新的任务,必须使用sys_thread_new()函数。此函数是LwIP OS移植层的一部分,它调用uCOS2的OSTaskCreate()函数并执行一些其它的LwIP相关的操作。

sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio);

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑺编写应用程序

编写应用程序处理以太网收发的数据。

由于应用程序是建立在ucos2的基础上,因此要用到OSTaskCreate创建一个或多个任务(注意与LwIP打交道的任务不是用此函数创建)。使用ucos2中的信号量、队列、信号标志、邮

箱等实现多个任务之间的同步和通信。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二、NicheStack TCP/IP协议栈

Niche:本意为“适当的位置”NicheStack与LwIP一脉相承,技术上并无本

质区别,在作产品时可能有区别。前者需要授权,后者则不需要。

NicheStack本身是支持无RTOS的应用的,但Altera的Nios II IDE包中没有提供。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.2 层次化的软件模型

每层封装了该层的实现细节

提供相邻外层的数据抽象。

Page 16: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

16

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.2 层次化的软件模型

Nios II处理器系统硬件层onion模型的核心,包含了FPGA中实现的Nios II软核处理器和硬件外设。

软件设备驱动层软件设备驱动层包含了操作以太网和其它硬件外设的软件功能。这些驱动包含外设设备的物理细节,并将这些细节抽象到外层去。HAL API层硬件抽象层应用程序接口提供到软件设备驱动的标准接口,提供一个类POSIX的API给外层。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.2 层次化的软件模型

MicroC/OS-II层MicroC/OS-II实时操作系统层提供多任务和任务间通信服务给lwIP网络栈和应用程序 。NicheStack TCP/IP协议栈软件组件层

lwIP软件组件层通过接字API提供到应用层的网络服务和面向应用的系统初始化层。面向应用的系统初始化层包含main函数调用的MicroC/OS-II和lwIP软件组件初始化函数,以及创建所有应用程序任务、信号量、队列和事件标志实时操作系统任务间通信资源。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.3 Simple Sockets Server分析

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.3.1 ucOS2资源

任务(task)队列(queue)事件标志(event flag)信号量(semaphore)

Page 17: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

17

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑴任务

应用程序创建四个任务SSSInitialTask()SSSSimpleSocketServerTask()LEDManagementTask()LED7SegLightshowTask()

SSSInitialTask创建了两个软件组件层任务

NicheStack TCP/IP Stack main tasktime-keeping task

SSSInitialTask在创建两个任务后删除本任务

使用NicheStack的任务,由TK_NEWTASK创建

不使用NicheStack的任务,由OSTaskCreate创建

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

软件组件层任务

NicheStack TCP/IP Stack main task (tk_netmain)在netmain()中创建

优先级为TK_NETMAIN_TPRIOtime-keeping task (tk_nettick)也在netmain()创建

TK_NETTICK_TPRIO

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⑵任务间通信资源

在simple_socket_server.c中由SSSCreateOSDataStructs()函数声明和创建

SSSLEDCommandQ:消息队列,从SSS任务发送命令到LEDManagementTaskSSSLEDEventFlag:每个事件标志与一个LED灯关联。

SSSLEDLightshowSem:LED7SegLightshowTask在每次更新七段显示检查此信号量,根据CMD_LEDS_LIGHTSHOW命令(来自SSS任务从TCP/IP socket接收的命令),确定7段数码管的显示。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.3.2 NicheStack TCP/IP栈初始化

必须先调用两个NicheStack函数

alt_iniche_init()netmain()

同时必须自己编写另外两个NicheStack函数

get_mac_addr()get_ip_addr()

Page 18: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

18

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

SSSInitialTask

alt_iniche_init(); //执行NicheStack网络栈的预初始化

netmain(); //初始化并开始NicheStack网络栈

//iniche_net_ready标明TCP/IP栈准备好,IP地址已获取

while (!iniche_net_ready) TK_SLEEP(1);//协议栈已开始运行,应用程序初始化, 开始应用相关的任务加载代码块

printf("\nSimple Socket Server starting up\n");TK_NEWTASK(&ssstask); //创建simple socket server任务

SSSCreateOSDataStructs();//创建OS数据结构:队列信号量等

SSSCreateTasks(); //创建其它任务

error_code = OSTaskDel(OS_PRIO_SELF);信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

SOCKET结构

typedef struct SSS_SOCKET{enum { READY, COMPLETE, CLOSE } state;int fd;int close;INT8U rx_buffer[SSS_RX_BUF_SIZE]; //环形bufferINT8U *rx_rd_pos; //读位置

INT8U *rx_wr_pos; //写位置

} SSSConn;

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

LED命令

CMD_LEDS_BIT_0_TOGGLE '0'CMD_LEDS_BIT_1_TOGGLE '1'CMD_LEDS_BIT_2_TOGGLE '2'CMD_LEDS_BIT_3_TOGGLE '3'CMD_LEDS_BIT_4_TOGGLE '4'CMD_LEDS_BIT_5_TOGGLE '5'CMD_LEDS_BIT_6_TOGGLE '6'CMD_LEDS_BIT_7_TOGGLE '7'CMD_LEDS_LIGHTSHOW 'S'CMD_QUIT 'Q'

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.3.3 Socket任务

SSSSimpleSocketServerTask()完成创建一个socket实现TCP/IP连接,绑定到socket上,侦听客户端的TCP/IP连接请求

到来TCP/IP连接时,调用sss_handle_accept()调用sss_handle_receive()处理TCP/IP连接。如果需要多个TCP/IP连接,需要创建更多任务。

调用sss_reset_connection(), sss_send_menu()和sss_exec_command()。当收到数据包后,LED命令被提取并通过SSSLEDCommandQ队列送到LEDManagementTask()

Page 19: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

19

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2.3.4 LED任务

LEDManagementTask()响应SSSLEDCommandQ队列中的命令。如果命令给7段数码管的则更改SSSLEDLightshowSem信号量。如果命令给LED灯,则修改SSSLEDEventFlag值,从而控制不同的LED灯显

示。

LED7SegLightshowTask()根据SSSLEDLightshowSem的值,在7段LED上

闪烁随机图案或停止闪烁。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

Part III

图像采集与显示

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

主要内容

一. 图像传感器MT9M011二. CCD控制器

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一、图像传感器MT9M011

MT9M011是MICRON公司推出的1/3英寸、百万象素CMOS图像传感器。

主时钟25MHzBayer型颜色滤波阵列

ADC 10-bitI2C控制总线

可编程控制

Page 20: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

20

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉结构框图

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

MT9M011图像传感器像素阵列1316×1048

(0,0)

(1315,1047)

行方向

列方向

有效像素1289×1033

26 blackcolumns

1 blackcolumns

8 blackrows

7 blackrows

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

有效像素1289×1033,支持SXGA(1280×1024)VGA(640×480)CIF(352×288)其它小于1289×1033的格式

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

Bayer型颜色滤波阵列(Color Filter Adday)

Bayer型颜色滤波阵列上面每一个感光点仅允

许一种颜色分量通过,最终采集图像的每一个像素只有一个颜色分量的灰度值。

Page 21: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

21

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉Bayer型颜色滤波阵列图

列方向

行方向

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

插值算法

每个采集的像素点只有一个颜色的灰度值,需要估计其它颜色的灰度值,这个估计的过程称为基于Bayer型颜色滤波阵列的插值过程。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

三基色邻边补偿法插值表

ijij GG =

1−= ijij RR

ijij GG =

1−= ijij BB

jiij RR 1−=

jiij BB 1−=

ijij RR =

ijij BB =

11 −−= jiij BB( ) 2/11 −− += ijjiij GGG

( ) 2/11 −− += ijjiij GGG11 −−= jiij RR

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

当前行插值估计进行三基色重建时,还需前一行的像素信息,需要建立一个缓存,640×480的分辨率,缓存一行需要640个10位的寄存器。

ALTERA提供了基于RAM的移位寄存器,可

以用于数据缓冲。

Page 22: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

22

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

存储深度为640的仿真波形

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

输出数据时序

帧起始消隐 行消隐 帧结束消隐有效数据 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

控制寄存器

MT9M011通过控制寄存器可以控制图像的大小,行

消隐时间,场消隐时间,曝光时间,增益,帧速等

Reg 0x03 行数

Reg 0x04 列数

Reg 0x05 行消隐时间

Reg 0x06 场消隐时间

Reg 0x09 曝光时间

Reg 0x20 数据读取模式

图像大小,默认1280×1024

帧速

Page 23: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

23

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

CCD控制器

1. 初始化图像传感器。

2. 将传感器出来的数据转化为显示器可以显示的格式。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

I2C总线控制器

I2C总线是Phlips公司开发的一种用于芯片间通讯的串行传输总线,它由串行时钟SCL和数据线SDA完成全双工数据传送。

优点:具有连线少、允许多主机控制和同步等优点。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

工作原理

总线开始和停止数据传输

开始:SCL为高,SDA由高变低

结束:SCL为高,SDA由低变高

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

数据有效

开始条件以后,时钟信号SCL的高电平周期期间,当数据稳定时,数据线SDA的状态表示数

据有效。

Page 24: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

24

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

确认

每一个字节接收以后,每一接收器件必须产生一位确认信号ACK,主器件必须产生一个与

确认位相应的时钟脉冲,发送器这一时钟释放数据线,使其处于高电平状态,接收器须将SDA拉为稳定的低电平,确认器件。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

从器件地址

总线规范中采用了七位地址,七位地址数据D7~D1位,D7~D4为器件码,D3~D1为片选码。D0为数据传输方向位,高电平为主器件

读取数据,低电平主器件写入数据。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

访问控制寄存器

写寄存器顺序

1. 数据线发出起始位

2. 写0xBA,接收ACK3. 写寄存器地址,接收ACK4. 写高位字节,接收ACK5. 写低位字节,接收ACK6. 写结束标志

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

读寄存器顺序1. 数据线发出起始位

2. 写0xBA,接收ACK3. 写寄存器地址,接收ACK4. 写0xBB,接收ACK5. 接收高位字节,接收ACK6. 接收低位字节,接收ACK7. 写结束标志

Page 25: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

25

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

三 、图像显示

图像每一像素有R、G、B三种颜色,图像传感器出来的数据10-bit深度,一幅640×480的图像需要的存储容量为640×480×10×3bit,8.8Mbit,采用片外SDRAM存储图像。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

SDRAM简介

SDRAM:同步动态随机访问存储器,具有速

度快、价格低、密度高、读写速度快的优点。

SDRAM采用电容充放电存储信息,存储体结构和RAM有较大差异,控制时序和机制比较复杂。需要对SDRAM进行激活、预充电、刷新 、读访问和写访问等操作。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

SDRAM SDRAM控制器

CCD控制器

VGA控制器

显示器

图像传感器

图像显示框图

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

Part IV

JPEG图像压缩算法

Page 26: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

26

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

主要内容

一. JPEG标准简单介绍

二. JPEG算法

三. JPEG算法FPGA实现

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一、JPEG标准简单介绍

JPEG标准产生背景

JPEG是联合图像专家组 (Joint Picture Expert Group) 的英文缩写,成立于1986年,是一个在国际标准组织 (ISO) 下从事静态影像压缩标准制定的委员会。JPEG即是由它于1991年制定的第一套国标静态图像压缩编码标准:ISO 10918-1。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JPEG定义了两种基本的算法:一种是基于DCT的有失真的压缩算法;另一种是基于空间预测(DPCM)的无失真压缩算法。

JPEG标准的基本系统是基于DCT的有损压

缩,可以获得让人满意的视觉效果,广泛应用于数码相机、数码摄像机、手机 、医用图片

和网络程序等。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JPEG压缩流程图

Page 27: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

27

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JPEG算法运行模式

JPEG算法有四种运行模式:

1. 基于DCT的顺序模式

2. 基于DCT的递增模式:

3. 无失真编码模式:

4. 分层编码模式:

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JFIF

JFIFJPEG文件交互格式,在编码数据前加了图像

头,为了便于在不同的平台进行传输、存储和译码器进行译码。

JFIF每个标记由两个字节组成,第一个字节固定的FF。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JPEG压缩比与图像质量

图象质量(8bits/pel的彩色图象经JPEG压缩处理后的质量效果)

压缩比(CR) bits/pel 效果

16~32倍 0.25~0.5 中等—好,能满足一般

应用要求

10~16倍 0.5~0.75 好—很好,能满足多数应

用要求

5~10倍 0.8~1.6 极好,能满足大多数应用

要求

2~5倍 1.6~4 几乎无失真

Page 28: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

28

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

图像尺寸:280×200原始大小:164KB 压缩后大小:10.2KB

bmp jpg

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二、JPEG算法

1. 二维DCT变换

2. 量化

3. 熵编码预处理

4. 熵编码

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二维DCT变换

对于一个大小为8*8的图像块来说,图像样值 ,二维DCT定义为

其中

( )jix ,

( ) ( ) ( ) ( ) ( ) ( )∑∑−

=

=

++=

1

0

1

0 212

cos2

12cos,2,N

i

N

j Nvj

Nuijix

Nveuevuy

ππ

8=N1,,1,0 −= Nu L

1,,1,0 −= Nv L

( )⎪⎩

⎪⎨

⎧ ==

     其它

    

1

02

1 kkc

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

空间域 频域

DCT

Page 29: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

29

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

2821522072482552552552314105241253255255255202619225325525525525512131250254255255255255

117246255255255255255255255255254255255255255255255255255254255255255255255255255255255255255255

8*8图像块

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

−−−−−−−−−

−−−−−−−

−−−−−−−−−

−−−−−−

2.20.45.49.26.04.05.09.04.81.136.131.130.136.112.84.45.100.111.21.69.75.87.121.111.96.224.351.360.236.105.94.8

3.216.322.243.73.467.638.529.296.146.88.243.717.934.574.173.403.92.34.358.535.53.1367.3110.278

7.65.07.164.137.505.1916.3521.1739

二维DCT变换

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

−−

−−−−−

−−−−−−

−−

00000009.00000002.84.4000005.87.121.1100000.236.105.94.80003.73.467.638.529.29008.243.717.934.574.173.4002.34.358.535.53.1367.3110.2787.65.07.164.137.505.1916.3521.1739

保留低频36系数

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

42067207251251255255212011022625525525525506517725425525525525220130234255255252254255

135217255255249253255255240255255249251255255251255255248248255255255253254253253255255250251255

二维DCT反变换

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一幅64×64灰度图像的DCT压缩

原始图像 保留28DCT系数保留36DCT系数

保留21DCT系数 保留15DCT系数 保留10DCT系数

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

2. 量化

为了达到压缩数据的目的,对DCT系数

还需作量化处理。离原点(0,0)越远的元素对图像

的贡献就越小,因而也就越不关心此处取值的精确性。

量化首先要对每个系数确定一个量化步长,然后用对应的量化步长去除对应的DCT系数并对其求整。

( )vuF ,

( ) ( )⎥⎦

⎤⎢⎣

⎡=

),(,,

vuQTvuFroundvuFq

Page 30: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

30

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JPEG标准推荐了两张量化表,人眼对亮度信

息敏感,所以采取细量化,人眼对色差信息不敏感,采取粗量化。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

亮度量化表

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

色差量化表

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

亮度量化

Page 31: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

31

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

3. 熵编码预处理

DC差分编码

DC直流系数有两个特点,一是系数的数值比较大,二是相邻8*8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行

编码

1−−= ii DCDCDIFF

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

熵编码预处理

DC系数差分值描述为如下符号

第一个符号=SIZE第二个符号=幅度值

DC=13preDC=27DIFF=DC-preDC=-14

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

DC中间符号表示为(4)(-14)

SIZE、幅度对应表

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

行程编码

行程编码压缩数据原理

例:aaabcccccccddee可以表示为3a1b7c2d2e

Page 32: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

32

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

Zig-zag扫描

••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••

07ACDC 01AC

70AC 77AC信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

AC系数行程编码的码字用两个字节表示

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

两个特殊的符号

EOB (0,0)表示块到结束都为0ZRL (15,0)当行程长度超过15时,用增加ZRL来解决

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

AC系数按照Zig-zag顺序扫描,第一个非零值为3,0游程数为0,SIZE为2,中间符写为(0,2)(3)其余的点类似,可以求得8×8子块熵编码中间格式为(0,3)(-4) (0,2)(2) (0,2)(-3) (0,1)(1) (1,1)(-1) (0,2)(2) (0,1)(-1) (0,0)

Page 33: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

33

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

熵编码

对于DC、AC系数中间两个符号分别进行编码,符号1进行霍夫曼编码,符号2进行变长整数编码(VLI)

1. 霍夫曼编码

2. 变长整数编码

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

霍夫曼编码

压缩数据符号时,霍夫曼编码器对出现频度比

较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。

JPEG标准提供了霍夫曼编码表

DC霍夫曼编码表

AC霍夫曼编码表

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

DC霍夫曼表

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

AC部分编码表

Page 34: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

34

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

变长整数编码

熵编码对符号2幅度进行变长整数编码,用反码表示,编码比特数由SIZE控制,,

7: 111-9: 0110

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

DC (4)(-14)

4查找DC霍夫曼表,编码为101-14变长整数编码 0001DC熵编码为 1010001AC(0,2)(3)(0,2)查找AC霍夫曼表,编码为 01,3VLI编码为11此符号熵编码为:0111其余符号类推

最终8×8图像子块

10100010111100011011001000011100001100001010,总共44bit,压缩比

638.1144

8*64=

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

JPEG算法硬件实现

1. 色彩空间转换

2. 二维DCT3. 量化

4. 熵编码预处理

5. 熵编码

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

RGB彩色模型

RGB彩色模型中,图像每一个像素由RGB三

色组成,即所表示的图像由三个图像分量组成,当送入显示器时,这三幅图像在荧光屏上混合产生一幅合成的彩色图像。

Page 35: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

35

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

色彩转换

图像传感器出来的数据是RGB格式,首先经过色彩转换为JPEG标准规定的YCbCr(亮度色差)格式 。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

转换公式

电平转移

⎥⎥⎥

⎢⎢⎢

⎡−+

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

−−−−=

⎥⎥⎥

⎢⎢⎢

00128

0813.04187.05.05.03313.01687.0

114.0587.0299.0

BGR

CrCbY

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

−−−−=

⎥⎥⎥

⎢⎢⎢

BGR

CrCbY

0813.04187.05.05.03313.01687.0

114.0587.0299.0

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

⊗∑

⊗⊗

⊗⊗

⊗⊗

11c

12c

13c

21c

22c

32c

33c

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一维DCT变换

离散余弦变换作为频域变换最先在图像处理中的模式识别和维纳滤波中提出,DCT广泛应用于静态、动态图像压缩和数字水印等技术 。

考虑一 点实序列 ,其中,DCT定义为

其中

( )nxN

( ) ( ) ( ) ( )∑−

=

−=⎥⎦⎤

⎢⎣⎡ +

=1

0

1,,1,0,2

12cosN

n

NkN

knnxkekX Lπ

( )⎪⎩

⎪⎨

⎧ ==

    其它

   

1

02

1 kke

Page 36: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

36

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

串行结构

⊗ ⊗ ⊗ ⊗ ⊗ ⊗ ⊗ ⊗

0c1c2c3c4c5c6c7c

8个乘法器7个加法器

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一维DCT变换矩阵形式

其中

( )( )( )( )( )( )( )( )

( )( )( )( )( )( )( )( )⎥

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

=

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

76543210

76543210

9271331173217

26142221030186

1112313325155

28201242820124

137127211593

30262218141062

15131197531

44444444

xxxxxxxx

cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

XXXXXXXX

16cos πici =

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

利用三角函数的对称性

( )( )( )( )( )( )( )( )

( )( )( )( )( )( )( )( )⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

−−−−−−−−

−−−−−−−−

−−−−−−−−

−−−−

=

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

76543210

76543210

75311357

62266226

51733715

44444444

37155173

26622662

13577531

44444444

xxxxxxxx

cccccccccccccccccccccccc

cccccccccccccccc

cccccccccccccccc

cccccccc

XXXXXXXX

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

利用系数对称性

( )( )( )( )( )( )( )( )

( ) ( )( ) ( )( ) ( )( ) ( )( ) ( )( ) ( )( ) ( )( ) ( )⎥

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

−−−−++++

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

−−−

−−−

−−−−

−−

=

⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢

4352617043526170

0000000000000000

0000000000000000

75316420

1357

3715

5173

7531

6226

4444

2662

4444

xxxxxxxxxxxxxxxx

cccccccccccc

cccccccc

cccccccc

cccc

XXXXXXXX

32乘法器24加法器

Page 37: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

37

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

( ) 533271101 cMcMcMcMX +++=( ) 335211707 cMcMcMcMX +−−=( ) 137251303 cMcMcMcMX −−−=( ) 731231505 cMcMcMcMX +−+=( ) 6112102 cMcMX +=( ) 2116106 cMcMX −=( ) 41004 cMX =( ) 41000 cpX =

523523

612612

431431

700700

xxPxxMxxPxxMxxPxxMxxPxxM

+=−=+=−=+=−=+=−=

32113211

10101010

PPPPPMPPPPPM

+=−=+=−=

11101001110100 PPPPPM +=−=

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

( )0x

( )1x

( )2x

( )3x

( )4x

( )6x

( )7x

⊕−•

⊕−•

⊕−•

⊕−•

( )5x

⊕−•

⊕−•

⊕−•

⊕−•

⊕−•

⊕−•

⊕−•

⊕−•

• ( )0X

( )4X

( )6X

( )2X

( )3X

( )5X

( )7X

( )1X0P

1P

2P

3P

0M

1M

2M

3M

1c

1c7c7c

3c

3c5c5c

5c

5c3c3c

7c

7c1c1c

2c

2c6c6c

4c

4c

22个乘法器28个加法器

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

一维DCT中基本结构:蝶形运算

变形

• ⊕

⊕•

x

y

abb

a −

byax +

byax −

ba −• ⊕

⊕•

x

y

b

ba +

byax +

byax −⊕

4个乘法器2个加法器

3个乘法器3个加法器

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二维DCT变换

对于一个大小为8*8的图像块来说,图像样值 ,二维DCT定义为

其中

( )jix ,

( ) ( ) ( ) ( ) ( ) ( )∑∑−

=

=

++=

1

0

1

0 212

cos2

12cos,2,N

i

N

j Nvj

Nuijix

Nveuevuy

ππ

8=N1,,1,0 −= Nu L

1,,1,0 −= Nv L

( )⎪⎩

⎪⎨

⎧ ==

     其它

    

1

02

1 kkc

Page 38: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

38

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二维DCT如果直接进行计算,以图像块为例,需要1024次乘法和896次加法,计算量巨大,

难于满足实时处理的要求,人们提出了一些快速算法,最常用的是采用行列快速算法,该算法首先逐行计算一维DCT,再逐列计算一维DCT。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

二维DCT可以写成矩阵形式:TCXCY =

先计算 CXZ = ,并对中间结果进行转置,然后计算

TCZF =

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉二维DCT实现框图 信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

3. 量化

均匀量化器定义为

为了便于硬件电路实现,将除法改为乘法,量化表的因子取倒数并扩大2048倍,生成新的

量化表。

⎟⎟⎠

⎞⎜⎜⎝

⎛=

vu

vuvu Q

SroundSq

⎟⎟⎠

⎞⎜⎜⎝

⎛=

vuvu Q

roundQ 2048'

Page 39: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

39

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

除以2048通过移位操作完成,round取整在FPGA中实现需要判断尾数,实现比较繁琐,可以直接加0.5再向下取整,量化系数为

⎟⎟⎠

⎞⎜⎜⎝

⎛ ∗=

2048

'vuvu

vuQS

roundSq

( ) 2048/1024' +∗= vuvuuv QSSq

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

MU

X

( )vuS ,⊗ ⊕ ( )vuSq ,

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

4. 熵编码预处理

收到量化模块的start信号后的第一个时钟对应的数据是DC系数,后面63个数据是AC系数,熵编码预处理模块实现两个功能:

1. 熵编码预处理模块实现DC系数的差分编码和AC系数的游程编码。

2. DC和AC系数的中间符号编码。DC (SIZE)(幅度)AC (游程长度,SIZE)(幅度)

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

熵编码预处理框图

Page 40: 基于FPGA的嵌入式开发与应用read.pudn.com/downloads159/ebook/716709/2008%CE%F7%B0%B2F… · 一、uCOS2 简介 uCOS2是由 ... (Kernel) 多任务系统中 ... (non-preemptive)

40

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

5. 熵编码

霍夫曼编码是一种可变长编码,我们熟悉的汉明编码,循环编码,光纤通信中的线路码型5B6B等编码都是定长编码。

在硬件中,数据位数是固定的而不是可变长的。

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

霍夫曼表的存储1. DC霍夫曼表

DC霍夫曼编码的最大长度为9,数据宽度15的lpm_rom存储,高六位指示编码长度,低9位为编

码数据。

2. AC霍夫曼表

AC霍夫曼编码的最大长度为16,数据宽度21的lpm_rom存储,高六位指示编码长度,低16位为编

码数据

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

熵编码实现框图

信息产业部FPGA嵌入式系统设计高级研修班 讲义 徐光辉

小结

JPEG标准提供的多种压缩算法和操作模式,

一直作为数字图象压缩编码的主流技术,但JPEG在压缩比比较高时存在着块失真,随着时代的进步、通信技术的发展,JPEG标准也

将逐渐推出历史舞台。