版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1硬件(yn jin)加速器的设计(Verilog 1364-2001) - 建模、仿真(fn zhn)、综合、验证和实现 -北京航空航天大学 夏宇闻共一百二十九页2课时(ksh)安排和学习方法四次讲课每次3小时;下课后自己阅读材料在助教指导下做实验4小时;课堂 3 x 4 =12小时,自己看书(kn sh) 20 小时,做实验 20 小时,共计52小时;理论与实践结合的学习方法;考核方法:修改课上介绍的设计,使其具有更高的性能。共一百二十九页3讲课的主要(zhyo)内容硬件加速器的一般(ybn)概念为什么要研究硬件加速器设计硬件加速器基本方法: 流水线 和 硬件复制软件/硬件的划分原则算法核
2、心(Kernel) 多主设备共享内存系统共一百二十九页4讲课(jing k)的主要内容 设计举例 视频图像边缘检测 算法的原理卷积表算法的伪码表示中间(zhngjin)值和最终值的比特需求处理阶段的划分共一百二十九页5讲课(jing k)的目的提醒材料上容易忽略的内容;指出重点和关键点;帮助同学(tng xu)理解材料上的难点;自己看材料、上机练习为主;互相认识,以便交流。共一百二十九页6一般(ybn)概念在嵌入式DSP系统中,对处理器有很高的要求,编写专用的嵌入式软件,采用高档的DSP处理器芯片有时也无法达到系统对算法运算速度(sd)的要求,即使能达到性能价格比太差。 不得不设计专用硬件;
3、采用硬件复制和流水线方法;增加并行性;还需要控制成本。共一百二十九页7一般(ybn)概念 数据的互相依赖性;中间数据的保存;硬件的复制;用一个时钟在几个并行(bngxng)硬件中可同时完成多个操作;时钟的频率也可以提高。共一百二十九页8一般(ybn)概念步骤1步骤2步骤3寄存器寄存器寄存器图 流水线在复杂应用(yngyng)中要复合应用(yngyng)流水线和硬件复制方法共一百二十九页9 加速算法核心(kernel)引起的性能改善的量化 :设执行算法核心所占的时间比例(bl)为 f。则执行非算法核心的时间为(1- f ),因此有: t = ft + ( 1-f ) t 如果加速器能把算法核心的
4、处理速度提高到原来的 s 倍,则算法核心的处理时间就缩短到原来的1/s,非算法核心的处理时间不变。因此,这个算法总的运行时间为: t = ft/s + ( 1- f ) t 总体性能的提高比例是原来的处理时间除以加速后的处理时间: S= (ft+(1-f ) t) / ( ft/s+(1-f ) t ) = 1 / ( f/s+(1-f )这个公式称为Amdahl法则,是以Gene Amdahl的名字命名的,他是并行计算的先驱之一。这个公式表明加速处理核心(kernel)算法所带来的整体性能的提高在很大程度上依赖于算法核心在整个算法执行时间中所占的比例。 一般(ybn)概念共一百二十九页10
5、例1:假设在嵌入式处理器上运行的算法可以分成不同的部分,执行每一部分所花费的时间可以估算出来,而该算法可分为(fn wi)两个部分,即分成两个核心(kernel)算法,一个占总时间的80%,而另一个只占总时间的20%。若用一个硬件加速器来加速算法核心,我们将第一个算法核心的运行速度提高到原来的10倍,或者将第二个算法核心提高到原来的100倍,试问对哪个算法核心使用硬件加速器能对总体性能的提高产生更好的效果?解:对第一个算法核心进行加速处理所带来的总体性能提升为: 1 / (0.8/10)+(1-0.8) = 1/(0.08+0.2) =3.57 对第二个算法核心进行加速处理带来的总体性能提升为
6、: 1 / (0.2/10)+(1-0.2) = 1/(0.02+0.8) =1.25一般(ybn)概念共一百二十九页11 从结果对比可以看到,虽然(surn)第二个算法核心提高的运算速度是第一个的10倍,但是由于它在原来总运行时间里所占的比例较低,对其进行加速处理也只能带来较小的性能改善。而对第一个算法核心进行加速处理会对总体性能产生更显著的效果。所以我们在开始正式设计硬件时必须找到主要矛盾,即占总运行时间比例较高的部分,针对这部分算法程序进行硬件加速器的设计 ,以期望取得显著效果。一般(ybn)概念共一百二十九页12 在确定算法核心以后,我们需要确定执行计算步骤的顺序(shnx)。我们要确
7、保能得到数据,以便按顺序(shnx)处理,并且确保中间结果能够在后续步骤需要前计算出来。除了这些约束以外,有些运算步骤是可以潜在地并行执行的。因此,我们要确定哪些步骤可以通过并行执行来满足性能要求。然后再确定加速器的结构,即确定各个处理模块的功能以及它们之间的数据流动。一般(ybn)概念共一百二十九页13 从算法到加速器结构,是在系统设计流程的早期完成的。这通常是由有经验(jngyn)的系统设计师完成。让综合工具自动完成这一过程,面临很大的技术挑战。除了非常少的领域外,早期的高级综合工具并不成功。近来,新一代工具开始浮现,并且在很广泛的领域内表现出良好的前景,尤其在音频,视频,和其它的信号处理
8、领域。随着这种技术的成熟,我们可以期待高级综合工具在设计方法学中将会有更广泛的应用。一般(ybn)概念共一百二十九页14 在许多嵌入式系统中,需要处理大量的输入输出数据。I/O控制器必须在外部设备和嵌入式系统之间高速传输数据。数据从外部设备读入内存,就可以被嵌入式软件或加速器处理。处理后的数据被写到内存。如果读写内存数据都在处理器的控制下进行,那么,数据传输速度会很慢,并且占用大量处理器时间,使处理器无法执行其他任务。如果让I/O控制器和加速器直接发起对内存的访问而不通过处理器,势必可以大大加快(ji kui)访问内存的速度。这种内存访问方式称为DMA(Direct Memory Access
9、)方式。在这种方式下,I/O控制器和加速器作为主设备给出读写内存的地址和控制信号,或者通过DMA控制器发起对内存的访问,由DMA控制器给出地址和控制信号。一般(ybn)概念共一百二十九页15 系统中有处理器和DMA设备,并且共用内存访问通路,必须避免由于多个主设备同时访问内存而引起的冲突。为此,我们可以在系统中引入仲裁器(Arbiter),如下图所示。系统中的主设备(处理器,DMA方式的加速器、I/O控制器)在访问内存之前,必须给仲裁器发出请求信号,仲裁器根据预先确定的仲裁策略,在多个请求信号中决定谁将取得访问内存的总线控制权,并给得到总线控制权的设备发出访问内存的准许信号。当该设备完成(wn
10、 chng)对内存的访问后,便撤消请求信号。然后,仲裁器进入新一轮的仲裁,仲裁胜出的设备进行内存访问。我们也可以让处理器来执行仲裁器的功能。当其他主设备要访问内存时,必须先向处理器发出请求信号,由该处理器决定哪个设备可以访问内存。根据不同的应用场合,选择适合的仲裁策略,有优先级模式(赋予某个或几个设备更高的优先权),轮询模式(所有主设备严格按照一定的顺序取得内存访问权)。一般(ybn)概念共一百二十九页16 一般(ybn)概念 CPU 加速器 仲裁(zhngci)器 存储器图2 多主设备共享内存系统 I/O控制器request grant grant requestrequest grant共
11、一百二十九页17 在许多应用中,数据被有规律地放在内存中如占用连续的内存块,加速器把数据从内存中一块一块取出进行处理。例如处理静态和视频图像的几种算法把一帧图像分割成88或者1616的像素块,然后独立地处理每个块。这种块处理加速器的数据通路主要由两部分组成。其中一个部分以DMA方式访问内存。这部分电路根据处理器写入加速器内部寄存器的基地址产生后续地址。这一功能通常由地址计数器来完成。数据通路的另一部分对数据进行处理。控制部分按一定的时序(sh x)控制数据通路的打开和关闭,使数据有序、正确地流动。控制功能可以用一个有限状态机或多个状态机实现。一般(ybn)概念共一百二十九页18 与块处理加速器
12、相对应的是流处理加速器。流处理加速器处理的数据是按时间顺序达到的数据流。数据流可以是来自于高速的输入设备(如A/D、摄像机等),也可以是其他加速器的输出(shch)。此外,内存中的数据也能以流的方式读出,供加速器处理。流处理加速器最常见的应用领域之一是数字信号处理(DSP)。模拟信号经A/D采样后,得到采样信号的数据流。对数据的处理包括滤波、混合、放大/衰减、以及时域和频域间的转换。 一般(ybn)概念共一百二十九页19 虽然,加速器可以直接读取内存数据,并且把数据处理完后写回内存,但是加速器必须知道什么时候开始工作,待处理数据的起始地址(dzh),数据的大小,处理后数据的存放地址(dzh)以
13、及完成处理后通知处理器。也就是说,处理器必须能够控制加速器的工作、获取加速器当前的工作状态。这些功能通常是由加速器内部的输入输出寄存器来完成。 一般(ybn)概念共一百二十九页20 我们可以在加速器内部设置地址寄存器和数据长度寄存器,处理器通过向这些寄存器写入数据让加速器知道从何处读取数据、数据大小及处理完后数据写到何处。还可以有状态寄存器,处理器通过读取状态寄存器了解加速器当前的状态。也可以用状态寄存器的值产生申请中断信号,通知处理器。加速器可以看做是处理器的一个I/O设备,因此,处理器读写加速器的内部寄存器与读写一般(ybn)的I/O设备是一样的。一般(ybn)概念共一百二十九页21 有的
14、情况下,当处理器给加速器发出一个处理任务(rn wu)时,并不要求加速器立即响应。处理器把需要加速器处理的多项任务(rn wu)的描述信息写到先入先出队列(FIFO)中,加速器从FIFO中读取每件任务的描述信息,等准备好以后,就可以执行一项任务。一般(ybn)概念共一百二十九页22视频边缘(binyun)检测下面我们将用视频图像边缘检测加速器的设计作为例子,来说明加速器设计中几个方面(fngmin)的问题。真实的边缘检测加速器设计是非常复杂的,本书只是介绍加速器的设计原理,为了不被具体细节所累,我们在这两者之间做了某种程度的折中。 共一百二十九页23视频边缘(binyun)检测边缘(binyu
15、n)检测是分析视频图像的重要手段之一,并且应用领域广泛,像安全监控和计算机图形学等。边缘检测是确定一幅图像在哪些区域上亮度发生突变。这些亮度突变的区域通常就是物体的边缘。共一百二十九页24视频(shpn)边缘检测在这个例子中,我们假设有像素的图像,每个像素用8比特表示,按行存储在内存中,并且每一行里从左到右连续的像素点占据着内存中连续的存贮(cn zh)单元。像素值是无符号整数,范围从0(黑色)到 255(白色)。这里,我们采用一种相对简单的算法,叫做Sobel边缘检测法。它的机理是计算x和y方向亮度信号的导数值并且寻找导数中的最大值和最小值。这些区域就是亮度变化最剧烈的区域。 共一百二十九页
16、25视频(shpn)边缘检测Sobel检测法通过一个叫做卷积的过程来估计每个像素点每个方向上的导数值。把中心像素点和离它最近的八个像素点每个乘以一个系数(xsh)后相加。该系数(xsh)通常用一个 的卷积表(convolution mask)来表示。分别用于计算x和y方向导数值的Sobel卷积表 Gx和 Gy 如下图所示。共一百二十九页26视频边缘(binyun)检测 -10+1-20+2-10+1+1+2+1000-1-2-1GxGy共一百二十九页27视频(shpn)边缘检测我们把每个像素值分别乘以卷积表中对应的系数,再把相乘得到的九个数相加就得到了x方向和y方向的偏导数值 Dx和 Dy。然
17、后,利用这两个偏导数值计算中心(j sun zhn xn)像素点的导数。计算公式如下:共一百二十九页28视频边缘(binyun)检测由于我们只想找到导数幅值的最大值和最小值,对上式作如下简化:这样近似能够满足计算要求,因为开平方和平方函数都是单调的,实际(shj)计算幅度的最大值、最小值与近似以后计算的最大值、最小值发生在图像的同一个地方。并且,与计算平方和开平方相比,计算绝对值所用的硬件资源少得多。共一百二十九页29视频(shpn)边缘检测我们需要重复地计算图像中每个像素位置的导数幅值。但是,注意到环绕图像边缘的像素点并没有一个完整的相邻像素组来计算偏导数和导数,所以我们需要对这些像素进行单
18、独处理。最简单的方法就是把图像中边缘像素点的导数值(shz)值 |D|设置为0。这可以通过软件来完成。共一百二十九页30视频(shpn)边缘检测例2:把Sobel边缘检测算法用伪代码(di m)的形式表达出来,也就是,用一种与计算机编程语言类似的表示法。答:我们用类似于Verilog的伪代码来表示该算法。令Orowcol 表示原始图像的像素点,Drowcol表示导数图像的像素点,row的范围从0到479,col的范围从0到639。同时令Gxij 和 Gyij 表示卷积表,其中i 和 j 的范围从 -1 到 1. 共一百二十九页31视频边缘(binyun)检测该算法可以(ky)表达为如下形式:
19、for( row=1; row=478; row=row+1 ) begin for(col=1; col=638; col=col+1)begin sumx=0;sumy=0;for( i = -1; i = +1; i = i+1) beginfor (j = -1; j= +1; j = j+1) beginsumx = sumx + Orow+icol+j * Gxij;sumy = sumy + Orow+icol+j * Gyij; end end Drowcol = abs(sumx) + abs(sumy) end end共一百二十九页32视频(shpn)边缘检测例3:求在计算
20、(j sun)Sobel卷积中表示每个像素点中间值和最终值所需要的比特数。答:每个像素用8比特无符号数表示。像素值与卷积表中的系数相乘得到的九个部分积的范围从 -510到 +510。因此,部分积应该用10比特有符号数表示。求出每个 Dx和 Dy的值需要把各自的九个部分积相加。 共一百二十九页33视频边缘(binyun)检测 结果值的范围是从-1020到1020,可以用11比特有符号 数表示。然后(rnhu),再把这两个绝对值相加,得到 |D| 的范围从0到2040,也可以用11比特表示。因为后续的边缘检测操作只需要确定哪个导数图像的像素值超过了特定阈值,我们并不需要11比特的精确度。相反,用8
21、比特值来衡量结果更为方便,因为8比特的结果可以像原始图像一样以相同的格式回送到内存中。在这两者之间做了某种程度的折中。 共一百二十九页34视频(shpn)边缘检测例4 :假设视频的帧速为每秒30帧,计算必须以多快的速度计算Sobel卷积。答:每帧图象包括640480 = 307,200 个像素(xin s)。因为每秒有30帧,必须以: 307,20030 = 9,216,000 每秒的速度对像素点进行处理,换言之,大约每秒1000万个像素。共一百二十九页35视频(shpn)边缘检测例5:确定能够满足所要求(yoqi)的计算性能的并行结构方案。答:既然计算只需要原始图像的像素值,因此求解每个导数
22、像素所必须的计算可以各自独立地进行。因此,我们可以按照要求同时对尽可能多的像素进行计算。下图给出了计算图像的导数像素的全过程。 共一百二十九页36视频(shpn)边缘检测 计算导数像素的数据(shj)关系图共一百二十九页37视频边缘(binyun)检测这张图展示了每个操作步骤所需要的数据,从原始图像的顶部像素开始,通过独立并行操作得到中间结果,最后求出底部的导数像素。我们已经省略了系数值是0的部分积,因为它们对结果没有任何影响(yngxing)。通过这幅图,我们看到可以并行地计算所有的部分积,因为每个部分积只依赖于原始像素值和常量系数。然后我们可以并行地把两组各六个部分积加起来,再并行地计算两
23、个绝对值,把它们加起来最后得到(原始图像某个像素的)导数像素值。共一百二十九页38视频(shpn)边缘检测包括边缘检测加速器在内的视频系统的顶层框图如图5所示。视频输入来自摄像机的I/O控制器,它把连续的视频图像保存(bocn)在内存中。在处理器上运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。 图5含有边缘检测加速器的视频系统这 共一百二十九页39视频边缘(binyun)检测例6:假设存储原始图像和导数图像的内存是32位宽,并且每个字节是单独编址的。视频图像是按照每个像素一个字节存储的。一帧里一行的像素从左到右依次存储在连续的地址空间,并且所有行是从上到下,一行接一行地存储。每
24、次内存读写需要花费20纳秒,即需要 100MHz系统时钟的两个周期。问内存存取数据的速度是否足够块?解:前面(qin mian)的分析指出,摄像机以大约每秒1000万个像素的速度到达,即每100纳秒收到一个像素。如果视频输入控制器用一次单独的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的20%。更好的办法是控制器把四个像素值合起来,用一次写操作来存储这些像素,这样就可以把对内存带宽的占用减少到5%。共一百二十九页40视频边缘(binyun)检测边缘检测加速器必须以输入像素到达的同样速度计算(j sun)出导数像素值,换言之,每100纳秒输出一个导数像素值。因此,假定每四个导数像素合成
25、一个32比特的值,则把计算出的导数像素值写入内存又消耗内存带宽的5%。计算每个像素需要从原始图像中取出8个像素值。一个天真的想法是一次只读取一个像素分多次读取,并且计算后续像素的导数值时再次照此方法读取。这个方案完成每个像素的计算需要进行8次(中心像素点周围的8个像素)读取,占用160%的内存带宽。显然这是不可能实现的。 共一百二十九页41视频(shpn)边缘检测 因为内存中每个32位字包括了四个相邻的行像素,每次读取32位字,包含了尽可能多的像素,可减少所需要的带宽。如果每一行里的三个像素点在同一个32位字中,读取三行的像素只需要三次。如果每一行里的三个像素点在不同的字中,则读取完整的三行像
26、素需要6次。所以,计算每个像素的导数值平均(pngjn)需要4.5次读操作,占用90%的内存带宽。这个方案还是不可行。 共一百二十九页42视频(shpn)边缘检测注意,原始图像的像素,一旦被读取,就可以用来计算该像素的后一列,本列和前一列中三个像素的导数,这样(zhyng)可以进一步减少所占的内存带宽。所以,我们可以把读取的原始图像的像素存储在加速器中用于计算多个像素的导数,而不是等到需要计算那些像素的导数值时再重新读取一遍。这样,每计算四个像素,只需要读取三个字,即只需要15%的内存带宽。则读取三行像素所需的15%内存带宽再加上把视频图像存入内存所需的5%,以及把像素导数值写入内存所需的5%
27、 带宽,共占用25%的内存带宽。我们假设剩下75%的内存带宽足以完成系统的其它操作,则这个方案是可行的。 共一百二十九页43视频边缘(binyun)检测若需进一步减少加速器所消耗的带宽,可以在加速器中加入小块内存来存储从主存中读取的一整行。这可以让每个像素只被读取一次,把读取像素所要求的带宽减少到只有5%。视频输入和边缘检测(jin c)将总共只占用15%的可用带宽。 共一百二十九页44视频(shpn)边缘检测在设计边缘检测器加速器时,我们将采用以下(yxi)方法:从原始图像中读取三行,每行4个相邻的像素,把这些像素值存储在加速器的寄存器中以待处理。我们把原始图像的三整行作为一个数据块,整块的
28、数据经过加速器以后,形成导数图像中的一整行。正如我们后面要介绍的,这样的数据块的处理过程包括三个阶段:起始阶段,重复计算阶段,和完成阶段。不断地重复执行这三个阶段,就可以求出导数图像中的每一行。 共一百二十九页45视频(shpn)边缘检测 Sobel加速器的数据路径结构如图6所示。它实质上是一个这样的流水线,先从原始图像中依次读取三行像素值存入图右上角的寄存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向下流过加法器到达 Dx和 Dy寄存器,再通过绝对值电路和加法器到达 |D| 寄存器,最终进入图左下角的寄存器。然后把计算得到的像导数素值从寄存器写到内存中。(尽管一个从右到左的数据流和通
29、常情况是相反(xingfn)的,但在本例中,这样有助于保持像素的位置安排和原图像一致)。我们将先假设流水线从一开始就充满有效数据来描述流水线的操作过程。然后再讨论在图像行的起始处流水线是如何启动的,和在图像行的结尾处,流水线中的数据又是如何排出的。 共一百二十九页46视频(shpn)边缘检测图6 Sobel加速器数据通路结构(jigu)共一百二十九页47视频(shpn)边缘检测计算流水线按照每四个像素值一组的形式产生给定行的导数(do sh)像素值。加速器从内存中的上一行,本行,下一行各读取四个像素点到如图6所示右上角的3个32位寄存器中。每个寄存器包括4个8比特像素值寄存器。在接下来的四个时
30、钟周期里,像素值依次左移,每次一个像素值,到乘法器阵列中。阵列中的每个单元包括一个像素值寄存器和一个或两个乘法电路。乘法电路用于把像素值寄存器中存储的像素值乘以一个常量系数。 共一百二十九页48视频(shpn)边缘检测 因为系数都是-1,+1,-2或者+2,这些电路并不是完全意义上的的乘法器。相反,乘以-1仅仅是一个取反电路,乘以+1是一个直通连接而没有任何电路,乘以-2是把取反电路的结果左移,乘以+2仅仅是一个左移。在每个时钟周期,硬件电路阵列提供了求一个导数像素值所需要(xyo)的部分积,部分积加起来后存储到 Dx和Dy 寄存器中。同样,在每个时钟周期,计算出前一个像素值的Dx 和Dy的绝
31、对值,加起来后存储到 |D| 寄存器中。|D| 寄存器中的导数像素值左移到结果行寄存器中。当寄存器中四个结果像素值都准备好后,随即被写入到内存中去。 共一百二十九页49视频边缘(binyun)检测进入稳态后,在处理一行的过程中,加速器在移入新的像素值到乘法法器阵列 ,Dx,Dy和 |D| 寄存器之前,需要把导数像素值从结果寄存器写到内存中。否则,上一次计算结果就会被覆盖掉。在把四个像素值写到内存后,读寄存器中的像素值已经(y jing)全部移入流水线中,此时读寄存器为空。我们再读入三组各四个像素点,像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素值后,再次写到内存 然后不断重复这个过程
32、。时序如图7所示。假设加速器有一个Wishbone总线接口,数据位宽32位,时钟频率为100MHz。加速器是内存总线的主设备之一,它必须先给仲裁器发出访问内存的请求信号,等总线仲裁器批准以后,才能读写内存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以占有需要的内存带宽。 共一百二十九页50视频边缘(binyun)检测图7流水线中像素(xin s)读写操作和计算的时序共一百二十九页51视频(shpn)边缘检测我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考虑在一行像素的开始处流水线是如何启动的。在处理一行像素的开始处,流水线中的寄存器中没有有效的数据(shj)。我们先读入三行各四
33、个像素值,经过四个计算周期(4个时钟周期)后,有效数据已经进入到流水线中的Dx和 Dy寄存器。此时,结果寄存器中没有有效数据。因此,在经过第一次四个计算周期后不进行写操作。由于读寄存器已空,再读入三行像素值,经过四个计算周期后,有效数据已经进入到最右侧的三个结果像素值寄存器中。最左侧的结果像素值寄存器里仍然是无效数据。我们前面曾经提过,最左边的像素位置没有一组完整的相邻像素点来计算导数像素值,我们将用软件把它设为0。所以,得到的第一组导数像素值(一个无效值和三个有效值)应该写入内存中。此后,流水线进入了稳态,这种情况前面已经讨论过。共一百二十九页52视频边缘(binyun)检测当到达一行的结尾
34、,我们需要排出流水线中的数据。因为一行里像素点的个数是4的整数倍(640 =1604 ),我们每次都可以(ky)读到包含四个像素值的完整组。当我们把一行里最后四个像素读入读寄存器,经过四个计算周期后,结果寄存器被移入四个新的结果值,同时读寄存器中的像素值被全部移入流水线中。然后结果寄存器被写入内存。由于整行像素已经被读完,不执行读操作。此时,流水线中还有数据,再执行四个计算周期排出流水线中的数据。经过这四个计算周期,结果寄存器被移入四个数据,但是寄存器中最右边的数据是无效数据。因为图像最右边的像素点没有完整的相邻像素组。我们还将用软件把那个像素值清零。 共一百二十九页53视频边缘(binyun
35、)检测例7: 编写Verilog寄存器传输级代码来描述图6的数据通路。答:定义Sobel加速器模块的Verilog代码如下:/计算数据通路信号(xnho)reg31:0 prev_row, curr_row, next_row;reg7:0O-1:1-1:1;reg signed 10:0Dx, Dy;wire signed 10:0 D;reg7:0abs_D;reg31:0result_row;/可进行计算的数据通路always(posedge clk_i) /上一行寄存器if(prev_row_load) prev_row= dat_i;else if(shift_en) prev_ro
36、w31:8 = prev_row23:0; 共一百二十九页54视频边缘(binyun)检测 always(posedge clk_i) /当前(dngqin)行寄存器if(curr_row_load) curr_row= dat_i;else if(shift_en ) curr_row 31:8=curr_row23:0;always(posedge clk_i) /下一行寄存器if(next_row_load) next_row=dat_i;else if(shift_en ) next_row 31:8=0 ? x : -x ;endfunction/计算流水线assign D = ab
37、s(Dx) + abs(Dy);always (posedge clk_i) if ( shift_en ) beginabs_D = D10:3;Dx = -$signed(3b000, O-1-1) /-1* O-1-1 +$signed(3b000, O-1+1) /+1* O-1+1 -($signed(3b000, O 0-1) 1) /-2* O 0-1 +($signed(3b000, O 0+1) 1) /+2* O 0+1 -$signed(3b000, O+1-1) /-1* O+1-1 +$signed(3b000, O+1+1); /+1* O+1+1 共一百二十九页5
38、6视频边缘(binyun)检测 Dy = $signed(3b000, O-1-1) /+1* O-1-1 +($signed(3b000, O-1 0) 1) /+2* O-10 +$signed(3b000, O-1+1) /+1* O-1+1 -$signed(3b000, O+1-1) /-1* O+1-1 -($signed(3b000, O+1 0) 1) /-2* O+1 0 - $signed(3b000, O+1+1); /-1* O+1+1 O-1-1 = O-10; O-1 0 = O-1+1; O-1+1 = prev_row31:24; O 0-1 = O00; O
39、0 0 = O0+1; O 0+1 = curr_row31:24; O+1-1 = O+10; O+1 0 = O+1+1; O+1+1 = next_row31:24; endalways(posedge clk_i)/结果(ji gu)行寄存器if(shift_en) result_row= result_row23:0, abs_D ;共一百二十九页57视频(shpn)边缘检测模块中前三个always块表示(biosh)三个寄存器组(每个寄存器组由四个8比特的寄存器组成),从内存中读取的每组四个像素值被加载到这三个寄存器组中。因为这些寄存器要通过依次读取内存来加载数据,所以每个寄存器组
40、有一个单独的控制信号来控制数据的加载。同时,三组寄存器都并行地把一个像素值移出寄存器,进入流水线中,所以它们共用一个移位控制信号。 共一百二十九页58视频(shpn)边缘检测第四个always块,描述加速器的计算流水线。所有的计算逻辑和寄存器移位操作都在控制信号shift_en控制下进行。信号O是一个的原始图像像素阵列(类似于C语言中的二维数组),该阵列(数组)中的每个元素对应一个寄存器。从图6可以看到,下标为-1+1的元素,是寄存器阵列的前一行(prev row),下一列(最右列)的像素值。阵列中的元素值都是由每个输入寄存器最左边8位向左移入阵列的。Dx和 Dy值由阵列元素乘以对应系数计算出
41、来的。我们通过前面分析得出,Dx,Dy的范围是从-1020到1020,用11比特有符号数来表示。因此(ync),我们把每个原始像素扩展成11比特,并转换成有符号数再进行计算。共一百二十九页59视频边缘(binyun)检测最后一个(y )always块,在shift_en控制下8比特的计算结果被从右至左依次移入32比特结果寄存器。当结果寄存器被移入32比特数据时,其值将被一次写入内存。共一百二十九页60视频(shpn)边缘检测我们在前面曾提到块处理加速器必须有地址产生和数据处理电路。加速器作为系统中的主设备,必须提供读写内存的地址信号。我们设计的Sobel加速器也需要地址产生电路来给出读取原始图
42、像像素所需的地址,以及写入导数像素所需的地址。在加速器内部,我们将会提供两个寄存器,以便嵌入式软件可以把原始图像和导数图像在内存中的基地址写入这两个寄存器。地址产生电路可以用寄存器中的基地址自动地产生像素地址。我们要求所有(suyu)的地址是按字排列的,也就是说,它们都是四的整数倍。这意味着地址的最低两位总是00。共一百二十九页61视频边缘(binyun)检测例8: 假设一幅图像在内存中的基地址(dzh)为B,请推导出计算图像的第r行第c列的像素值地址的表达式。行列都从0开始编号。答:图像尺寸是480行,每行640个像素。第r行的起始地址是: B + r 640 那么,r行c列的像素点位于地址
43、: B + r 640 + c我们可以把表达式 r 640 + c 看作基地址的地址偏移量。共一百二十九页62视频(shpn)边缘检测例9: 假设内存的大小是4M字节,组织成 1M32比特。请你为Sobel加速器设计能自动选通存储地址(数据通路)的电路。答:地址产生电路需要两个基地址寄存器:原始图像基地址寄存器O_base和导数图像基地址寄存器D_base。因为像素值按四个一组存储,地址的最低两位总是0,所以不需要在地址寄存器中显式地给出这两位地址。有几种方案可以得到读/写地址,包括采用计数器对图像行和列进行计数,利用行和列的计数值(shz),根据例8推导的公式来计算像素地址。但是这种方法引入
44、了乘法运算(r640),实现起来会消耗较多的硬件资源。然而,我们可以仅仅对基地址的偏移值进行计数,这样就可以避免乘以640的操作,见图8所示。共一百二十九页63视频边缘(binyun)检测图8 地址产生(chnshng)电路共一百二十九页64视频边缘(binyun)检测对于原始图像,偏移值从0开始计数。从内存中每读取一组四个像素值,偏移值加1。把偏移值和基地址加起来形成前一行(prev row)的像素组地址。前一行的像素组地址加上640/4形成当前行(curr row)的读地址。前一行的像素组地址加上1280/4形成下一行(next row)的读地址(假设地址的最低两位都是00)。图象的像素点
45、总共有480行640列,前一行(prev row)像素的地址加上640/4后,与原地址正好(zhngho)差了一行的位置;加上1280/4后,正好相差两行的位置。根据这两个地址从内存中读取的像素值正好就是用Sobel卷积表计算当前行像素导数值所需要的当前行和下一行的像素值。对于导数图像,我们从偏移值640/4开始计数,依次加1形成每次的写地址。图中的多路器根据当前操作要求选择适当的计算地址来驱动内存地址总线。共一百二十九页65视频(shpn)边缘检测例10 : 编写寄存器传输(RTL)级的Verilog代码描述如图8所示的地址产 生电路。解决方案:Sobel加速器模块定义(dngy)中的地址生
46、成电路的代码如下: always (posedge clk_i) / 原始图像基地址寄存器 if(O_base_ce) O_base = dat_i21:2; always(posedge clk_i) / 原始图像地址偏移量计数器if(offset_reset)O_offset= 0; else if(O_offset_cnt_en) O_offset= O_offset+1;共一百二十九页66视频边缘(binyun)检测assign O_prev_addr = O_base + O_offset;assign O_curr_addr = O_prev_addr + 640/4;assign
47、 O_next_addr = O_prev_addr + 1280/4;always(posedge clk_i) /导数(do sh)图像基地址寄存器if(D_base_ce)D_base =dat_i21:2;always(posedge clk_i) /导数图像地址偏移量计数器if(offset_reset)D_offset = 0;else if (D_offset_cnt_en) D_offset = D_offset+1;共一百二十九页67视频边缘(binyun)检测assign D_addr = D_base +D_offset;assignadr_o21:2 = prev_ro
48、w_load ? O_prev_addr : curr_row_load ? O_curr_addr : next_row_load ? O_next_addr : D_addr ;assign adr_o1:0 = 2b00;共一百二十九页68视频(shpn)边缘检测第一、三个always块把分别(fnbi)表示原始图像基地址寄存器和导数图像基地址寄存器。当处理器要把原始图像基地址或导数图像基地址写入其中一个寄存器时,O_base_ce或D_base_ce有效,数据总线上的数据就被加载到相应的地址寄存器。第二、四个always块描述原始图像和导数图像地址偏移量计数器。计数器的控制信号由控制电
49、路部分提供。图8中的四个加法器分别由四条assign赋值语句实现。分别产生O_prev_addr,O_curr_addr,O_next_addr和D_addr。最后,通过一个多路器在产生的四个地址中选择一个作为输出地址。共一百二十九页69视频边缘(binyun)检测我们在前面曾经提过,处理器需要提通过读写加速器内部的寄存器来控制加速器的工作、了解它的状态。这时处理器是主设备,加速器是从设备。处理器和加速器的这种交互功能是由加速器的从机接口(ji ku)部分完成的。共一百二十九页70视频(shpn)边缘检测我们将设置如下几个控制和状态寄存器来实现处理器和加速器之间的交互:控制寄存器。当写入该控制
50、寄存器时,加速器就开始(kish)处理一幅图像。并不关心写入该寄存器的是什么值,写入任何数都开始(kish)处理图像。控制寄存器。第0位是中断使能位。状态寄存器,其第0位是done 标志位(即完成标志位),当处理器处理完一幅图像时,随即将该位设置为1。其它位为0。当done 标志位为1,且中断使能位为1时,加速器便发出中断请求。读取该状态寄存器done 标志位还有一个附带作用是中断应答,并将done 标志位清零为了简化总线接口,我们把所有的寄存器设为32位,占有连续的地址空间。完整的寄存器地址映射如表1所示。共一百二十九页71视频(shpn)边缘检测表1 Sobel加速器的寄存器寄存器偏移值读
51、/写中断控制0只写开始4只写原始图像基地址8只写导数图像基地址12只写状态0只读共一百二十九页72视频边缘(binyun)检测例11:编写加速器从机接口(slave interface)的 Verilog 模型 代码。答: 总线从机操作的时序如下(rxi)图所示。总线的读/写操作都是在 cyc_i和stb_i为1的一个周期内发起的。共一百二十九页73视频边缘(binyun)检测处理器发起一次读/写操作,加速器通过在下一个周期把 ack_o 信号置1,并在随后一个周期把ack_o置0来响应。我们需要对地址(dzh)总线进行译码,得到加速器的选通信号。利用地址的低位确定哪个寄存器被读写。对起始寄存
52、器(start)地址进行写操作,并没有设置真实的寄存器来保存写入的数据,而是利用对该地址的写操作来产生一个控制信号start,启动加速器的计算时序。读取状态寄存器,done标志位(第0位)连同其他位(第1-31位)将被放到数据总线上。读取其他寄存器将返回全0。对于加速器,要输出到总线上的数据包括两个部分:从机接口中的状态寄存器和主机部分的结果寄存器,为此我们使用一个多路器来选择数据总线的驱动源。描述从机接口部分的型代码如下:共一百二十九页74视频边缘(binyun)检测/ Wishbone 从机接口assignstart = cyc_i & stb_i & we_i & adr_i3:2 =2
53、b01;/adr_i1:0=00assign O_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b10;assign D_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b11;always (posedge clk_i) / 中断使能寄存器if (rst_i)int_en = 1b0;else if (cyc_i & stb_i & we_i & adr_i3:2 =2b00)int_en = dat_i0;always (posedge clk_i)/ 状态(zhungti)寄存器if (rst_i) don
54、e =1b0;else if (done_set) /当一幅图像处理完时,done_set被置1 done =1b1; / for master write共一百二十九页75视频边缘(binyun)检测 else if (cyc_i & stb_i & !we_i & adr_i3:2 =2b00 & ack_o) done =1b0; /读状态寄存器操作将清除(qngch)标志位/中断申请 assign int_req =int_en & done; always (posedge clk_i) / 生成应答ack输出 ack_o = cyc_i & stb_i & !ack_o;/总线数据
55、输出多路选择器always *if (cyc_i & stb_i & !we_i)if (adr_i3:2 = 2b00)dat_o = 31b0,done; / status register readelsedat_o = 32b0; / other registers read as 0else dat_o = result_row; / for master write共一百二十九页76视频(shpn)边缘检测例12:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤 的控制器。解决方案:我们可以用一个有限(yuxin)状态机来安排计算的操作步骤。因为大部分的计算步骤是重复执行
56、的,所以可以用计数器来跟踪计算的过程。我们用一个行计数器来确定已经完成了多少行的计算,从第0行起一直增加到第477行;再用另一个计数器来确定已经完成了多少列的计算,从第0列起一直增加到第159列 (159+1)4 = 640)。控制计算步骤的有限状态机的状态转移图如图10所示。为避免状态转移图显得过于混乱,其中只显示了状态和转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假设:若一个给定的状态转移条件为假(即不成立),则该有限状态机就呆在原状态,直到下一个时钟周期。共一百二十九页77视频边缘(binyun)检测该FSM(有限状态机)的初始状态为idle(空闲)状态。当处理器对sta
57、rt寄存器写入数据时, start信号变为1(有效),FSM(有限状态机)启动读操作和第一行计算的初始时序。这个过程包括读取最初三组原始图像的像素值,然后执行四个计算周期。完成后,该有限状态机进入了一个循环,在这个循环里,它再次读取三组原始图像的像素值,执行四个计算周期,然后写一组由计算得到的像素值。正像我们在观察该有限状态机输出(shch)函数时所看到的那样,列计数器在每次写操作后加一。在最后一次计算周期结束的时候,若此时列计数器不是158,则该有限状态机继续循环,若此时列计数器是158,则进入一个状态,在该状态中开始排出流水线中的数据。排出流水线中的数据包括一个把倒数第二组结果写入的状态,
58、四个计算周期,和一个把最后一组计算结果写入的状态。行计数在这最后一次写操作后器加一。然后若此时行计数器的计数值不是477,则该有限状态机回到下一行的初始时序,若此时行计数器的计数值是最终的计数值477,则回到空闲状态。 共一百二十九页78视频(shpn)边缘检测图10 状态(zhungti)转移图共一百二十九页79视频(shpn)边缘检测该有限状态机的输出函数如表2和3所示。为让图表读起来简单一些,我们把控制信号输出为0的表格项留做空白,只列出表格项为1的情况。有些控制信号是摩尔型输出,只取决于当前状态,见表2所示。其它控制信号为米利型输出,见表3所示。这些信号由输入条件(tiojin)和当前
59、的状态共同决定其值。共一百二十九页80视频边缘(binyun)检测表2:摩尔(m r)状态机的输出共一百二十九页81视频(shpn)边缘检测表3:米利状态机的输出(shch)共一百二十九页82视频(shpn)边缘检测例13 为Sobel加速器的控制部分编写一个Verilog模型(mxng)。解决方案:控制部分的代码包括该控制有限状态机(FSM)的内部信号、行列计数器和控制信号的声明:parameter 4:0 idle=5b00000, read_prev_0 = 5b00001, read_curr_0 = 5b00010, read_next_0 = 5b00011, comp1_0 =
60、5b00100, comp2_0 = 5b00101, comp3_0 = 5b00110, comp4_0 = 5b00111, read_prev = 5b01000, read_curr = 5b01001, read_next = 5b01010,共一百二十九页83视频边缘(binyun)检测 comp1 = 5b01011, comp2 = 5b01100, comp3 = 5b01101, comp4 = 5b01110, write_result = 5b01111, write_158 = 5b10000, comp1_159 = 5b10001, comp2_159 = 5b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 成品质量检验准则
- 某汽车零部件厂工艺执行细则
- 通风空调系统调试报告
- 2026滨海银行面试题目及答案
- 2026编制岗位面试题库及答案
- 屋面-找平层技术交底
- 2026年元宇宙经济系统的跨链资产流通方案
- 复变函数与积分变换 第2版5.1孤立奇点
- 2026年中国包装行业发展现状、市场前景、投资方向分析报告(智研咨询发布)
- 2025年海岛生态旅游案例方案
- 5.中国的农业(2026-2027高中二年级·中国区域地理专题复习讲义)
- 人教版小学五年级数学下册折线统计图《复式折线统计图》示范教学课件
- (2025版)AHA心肺复苏与心血管急救指南解读课件
- 2025内蒙古乌海市国创数字产业发展有限责任公司招聘和考察更正笔试历年参考题库附带答案详解
- 黑龙江哈尔滨市2026届高考第一次模拟考试数学试题+答案
- 2026年安徽省合肥市高三二模英语试题(含答案和音频)
- 2026年传播与策划考试试题及答案答案
- 2026年贵州省毕节市初二地理生物会考真题试卷+解析及答案
- 小学劝返复学工作制度
- 2026年部编版五年级语文下册金句仿写
- 2025陕煤电力略阳有限公司高校毕业生招聘10人笔试历年典型考点题库附带答案详解
评论
0/150
提交评论