NationalInstitute Of TecJanolOgy
参赛队员:K.V.Viek
V.Packiaraj
Gajula’Venu
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、系统概述
为了使用Nios片上系统(S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0C)开发包来实现JPEG编码器/解码器,本文提出了两种优化的方案,并将使用这些方案所获得的性能与只使用Nios处理器内建(In-Built)指令的性能进行比较。在这两种方案中,通过包括附加用户定义块的方法强化Nios处理器的指令集,以实现硬件密集型功能。在第一个方案中,采用单任务处理方法,即在某一时段要么执行Nios核,要么执行用户自定义块。在第二种方案中,用户定义的块设计成为并发执行多个任务。仅使用Nios处理器内建指令的系统实现已经完成,为DCT开发的用户定义块的系统实现也已经完成。从实现的结果来看,我们发现使用为DCT。开发的用户定义块方法比只使用Nios内建指令集的方法速度提高了785倍。编码器其他子系统的用户定义块也正在实现中,在Nios的基础上通过用户自定义块实现。本文采用的技术也适用于其他需要在软件和硬件之间进行折中的系统。
二、功能说明
随着集成高容量RAM的高密度FPGA的出现,以及作为核的一部分的软核处理器,例如Nios处理器的实现,使完全片上系统(SOC)的实现成为可能。由于SOC的软处理器核的可用性,使用户在器件制造完成后能决定用于某个特定的设计的处理器数量。SOC在两个方向上应用能有效发挥其作用:微控制器或RISC处理器在进行控制和决策操作上十分有效。FPGA则在数字信号处理操作方面效率比较高。根据不同应用的需求,将FPGA核划分为DSP功能和微控制器功能可能是一种有效的实现方法。像System On Programmable Chip(SOPC)Builder这样的软件提供了集成化的开发环境。包括两种语言的程序,也就是高级语言指令和用硬件描述语言实现的用户定义块的指令可以综合到一起,然后编译、下载到可编程芯片中。
SOPC Builder让我们有二种不同的系统设计方法。第一种方法,整个系统的程序完全用C语言写成,然后编译,下载到可编程芯片上。这种方法用于对时间要求不严格(Critical),但较复杂并且将是单机工作的系统。它允许用现有的“C代码”来代替重用标准的函数。此外,这种方法不需要同时精通器件构造和HDL编程的程序员。第二种方法对时要求严格的应用系统来说,用C写的程序调用用户定义的函数,这些函数可以是知识产权(IntellectualProprietary,IP)核,或者是HDL写的程序。IP核会使操作速度更快并花费较少的精力在程序开发上,用户只需知道输入和输出的数据格式和信号就可以了。第三种方法足用户定义块开发,使并行执行多条指令成为可能。用C写的程序将数据分发到不同的助能单元中,同时收集结果并给它们输入更多的数据。当运行C代码的核处理器不需要与功能单元交互时,它在空余时问也分担工作量(Workload),这种方法需要深入理解器什的结构和实现算法以及并发所需的握手方案。但足这种方法可以更好地利用资源,有更快的速度和更少的面积需求。
本设计中,为实现基于SOC的JPEG编码器/解码器,我们使用了以上所有三种方法,但是我们没有使用IP核,而为计算密集型函数开发了我们自己的块。
JPEG是联合图像专家组开发的图像压缩标准。选择JPEG标准作为实现Excalibur kit的动机是:JPEG包含一些块,其中一些可以用软件有效地实现,另一些则可以用硬件实现。
Excalibm kit[l]含一个与FPGA在一起的嵌入式Nios处理器,这使该处理器成为在SOC 上实现JPEG的理想平台。
三、系统构成
GPEG编码方案如图l所示。假设图像分辨率为640×480像素,每个框图执行的函数如下:
(1)块准备:给定的大小为640×480的彩色图像矩阵,将其分为三个矩阵,分别为亮度矩阵(Y),每个的人小为8×8,共4800个;剩下的分化为两组1200矩阵,每个人小为8×8,它们分别被叫做同相矩阵(I)和正交矩阵(Q)。使用等式①把红、绿、蓝(RGB)分量映射到Y、I、Q分量上:
这样做足为了获得数据压缩。我们的眼睛在彩色(色度)信息上的分辨率要差于亮度(Y) 信息,因此全图像矩阵映射到Y矩阵上。I和Q矩阵表示的色度信息是通过在X和Y轴上以2倍因子减少图像矩阵的尺寸获得的。
(2)离散余弦变换和量化:长度为M的序列x(n)的一维离散余弦变换为
其中X()为第K个变换系数。
类似地,x(n)为采样序列的第n个数据,可以按照如下的.DCT系数表示:
其中:
对每一个8×8矩阵Y、I和Q分量计算DCT。要计算2D DCT,先对矩阵每一行计算lD DCT,然后对结果矩阵按列进行lD DCT计算。DCT具有良好的能量压缩性质,因此在8×8的DCT系数矩阵F(u,v)中(如图2所示),仅有左上角的元素对应的值才是重要的值。沿行和列的系数阶越高,对应的频率分量就高,仅需要更少的数量级即可复制其本身,这是因为我们的眼睛的高频响应很差。根据其重要性,不同的系数被赋予不同位数。在质量因子为2的条件下,量化矩阵Q(u,v)如图3所示。
量化DCT系数,Fq(u,v)可以从如下等式中获得:
在量化后,如图4所示,63个AC系数会以Z字形扫描的顺序读出。Z字形扫描顺序保证,在下一个阶段,也就是熵编码阶段,不太可能为零的低频系数要比高频系数先读出。表示64幅图像采样平均值的DC系数使用预测编码技术来编码。使用预测编码的原因是DC系数常常与临近的8×8块强相关。因此,对DC之间的差值进行编码比对DC系数本身编码能获得更高的压缩率。
图4使用游程长度编码的Zig—Zag顺序
设用DCi和DCi+1分别表示块i、i—l的DC系数,DC可以用等式⑤给出
Dc="DCi"—DCi-1
(3)游程长度编码(Run Length Coding)。非零的DC系数使用2个码元进行码。码元1代表DC系数最小的比特数,码元2指实际的Dc系数。对零DC系数来说,只使用码元1口.其值为零。AC系数游程长度编码总是使用两个码元:码元l指存非零AC系数之前,在表示AC系数所需的最小比特数之后,AC系数连续零值的个数;码元2值表示实际的Ac系数。
(4)霍大曼编码。对DC和AC两个系数来说,码元1用变K码(VLC)编码,这足从霍大曼表集得到的,码-兀2使川变K整数码(VLI)编码,其比特长度由图5给出。
图5码元2的变长整数码
四、设计描述
在使用ALTER_A Nios嵌入式处理器时,时问要求严格的软件算法可以通过向Nios指令集中添加定制指令来进行加速。对组合操作和时序操作来说,定制指令可以存单周期内完成复杂的操作仃务。就组合逻辑电路而言,数据读入后的时钟剧期数为l,如果是最坏情形下的组合逻辑电路,延迟<(1/处理器时钟频率)。如果这种条件不真,那么结果读}H后的时钟周期数可以根据特定逻辑电路的关键路径延迟的先验知识给出。
另外,用户添加的定制逻辑电路可以访问存储器和/或访问Nios以外的逻辑电路。使用定制指令,复杂的标准指令程序可以简化为一条指令在硬件中实现。这种特性可以有多种用途,包括在运算密集型(Computation—Intensive)情况下的应用。从SOPC Buildei-町以访问Nios CPU配置向导(Configuration Wizard),它提供了图形用户界面,f叮以向开发板卜的Nios处理器添加多达5个定制指令。
有了定制指令,定制定义的功能可以添加到Nios处理器的算术逻辑单元(ALU)和指令集中。定制指令包括两个基本要素:
(1)定制逻辑块:按照用户定义的操作运行的硬件。Nios可以包括多达5个定制逻辑块,如图6所示,这些块成为Nios微处理器的算术逻辑单元的一部分。
(2)软件宏:允许系统设计师通过软件代码存取定制逻辑。
图6 同算术逻辑单兀添加定制逻辑
1.DCT和逆DCT的定制逻辑块
在这个项目中,我们为DCT和逆DCT开发了定制指令。但是,基于Nios开发包的DCT运算的实现,同时使用软件和硬件方法,可以突出其硬件实现的速度优越性。计算DCT的两种方法所需的CPU时钟周期数会在下面的内容中给出。
一些实现DCT的技术包括FFT技术、分布式算术算法(Distributed ithmetic Algorithm)、使用三角恒等式的算法结构变换(Alg嘶th瓶c—Architecture Transformation)。本设计的实现使用了第三种技术,8点DCT组织框图如图7所示。
图7 8点ECT算法结构组织框图
DCT的代码用Verilog HDL开发并且用SOPC Builder综合到Nios ALU中。在我们添加定制逻辑块后,Nios配置向导自动编译(Build)宏。
2.使用C/C++定制指令
当使用C /C++定制指令时,定制指令可以通过函数调用访问。SOPC Builder产生的Nios系统头文件(excalibur.h)包括了C/C++的宏定义。有两种不同的C/C++宏,择一而用:
● 有前缀(prefix):nm_<name>_pfx(prefix,dataa,datab);
● 没有前缀:nm_<name>(dataa,datab)。
如果定制指令使用前缀端El(Port),惟一有效前缀输入是小于等于11位的立即值。如果C的宏不向前缀传值,那么定制逻辑前缀端L]就会载入零。
因此,要在C程序中运行综合到ALU的DCT定制逻辑块,我们用宏:
esult="nmdct"(datainl,datain2);
datainl和datain2是两个32位输入,一次给8个输入,4个8位数据连结成为datainl和datain2。这个DCT块被软件例程(Routine)反复调用,来计算8×8像素块的2D DCT。
3.并发执行的定制指令
当运算密集型块作为Nios定制指令将要被综合时,顺序(Sequential)块会需要很多的时钟周期以完成必需的功能。即使CPU和硬件块都是并发激活的(Active),Nios CPU也会一直等到硬件定制逻辑电路完成其操作,这会降低吞吐量(Throu曲put),在实时实现中也许是不可以接受的。
在本设计中,我们提出了一种新的方案,如图8所示。通过Nios处理器和定制逻辑之问的并发,本方案町以允分利用资源来减少运算所需的时间。
图8使用Nios和定制逻辑的并发执行方案
定制指令的运行可以分解成几个阶段:写操作数(Write Operate)和操作数号码(Operate Number),发出开始和复位信号,读操作数(Read Operate)。每个指令阶段仅需一个单时钟周期。当定制指令将要执行时,首先输入数据一个接一个地灌入到输入寄存器文件(File)中。接着发出重置信号和开始信号来启动运算;到一个预置时钟周期数后,计数器停止运算过程。在读阶段,处理器呵以读结果。当在SOPC Builder中添加定制指令时,我们需要处理定制块的结果,周期计数的数置为1。
例如要做8×1的DCT,也许需要用8个时钟周期来写操作数,然后发出重置信号和开始信号。假定DCT用5级流水线,在5个周期以后,计数器中止操作,现在处理器可以读结果和重新启动整个过程。流水线技术也允许一组数据一个接一个地处理,计数器的中止计数值也应适当调整。
由于输入寄存器的文件和输出寄存器的文件是定制逻辑的一部分,故没有必要由单独的仲裁来将数据输入定制逻辑或将结果从定制逻辑中取出。这里的开销是需要额外的存储器来存储寄存器文件中的输入/输出数据。
五、系统特点
在Nios处理器中,开始使用内建指令实现JPEG译码器的所有块。对8×8的子图进行处理的各个块的软件实现所需的计算时间在表l中给出。就DCT块而言,分别使用定制指令和仅使用内建指令所需的运算时间由表2给出。需要注意的是,定制指令可以提高速度785倍。一些编码程序执行后的结果的截屏(Snap Shot)在附录中给出。
六、总结
在本设计中,考虑了硬件实现DCT、软件实现量化和熵编码,建议采用浮点乘法器的定制逻辑来实现量化,此模块的性能将与使用处理器内建乘法指令相比较。
有两种方案可以实现硬件的霍夫曼编码:一种采用查表的方法;另一种用树编码的方法。这些实现结果和性能可以和软件实现进行比较。
此外,结合常系数乘法(Constant Coefficient Multiplication,CCM)或流水线分布式算术结构(Pipelined DAA(Distributed Athmetic Architecture)),编码的DCT块可以被进一步改进为实时数据通路单元“乘法器”。
我们已经测试了以上所有8×8图像子块的块。为了将这些块扩展成为适合于任意大小的图像,PC和Nios板之间的通信可以改进一些,以提高性能。
定制逻辑块并发执行方案的实现和Nios核打算在将来完成。
高级个人数字助手(PDA)可能包括因特网浏览和聊天功能,它通过访问端口有线或无线接入因特网,这可能需要对从因特网下载的图片进行译码或者对从数码相机获取的图像进行编码。当JPEG编码器/译码器完全实现时,它可以用SOC实现,作为一个附加特性加入到PDA中。
一些JPEG编码器块也可以用到MPEG(运动图像专家组)编码器中,从而,MPEG2编码器的实现的可行性可以作为本工作的扩展进行研究。更进一步,本文开发的方法也可以用于诸如语音到文本(Speech一Text)、目标识别、签名验证系统。
附:不同块的截屏
(1)软件实现的量化。
(2)基于Nios的z字形扫描的软件实现。
(3)基于Nios的游程编码的软件实现。
(4)基于Nios的霍夫曼编码的软件实现。
(5)基于Nios的。DCI’软件实现。
(6)基于Nios的使用定制指令的DCT硬件实现。
文章评论(0条评论)
登录后参与讨论