MotionJPEG实验讲义.docx

上传人:b****6 文档编号:6089008 上传时间:2023-01-03 格式:DOCX 页数:29 大小:689.93KB
下载 相关 举报
MotionJPEG实验讲义.docx_第1页
第1页 / 共29页
MotionJPEG实验讲义.docx_第2页
第2页 / 共29页
MotionJPEG实验讲义.docx_第3页
第3页 / 共29页
MotionJPEG实验讲义.docx_第4页
第4页 / 共29页
MotionJPEG实验讲义.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

MotionJPEG实验讲义.docx

《MotionJPEG实验讲义.docx》由会员分享,可在线阅读,更多相关《MotionJPEG实验讲义.docx(29页珍藏版)》请在冰豆网上搜索。

MotionJPEG实验讲义.docx

MotionJPEG实验讲义

实验

基于ESL设计方法的Motion-JPEG视频解码器设计

本实验是在SoCLib仿真平台上完成的。

SoCLib是一个由法国TIMALab、Lip6等研究机构与STMicroelectronics等知名企业联合开发的,用于多核SoC系统架构设计的ESL建模仿真平台。

SoCLib仿真平台所包含的全部IP模型、工具以及各种文档均遵循GNULesserGeneralPublicLicense(LGPL)开源协议,可免费下载使用。

本实验参考了法国TIMALab用于研究生SoC设计课程的大作业“IntegrationofaMotion-JPEGVideoDecoder——apracticalstudy”。

实验总体目标:

以Motion-JPEG(MJPEG)视频解码算法为应用范例,借助SoCLib建模仿真平台[1],通过ESL设计方法,使学生了解并掌握多核SoC(Multi-processorSoC,MPSoC)的系统架构设计与及软件设计方法。

实验内容与学时安排:

实验分为四个部分,由浅入深,从单核到多核,从单一任务执行到多线程并行执行,涵盖完整的SoC系统架构设计及软件设计过程。

实验一构建基于SoCLib的单核SoC(4学时)

●了解SoCLib电子系统级仿真平台

●学会如何在SoCLib平台上添加新的硬件模块

●编写简单C程序验证所添加的模块的正确性

●在所构建的单核SoC上实现串行MJPEG解码应用,验证所搭建的SoC的正确性

实验二构建基于SoCLib的MPSoC(4学时)

●在单核SoC架构之上添加若干处理器构成MPSoC

●了解基于MPSoC的并行应用设计需求

●完成MJPEG解码的并行程序设计,移植到MPSoC之上,验证MPSoC的正确性

●修改MPSoC中的各种系统参数,比较在不同配置下并行MJPEG的运行性能

实验三系统软件开发-嵌入式操作系统及设备驱动设计(4学时)

●了解SoC的软件开发流程

●掌握简单的嵌入式操作系统的工作原理以及设备驱动设计方法

●编写帧缓存(framebuffer)的设备驱动程序

●通过MJPEG应用验证所编写的驱动程序的正确性

实验四面向MJPEG解码的MPSoC系统架构的优化(4学时)

●添加DMA模块

●编写IDCT硬件模块的ESL高抽象层次模型,集成到MPSoC之上

●编写IDCT设备驱动

●通过MJPEG应用验证所优化的MPSoC的正确性

实验准备工作:

实验环境:

Ubuntu9.04

注:

其他Linux操作系统也可,但Windows操作系统不可使用

实验平台:

实验平台下载地址:

libtool-1.5下载地址:

http:

//www.gnu.org/software/libtool/

实验平台安装与测试:

1.对压缩包libtool-1.5解压缩,然后安装libtool

2.对压缩包projet_soc解压缩,得到文件夹projet_soc

3.设置环境变量SOCLIB_DIR="projet_soc文件夹所在的路径"

4.在主目录/home下创建一个工程目录,如/home/soclib_exp

5.将文件夹projet/TP/TP0/HW复制到所创建的工程目录(注:

该文件夹中包含了如图2所示的基于SoCLib构建的单核SoCESL高层次抽象模型,即硬件部分)

6.将文件夹projet/TP/TP0/SW/hello_world复制到所创建的工程目录(注:

该文件夹中包含了在单核SoC上需要运行的helloworld测试程序,即软件部分)

7.打开Shell控制台,进入projet/TP文件夹,输入sourceinstall_env.sh设置系统环境变量

8.进入/home/soclib_exp/hello_world文件夹,输入sourceinstall.shconfigurations/mips运行脚本,然后输入make对软件部分进行编译

9.进入/home/soclib_exp/HW文件夹,输入make对硬件部分进行编译

10.在HW文件夹下,输入ln-s../hello_world/APP.x

11.输入./simulation.x-1,若出现如图1所示情况,则表示实验平台安装测试成功

注:

每次重新启动一次Shell控制台,均要重新运行一下步骤7中的脚本“install_env.sh”。

图1实验平台测试结果

实验平台目录结构:

本实验平台projet_soc的目录结构如图2所示。

图2实验平台projet_soc目录结构

实验平台projet_soc包含两个子文件夹:

PLATFORM和TP。

其中PLATFORM为实验平台,TP为4个实验内容。

PLATFORM文件夹包含两个子文件夹:

●HW_PLATFORM:

实验平台的硬件部分,又包含两个子文件夹,SoCLib和utils。

SoCLib为本次实验所依赖的SoCLibESL建模与仿真环境。

utils包括了实验所需的工具,如仿真内核Systemcass、调试工具CDB。

●SW_PLATFORM:

实验平台的软件部分,又包含两个子文件夹,APES和Toolchains。

APES包括了本次实验所使用的嵌入式操作系统DNA。

Toolchains包括了实验所需的MIPS处理器交叉编译链。

TP文件夹包含五个子文件夹和一个脚本文件:

●TP0~TP2:

分别对应了实验一、二、三的相关文件和说明。

●vci_idct:

对应实验四所需添加的idct模块的程序代码。

●docs:

包含了实现所需的文档,如CDB文档,VCI协议文档。

●install_env.sh:

设置各种环境变量的脚本。

SoCLibESL仿真平台及MJPEG解码流程的介绍

1.SoCLib平台

●SoCLib是一个由法国TIMALab、Lip6等研究机构与STMicrelectronics等知名企业联合开发的,用于多核SoC系统架构设计的ESL建模仿真平台。

●SoCLib平台提供了用于SoC开发所需的丰富硬件IP模块的高抽象层次模型库,包括:

ARM、MIPS、Nios等嵌入式微处理器、总线及片上网络、Cache、主存、各种外设等。

所有的硬件IP模块均采用C++以及SystemC进行建模。

此外SoCLib平台还提供了多个嵌入式操作系统和用于进行系统调试、监控、设计空间探测的工具。

●SoCLib平台所提供的硬件IP模块均具有两种抽象层次模型,分别是:

CABA(CycleAccurateBitAccurate)模型和TLM-DT(TransactionLevelModelingwithDistributedTime)模型。

●SoCLib平台所提供的各种IP模块的高抽象层次模型均采用VISA组织(VirtualSocketInterfaceAlliance)的IP标准化接口VCI(VirtualComponentInterface)进行封装,大大增加了IP模块的可复用性,可与任意的总线及片上网络协议进行互连。

●SoCLib平台所提供的所有模型以及工具均遵循LGPL开源协议,设计者可免费获取并根据设计需求对其进行修改、裁剪与扩充。

更多关于SoCLib的细节,可浏览SoCLib主页进行了解与学习。

主页地址:

www.soclib.fr

2.Motion-JPEG解码流程

Motion-JPEG是一种视频压缩编码格式,由一组连续的采用JPEG标准进行压缩的图像组成。

由于相比其他视频格式占用相对较少的存储空间,因此MJPEG目前已被数码照相机、便携式摄像机广泛采用,用于视频短片的编码。

在MJPEG中,每幅视频帧被单独捕获,并采用JPEG算法进行压缩。

JPEG是由联合图像专家组(JointPhotographicExpertsGroup)提出的有损图像压缩算法[2],使用有损压缩算法压缩所得图像质量将低于原始图像质量。

但采用JPEG算法压缩的图像,其质量损失使用肉眼几乎无法识别,并能获得较高压缩比。

JPEG压缩算法将图像分割为以8×8个像素为单位的像素块,然后将每个像素块从时域转换到频域之上,采用滤波器去除高频分量,最后使用哈夫曼编码方法将像素块编码二进制码流。

每个8×8的像素块称为宏块单元(MacroBlockUnit,MCU)。

压缩的码流由一系列原始二进制数串组成,并使用标记进行分割。

MJPEG的解码流程如图3所示。

这个解码流程分为:

哈夫曼解码(HuffmanDecoding)、反锯齿扫描(InverseZigzagScan)、反量化(InverseQuantification)、块重排(BlockReordering)、反离散余弦变换(InverseDiscreteCosineTransform,IDCT)五部分。

图3MJPEG解码流程

实验一构建基于SoCLib的单核SoC

实验目的与内容:

1.了解SoCLib平台工作原理。

2.掌握如何利用SoCLib定义一个单核SoC硬件平台,如何在该SoC平台之上添加其他硬件设备。

3.学习如何编写简单C程序以控制各种硬件设备。

4.在所定义的单核SoC上运行串行的Motion-JPEG程序。

5.分析MJPEG解码每部分在单核上运行所需要的时间,思考对该算法进行并行化。

实验步骤:

1.首先,利用实验平台所提供的一个最基本的单核SoC熟悉SoCLib的工作原理。

如图4所示,该单核SoC硬件平台由一个MIPSR3000处理器,一个存储器以及一个显示终端TTY组成。

这些硬件设备通过片上网络——GenericMicronetwork(GMN)进行互连。

图4基本单核SoC硬件平台

2.该基本单核SoC基于SoCLib实现的顶层文件top.cpp位于/projet_soc/TP/TP0/HW下。

建议学生仔细阅读该顶层文件,了解如何通过该文件利用SoCLib所提供的各种ESL模型组件搭建SoC验证平台,如何定义声明各种设备模块以及各设备模块之间如何连接。

3.在熟悉SoCLib工作原理和顶层文件top.cpp的组织形式后,在图5所示的单核SoC平台之上添加定时器VCI_TIMER、文件系统VCI_FDACCESS、帧缓存VCI_FRAMEBUFFER以及同步锁VCI_LOCKS等设备模块,修改后的单核SoC平台如图3所示。

图5修改后的单核SoC硬件平台

基于SoCLib添加各个设备模块时,应重点检查以下几个方面:

●设备模块与各种信号的声明是否正确?

●设备模块的初始化及各种参数的设置是否正确?

●各设备模块与互连网络及模块间信号的连接是否正确?

●各设备模块的内存映射(MemoryMapping)地址的设置是否正确?

●与互连网络连接的主设备、从设备数目设置是否正确?

注意:

使用SoCLib,每添加一个设备模块都会遇到上述问题,因此应该特别注意。

4.编写简单的C程序,控制所添加的各种设备模块的功能,以验证SoC系统各设备工作的正确性。

如何添加各设备模块以及如何使用请参见SoCLib主页中的相关信息:

VCI_TIMER:

http:

//www.soclib.fr/trac/dev/wiki/Component/VciMultiTimer

VCI_FDACCESS:

http:

//www.soclib.fr/trac/dev/wiki/Component/VciFdAccess

VCI_FRAMEBUFFER:

http:

//www.soclib.fr/trac/dev/wiki/Component/VciFrameBuffer

VCI_LOCKS:

http:

//www.soclib.fr/trac/dev/wiki/Component/VciLocks

5.对位于/projet_soc/TP/TP0/SW/mjpeg_seq文件夹下的MJPEG串行程序使用MIPS交叉编译器进行编译,移植到图3所示的单核SoCLib平台之上。

6.熟悉MJEPG的算法流程,思考该算法任务的并行性,通过仿真统计各子程序所用的时间,考虑如何进行架构改进及软/硬件划分。

建议利用TIMER模块,统计MJPEG串行程序每部分在MIPS3000上运行所需要的时间。

文件project_soc/TP/TP0_CORRECTION是第一个实验的正确结果,可参考。

下面是如何在TP0框架上添加TIMER、FDACCESS、LOCKS、FRAMEBUFFER四个模块的例子,供参考。

(一)硬件部分(Inyourworkingdirectory:

/projet_soc/TP/TP0/HW)

1.top.cpp

1)添加头文件:

#include"vci_locks.h"

#include"vci_timer.h"

#include"vci_fd_access.h"

#include"vci_framebuffer.h"

2)设置宏定义,关于fbuffer的:

#defineFBUFFER_WIDTH256

#defineFBUFFER_HEIGHT144

3)修改Mappingtable:

可将resetexceptextdata段最后一个参数改为true,将提高速度。

maptab.add(Segment("reset",RESET_BASE,RESET_SIZE,IntTab

(1),true));

 maptab.add(Segment("excep",EXCEP_BASE,EXCEP_SIZE,IntTab

(1),true));

 maptab.add(Segment("text",TEXT_BASE,TEXT_SIZE,IntTab

(1),true));

 maptab.add(Segment("data",DATA_BASE,DATA_SIZE,IntTab

(1),true));

并添加到Mappingtable中,下面参数的意义分别是:

名称,基地址,大小,索引,是否可缓存。

maptab.add(Segment("semlocks_seg",SEMLOCKS_BASE,SEMLOCKS_SIZE,IntTab(3),false));

maptab.add(Segment("timer",TIMER_BASE,TIMER_SIZE,IntTab(4),false));

maptab.add(Segment("fd_access",FD_ACCESS_BASE,FD_ACCESS_SIZE,IntTab(5),false));

maptab.add(Segment("frame_buffer",FBUFFER_BASE,FBUFFER_SIZE,IntTab(6),false));

4)添加Components,

修改参数:

soclib:

:

caba:

:

VciVgmnvgmn("vgmn",maptab,3,7,2,8);其中3和7与总线上挂的设备有关。

各个函数参数个数及意义不同,须参照函数定义,www.soclib.fr中有具体定义。

soclib:

:

caba:

:

VciLockssemlocks("semlocks",IntTab(3),maptab);

soclib:

:

caba:

:

VciTimertimer("timer",IntTab(4),maptab,1);

soclib:

:

caba:

:

VciFdAccessfd_access("fdaccess",maptab,IntTab

(2),IntTab(5));

soclib:

:

caba:

:

VciFrameBufferfbuffer("fbuffer",IntTab(6),maptab,FBUFFER_WIDTH,FBUFFER_HEIGHT);

5)声明Signals

添加:

sc_signalsignal_mips0_it0("signal_mips0_it0");程序漏掉了。

locks:

soclib:

:

caba:

:

VciSignalssignal_vci_semlocks("signal_vci_semlocks");//声明连接lock的target端口信号

timer:

soclib:

:

caba:

:

VciSignalssignal_vci_timer("signal_vci_timer");//声明timer的target端口信号

sc_signalsignal_timer_it("signal_timer_it");//声明timer中断端口信号

fd_access:

soclib:

:

caba:

:

VciSignalssignal_vci_fd_access("signal_vci_fd_access";//声明连接fd_access的target端口信号

soclib:

:

caba:

:

VciSignalssignal_vci_inv_fd_access("signal_vci_inv_fd_access");//声明连接fd_access的initiator端口信号

sc_signalsignal_fd_access_it("signal_fd_access_it");//声明连接fd_access中断端口信号

fbuffer:

soclib:

:

caba:

:

VciSignalssignal_vci_fbuffer("signal_vci_fbuffer");//声明fbuffer的target端口信号

 

6)添加Net-List,实现四个组件的相关连接

连接总线:

vgmn.p_to_initiator[2](signal_vci_inv_fd_access);//fd_access是一个控制模块,将其initiator信号一端与总线相连

vgmn.p_to_target[3](signal_vci_semlocks);//将lock的target信号一端与总线相连

vgmn.p_to_target[4](signal_vci_timer);//将timer的target信号一端与总线相连

vgmn.p_to_target[5](signal_vci_fd_access);//fd_access也是一个target模块,将fd_access的target信号一端与总线相连

vgmn.p_to_target[6](signal_vci_fbuffer);//将fbuffer的target信号一端与总线相连

locks:

semlocks.p_clk(signal_clk);//连接时钟信号

semlocks.p_resetn(signal_resetn);//连接复位信号

semlocks.p_vci(signal_vci_semlocks);//将lock的target信号另一端与lock模块相连

 

timer:

timer.p_clk(signal_clk);//连接时钟信号

timer.p_resetn(signal_resetn);//连接复位信号

timer.p_vci(signal_vci_timer);//将timer的target信号另一端与timer模块相连

timer.p_irq[0](signal_timer_it);//将timer的中断信号一端与timer模块相连,另一端是挂起的,在此实验中未用到

fd_access:

fd_access.p_clk(signal_clk);//连接时钟信号

fd_access.p_resetn(signal_resetn);//连接复位信号

fd_access.p_vci_target(signal_vci_fd_access);//将fd_access的target信号另一端与fd_access模块相连

fd_access.p_vci_initiator(signal_vci_inv_fd_access);//将fd_access的initiator信号另一端与fd_access模块相连

fd_access.p_irq(signal_fd_access_it);//将fd_access的中断信号一端与fd_access模块相连,另一端是挂起的,在此实验中未用到

fbuffer:

fbuffer.p_clk(signal_clk);//连接时钟信号

fbuffer.p_resetn(signal_resetn);//连接复位信号

fbuffer.p_vci(signal_vci_fbuffer);//将fbuffer的target信号另一端与fbuffer模块相连

(注:

原文件中有错误,请将mips0.p_irq[0](signal_tty_it)换为:

mips0.p_irq[0](signal_mips0_it0);)

 

2.segmentation.h

将#defineDATA_BASE0x20000000

修改为#defineDATA_BASE0x20000000

修改segmentation.h文件,添加四个组件的段地址和大小:

#defineSEMLOCKS_BASE0xC1000000

#defineSEMLOCKS_SIZE0x00000400//256locks

#defineTIMER_BASE0xC2000000

#defineTIMER_SIZE0x00000100//1seultimer

#defineFD_ACCESS_BASE0xC3000000

#defineFD_ACCESS_SIZE0x00001000

#defineFBUFFER_BASE0xC4000000

#defineFBUFFER_SIZE0x01000000

3.platform_desc

修改platform_desc文件,注册要用到的模块

添加下面四行:

Uses('vci_timer'),

Uses('vci_fd_access'),

Uses('vci_framebuffer'),

Uses('vci_locks'),

(二)软件部分(Inyourworkingdirectory:

/projet_soc/TP/TP0/SW)

1.fetch.h文件(/SW/mjpeg_seg/headers/fetch.h)

1)将

movie=fopen("/fd/"--TODOYOURPATHTOTHEIMMAGE--"/ice_age_256x144_444.mjpeg","r");

路径修改为:

movie=fopen("/fd/home/vlsi/Programfiles/projet_soc/TP/TP0/SW/mjpeg_seq/images/ice_age_256x

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1