硬件加速器的设计(Sobel边缘检测)课件

上传人:枫** 文档编号:589099652 上传时间:2024-09-09 格式:PPT 页数:128 大小:4.70MB
返回 下载 相关 举报
硬件加速器的设计(Sobel边缘检测)课件_第1页
第1页 / 共128页
硬件加速器的设计(Sobel边缘检测)课件_第2页
第2页 / 共128页
硬件加速器的设计(Sobel边缘检测)课件_第3页
第3页 / 共128页
硬件加速器的设计(Sobel边缘检测)课件_第4页
第4页 / 共128页
硬件加速器的设计(Sobel边缘检测)课件_第5页
第5页 / 共128页
点击查看更多>>
资源描述

《硬件加速器的设计(Sobel边缘检测)课件》由会员分享,可在线阅读,更多相关《硬件加速器的设计(Sobel边缘检测)课件(128页珍藏版)》请在金锄头文库上搜索。

1、1硬件加速器的设计硬件加速器的设计硬件加速器的设计硬件加速器的设计(Verilog 1364-2001)(Verilog 1364-2001)(Verilog 1364-2001)(Verilog 1364-2001) - - - - 建模、仿真、综合、验证和实现建模、仿真、综合、验证和实现建模、仿真、综合、验证和实现建模、仿真、综合、验证和实现 - - - -北京航空航天大学北京航空航天大学北京航空航天大学 夏宇闻夏宇闻夏宇闻2课时安排和学习方法课时安排和学习方法课时安排和学习方法课时安排和学习方法四次讲课每次四次讲课每次四次讲课每次四次讲课每次33小时;小时;小时;小时;下课后自己阅读材料

2、在助教指导下做实下课后自己阅读材料在助教指导下做实下课后自己阅读材料在助教指导下做实下课后自己阅读材料在助教指导下做实验验验验44小时;小时;小时;小时;课堂课堂课堂课堂 3 x 4 =123 x 4 =12小时,自己看书小时,自己看书小时,自己看书小时,自己看书 20 20 小时小时小时小时,做做做做实验实验实验实验 20 20 小时,共计小时,共计小时,共计小时,共计5252小时;小时;小时;小时;理论与实践结合的学习方法;理论与实践结合的学习方法;理论与实践结合的学习方法;理论与实践结合的学习方法;考核方法:修改课上介绍的设计,使其考核方法:修改课上介绍的设计,使其考核方法:修改课上介绍

3、的设计,使其考核方法:修改课上介绍的设计,使其具有更高的性能。具有更高的性能。具有更高的性能。具有更高的性能。3讲课的主要内容讲课的主要内容讲课的主要内容讲课的主要内容硬件加速器的一般概念硬件加速器的一般概念硬件加速器的一般概念硬件加速器的一般概念为什么要研究硬件加速器为什么要研究硬件加速器为什么要研究硬件加速器为什么要研究硬件加速器设计硬件加速器基本方法:设计硬件加速器基本方法:设计硬件加速器基本方法:设计硬件加速器基本方法: 流水线流水线流水线流水线流水线流水线 和和和和和和 硬件复制硬件复制硬件复制硬件复制硬件复制硬件复制软件软件软件软件/硬件的划分原则硬件的划分原则硬件的划分原则硬件的

4、划分原则算法核心(算法核心(算法核心(算法核心(KernelKernelKernelKernel) 多主设备共享内存系统多主设备共享内存系统多主设备共享内存系统多主设备共享内存系统4讲课的主要内容讲课的主要内容讲课的主要内容讲课的主要内容 设计举例设计举例设计举例设计举例 视频图像边缘检测视频图像边缘检测视频图像边缘检测视频图像边缘检测 算法的原理算法的原理算法的原理算法的原理卷积表卷积表卷积表卷积表算法的伪码表示算法的伪码表示算法的伪码表示算法的伪码表示中间值和最终值的比特需求中间值和最终值的比特需求中间值和最终值的比特需求中间值和最终值的比特需求处理阶段的划分处理阶段的划分处理阶段的划分处

5、理阶段的划分5讲课的目的讲课的目的讲课的目的讲课的目的 提醒材料上容易忽略的内容;提醒材料上容易忽略的内容;提醒材料上容易忽略的内容;提醒材料上容易忽略的内容; 指出重点和关键点;指出重点和关键点;指出重点和关键点;指出重点和关键点; 帮助同学理解材料上的难点;帮助同学理解材料上的难点;帮助同学理解材料上的难点;帮助同学理解材料上的难点; 自己看材料、上机练习为主;自己看材料、上机练习为主;自己看材料、上机练习为主;自己看材料、上机练习为主; 互相认识,以便交流。互相认识,以便交流。互相认识,以便交流。互相认识,以便交流。6一般概念一般概念在嵌入式在嵌入式在嵌入式在嵌入式在嵌入式在嵌入式DSP

6、DSPDSP系统中,对处理器有很高的要求,系统中,对处理器有很高的要求,系统中,对处理器有很高的要求,系统中,对处理器有很高的要求,系统中,对处理器有很高的要求,系统中,对处理器有很高的要求,编写专用的嵌入式软件,采用高档的编写专用的嵌入式软件,采用高档的编写专用的嵌入式软件,采用高档的编写专用的嵌入式软件,采用高档的编写专用的嵌入式软件,采用高档的编写专用的嵌入式软件,采用高档的DSPDSPDSP处理处理处理处理处理处理器芯片有时也无法达到系统对算法运算速度的器芯片有时也无法达到系统对算法运算速度的器芯片有时也无法达到系统对算法运算速度的器芯片有时也无法达到系统对算法运算速度的器芯片有时也无

7、法达到系统对算法运算速度的器芯片有时也无法达到系统对算法运算速度的要求,即使能达到性能价格比太差。要求,即使能达到性能价格比太差。要求,即使能达到性能价格比太差。要求,即使能达到性能价格比太差。要求,即使能达到性能价格比太差。要求,即使能达到性能价格比太差。 不得不设计专用硬件;不得不设计专用硬件;不得不设计专用硬件;不得不设计专用硬件;不得不设计专用硬件;不得不设计专用硬件; 采用硬件复制和流水线方法;采用硬件复制和流水线方法;采用硬件复制和流水线方法;采用硬件复制和流水线方法;采用硬件复制和流水线方法;采用硬件复制和流水线方法;增加并行性;增加并行性;增加并行性;增加并行性;增加并行性;增

8、加并行性;还需要控制成本。还需要控制成本。还需要控制成本。还需要控制成本。还需要控制成本。还需要控制成本。7一般概念一般概念 数据的互相依赖性;数据的互相依赖性;数据的互相依赖性;数据的互相依赖性;中间数据的保存;中间数据的保存;中间数据的保存;中间数据的保存;硬件的复制;硬件的复制;硬件的复制;硬件的复制;用一个时钟在几个并行硬件中可同时完用一个时钟在几个并行硬件中可同时完用一个时钟在几个并行硬件中可同时完用一个时钟在几个并行硬件中可同时完成多个操作;成多个操作;成多个操作;成多个操作;时钟的频率也可以提高。时钟的频率也可以提高。时钟的频率也可以提高。时钟的频率也可以提高。8一般概念一般概念

9、步骤1步骤2步骤3寄存器寄存器寄存器图 流水线在复杂应用中要复合应用流水线和硬件复制在复杂应用中要复合应用流水线和硬件复制方法方法9 加速算法核心(加速算法核心(加速算法核心(加速算法核心(加速算法核心(加速算法核心(kernelkernelkernel)引起的性能改善的量化)引起的性能改善的量化)引起的性能改善的量化)引起的性能改善的量化)引起的性能改善的量化)引起的性能改善的量化 :设执行设执行算法核心算法核心算法核心算法核心所占的时间比例为所占的时间比例为 ff。则执行非。则执行非算法核心算法核心算法核心算法核心的时间为的时间为(1(1- f - f ),因此有:,因此有: t t =

10、= ft ft + ( 1-+ ( 1-f f ) t ) t 如果加速器能把算法核心的处理速度提高到原来的如果加速器能把算法核心的处理速度提高到原来的如果加速器能把算法核心的处理速度提高到原来的 s s s 倍,则算法核心的倍,则算法核心的倍,则算法核心的处理时间就缩短到原来的处理时间就缩短到原来的处理时间就缩短到原来的1/1/1/s ss,非算法核心的处理时间不变。因此,这个,非算法核心的处理时间不变。因此,这个,非算法核心的处理时间不变。因此,这个算法总的运行时间为:算法总的运行时间为:算法总的运行时间为: t t = = ft/s ft/s + ( 1- + ( 1- f f ) t

11、) t 总体性能的提高比例是原来的处理时间除以加速后的处理时间:总体性能的提高比例是原来的处理时间除以加速后的处理时间: S= ( S= (ftft+(+(1-f 1-f ) t) / ( ) t) / ( ftft/s+(/s+(1-f 1-f ) ) t t ) = 1 / ( = 1 / ( f/sf/s+(+(1-f1-f ) )这个公式称为这个公式称为AmdahlAmdahl法则,是以法则,是以Gene AmdahlGene Amdahl的名字命名的,他是并行的名字命名的,他是并行计算的先驱之一。这个公式表明加速处理计算的先驱之一。这个公式表明加速处理核心核心核心核心(kernelk

12、ernel)算法所带来的)算法所带来的整体性能的提高在很大程度上依赖于整体性能的提高在很大程度上依赖于算法核心算法核心算法核心算法核心在整个算法执行时间中所在整个算法执行时间中所占的比例。占的比例。 一般概念一般概念10 例例例例11:假假设设在在嵌嵌入入式式处处理理器器上上运运行行的的算算法法可可以以分分成成不不同同的的部部分分,执执行行每每一一部部分分所所花花费费的的时时间间可可以以估估算算出出来来,而而该该算算法法可可分分为为两两个个部部分分,即即分分成成两两个个核核核核心心心心(kernelkernel)算算法法,一一个个占占总总时时间间的的80%80%,而而另另一一个个只只占占总总时

13、时间间的的20%20%。若若用用一一个个硬硬件件加加速速器器来来加加速速算算算算法法法法核核核核心心心心,我我们们将将第第一一个个算算算算法法法法核核核核心心心心的的运运行行速速度度提提高高到到原原来来的的1010倍倍,或或者者将将第第二二个个算算算算法法法法核核核核心心心心提提高高到到原原来来的的100100倍倍,试试问问对对哪哪个个算算算算法法法法核核核核心心心心使使用用硬硬件件加加速速器器能能对对总总体体性性能能的的提提高高产产生生更好的效果?更好的效果?解:对第一个解:对第一个算法核心算法核心算法核心算法核心进行加速处理所带来的总体性能提升为:进行加速处理所带来的总体性能提升为: 1

14、/ (0.8/10)+(1-0.8) = 1/(0.08+0.2) =3.57 1 / (0.8/10)+(1-0.8) = 1/(0.08+0.2) =3.57 对第二个对第二个算法核心算法核心算法核心算法核心进行加速处理带来的总体性能提升为:进行加速处理带来的总体性能提升为: 1 / (0.2/10)+(1-0.2) = 1/(0.02+0.8) =1.25 1 / (0.2/10)+(1-0.2) = 1/(0.02+0.8) =1.25一般概念一般概念11 从结果对比可以看到,虽然第二个从结果对比可以看到,虽然第二个算法核心算法核心算法核心算法核心提高的运算速度是第一个的提高的运算速度

15、是第一个的1010倍,但是由于倍,但是由于它在原来总运行时间里所占的比例较低,对它在原来总运行时间里所占的比例较低,对其进行加速处理也只能带来较小的性能改善。其进行加速处理也只能带来较小的性能改善。而对第一个而对第一个算法核心算法核心算法核心算法核心进行加速处理会对总体进行加速处理会对总体性能产生更显著的效果。所以我们在开始正性能产生更显著的效果。所以我们在开始正式设计硬件时必须找到主要矛盾,即占总运式设计硬件时必须找到主要矛盾,即占总运行时间比例较高的部分,针对这部分算法程行时间比例较高的部分,针对这部分算法程序进行硬件加速器的设计序进行硬件加速器的设计 ,以期望取得显著,以期望取得显著效果

16、。效果。一般概念一般概念12 在确定在确定算法核心算法核心算法核心算法核心以后,我们需要确定执行计以后,我们需要确定执行计算步骤的顺序。我们要确保能得到数据,以算步骤的顺序。我们要确保能得到数据,以便按顺序处理,并且确保中间结果能够在后便按顺序处理,并且确保中间结果能够在后续步骤需要前计算出来。除了这些约束以外,续步骤需要前计算出来。除了这些约束以外,有些运算步骤是可以潜在地并行执行的。因有些运算步骤是可以潜在地并行执行的。因此,我们要确定哪些步骤可以通过并行执行此,我们要确定哪些步骤可以通过并行执行来满足性能要求。然后再确定加速器的结构,来满足性能要求。然后再确定加速器的结构,即确定各个处理

17、模块的功能以及它们之间的即确定各个处理模块的功能以及它们之间的数据流动。数据流动。一般概念一般概念13 从算法到加速器结构,是在系统设计流程的从算法到加速器结构,是在系统设计流程的早期完成的。这通常是由有经验的系统设计早期完成的。这通常是由有经验的系统设计师完成。让综合工具自动完成这一过程,面师完成。让综合工具自动完成这一过程,面临很大的技术挑战。除了非常少的领域外,临很大的技术挑战。除了非常少的领域外,早期的高级综合工具并不成功。近来,新一早期的高级综合工具并不成功。近来,新一代工具开始浮现,并且在很广泛的领域内表代工具开始浮现,并且在很广泛的领域内表现出良好的前景,尤其在音频,视频,和其现

18、出良好的前景,尤其在音频,视频,和其它的信号处理领域。随着这种技术的成熟,它的信号处理领域。随着这种技术的成熟,我们可以期待高级综合工具在设计方法学中我们可以期待高级综合工具在设计方法学中将会有更广泛的应用。将会有更广泛的应用。一般概念一般概念14 在许多嵌入式系统中,需要处理大量的输入输出数据。在许多嵌入式系统中,需要处理大量的输入输出数据。I/OI/O控制器必须在外部设备和嵌入式系统之间高速传输数据。数控制器必须在外部设备和嵌入式系统之间高速传输数据。数据从外部设备读入内存,就可以被嵌入式软件或加速器处理。据从外部设备读入内存,就可以被嵌入式软件或加速器处理。处理后的数据被写到内存。如果读

19、写内存数据都在处理器的处理后的数据被写到内存。如果读写内存数据都在处理器的控制下进行,那么,数据传输速度会很慢,并且占用大量处控制下进行,那么,数据传输速度会很慢,并且占用大量处理器时间,使处理器无法执行其他任务。如果让理器时间,使处理器无法执行其他任务。如果让I/OI/O控制器控制器和加速器直接发起对内存的访问而不通过处理器,势必可以和加速器直接发起对内存的访问而不通过处理器,势必可以大大加快访问内存的速度。这种内存访问方式称为大大加快访问内存的速度。这种内存访问方式称为DMADMA(Direct Memory AccessDirect Memory Access)方式。在这种方式下,)方式

20、。在这种方式下,I/OI/O控控制器和加速器作为主设备给出读写内存的地址和控制信号,制器和加速器作为主设备给出读写内存的地址和控制信号,或者通过或者通过DMADMA控制器发起对内存的访问,由控制器发起对内存的访问,由DMADMA控制器给控制器给出地址和控制信号。出地址和控制信号。一般概念一般概念15 系统中有处理器和系统中有处理器和DMADMA设备,并且共用内存访问通路,必设备,并且共用内存访问通路,必须避免由于多个主设备同时访问内存而引起的冲突。为此,须避免由于多个主设备同时访问内存而引起的冲突。为此,我们可以在系统中引入仲裁器(我们可以在系统中引入仲裁器(ArbiterArbiter),如

21、下图所示。系),如下图所示。系统中的主设备(处理器,统中的主设备(处理器,DMADMA方式的加速器、方式的加速器、I/OI/O控制器)控制器)在访问内存之前,必须给仲裁器发出请求信号,仲裁器根据在访问内存之前,必须给仲裁器发出请求信号,仲裁器根据预先确定的仲裁策略,在多个请求信号中决定谁将取得访问预先确定的仲裁策略,在多个请求信号中决定谁将取得访问内存的总线控制权,并给得到总线控制权的设备发出访问内内存的总线控制权,并给得到总线控制权的设备发出访问内存的准许信号。当该设备完成对内存的访问后,便撤消请求存的准许信号。当该设备完成对内存的访问后,便撤消请求信号。然后,仲裁器进入新一轮的仲裁,仲裁胜

22、出的设备进信号。然后,仲裁器进入新一轮的仲裁,仲裁胜出的设备进行内存访问。我们也可以让处理器来执行仲裁器的功能。当行内存访问。我们也可以让处理器来执行仲裁器的功能。当其他主设备要访问内存时,必须先向处理器发出请求信号,其他主设备要访问内存时,必须先向处理器发出请求信号,由该处理器决定哪个设备可以访问内存。根据不同的应用场由该处理器决定哪个设备可以访问内存。根据不同的应用场合,选择适合的仲裁策略,有优先级模式(赋予某个或几个合,选择适合的仲裁策略,有优先级模式(赋予某个或几个设备更高的优先权),轮询模式(所有主设备严格按照一定设备更高的优先权),轮询模式(所有主设备严格按照一定的顺序取得内存访问

23、权)。的顺序取得内存访问权)。一般概念一般概念16 一般概念一般概念 CPU 加速器加速器 仲裁器仲裁器 存储器存储器图2 多主设备共享内存系统 I/O控制器控制器request grant grant requestrequest grant17 在许多应用中,数据被有规律地放在内存中如占用在许多应用中,数据被有规律地放在内存中如占用连续的内存块,加速器把数据从内存中一块一块取连续的内存块,加速器把数据从内存中一块一块取出进行处理。例如处理静态和视频图像的几种算法出进行处理。例如处理静态和视频图像的几种算法把一帧图像分割成把一帧图像分割成8888或者或者16161616的像素块,然后独的像素

24、块,然后独立地处理每个块。立地处理每个块。这种块处理加速器的数据通路主要由两部分组成。这种块处理加速器的数据通路主要由两部分组成。其中一个部分以其中一个部分以DMADMA方式访问内存。这部分电路根方式访问内存。这部分电路根据处理器写入加速器内部寄存器的基地址产生后续据处理器写入加速器内部寄存器的基地址产生后续地址。这一功能通常由地址计数器来完成。数据通地址。这一功能通常由地址计数器来完成。数据通路的另一部分对数据进行处理。控制部分按一定的路的另一部分对数据进行处理。控制部分按一定的时序控制数据通路的打开和关闭,使数据有序、正时序控制数据通路的打开和关闭,使数据有序、正确地流动。控制功能可以用一

25、个有限状态机或多个确地流动。控制功能可以用一个有限状态机或多个状态机实现。状态机实现。一般概念一般概念18 与块处理加速器相对应的是流处理加速器。与块处理加速器相对应的是流处理加速器。流处理加速器处理的数据是按时间顺序达到流处理加速器处理的数据是按时间顺序达到的数据流。数据流可以是来自于高速的输入的数据流。数据流可以是来自于高速的输入设备(如设备(如A/DA/D、摄像机等),也可以是其他、摄像机等),也可以是其他加速器的输出。此外,内存中的数据也能以加速器的输出。此外,内存中的数据也能以流的方式读出,供加速器处理。流处理加速流的方式读出,供加速器处理。流处理加速器最常见的应用领域之一是器最常见

26、的应用领域之一是数字信号处理数字信号处理数字信号处理数字信号处理(DSPDSP)。模拟信号经)。模拟信号经A/DA/D采样后,得到采样采样后,得到采样信号的数据流。对数据的处理包括滤波、混信号的数据流。对数据的处理包括滤波、混合、放大合、放大/衰减、以及时域和频域间的转换。衰减、以及时域和频域间的转换。 一般概念一般概念19 虽然,加速器可以直接读取内存数据,并且虽然,加速器可以直接读取内存数据,并且把数据处理完后写回内存,但是加速器必须把数据处理完后写回内存,但是加速器必须知道什么时候开始工作,待处理数据的起始知道什么时候开始工作,待处理数据的起始地址,数据的大小,处理后数据的存放地址地址,

27、数据的大小,处理后数据的存放地址以及完成处理后通知处理器。也就是说,处以及完成处理后通知处理器。也就是说,处理器必须能够控制加速器的工作、获取加速理器必须能够控制加速器的工作、获取加速器当前的工作状态。这些功能通常是由加速器当前的工作状态。这些功能通常是由加速器内部的输入输出寄存器来完成。器内部的输入输出寄存器来完成。 一般概念一般概念20 我们可以在加速器内部设置地址寄存器和数据长度我们可以在加速器内部设置地址寄存器和数据长度寄存器,处理器通过向这些寄存器写入数据让加速寄存器,处理器通过向这些寄存器写入数据让加速器知道从何处读取数据、数据大小及处理完后数据器知道从何处读取数据、数据大小及处理

28、完后数据写到何处。还可以有状态寄存器,处理器通过读取写到何处。还可以有状态寄存器,处理器通过读取状态寄存器了解加速器当前的状态。也可以用状态状态寄存器了解加速器当前的状态。也可以用状态寄存器的值产生申请中断信号,通知处理器。加速寄存器的值产生申请中断信号,通知处理器。加速器可以看做是处理器的一个器可以看做是处理器的一个I/OI/O设备,因此,处理器设备,因此,处理器读写加速器的内部寄存器与读写一般的读写加速器的内部寄存器与读写一般的I/OI/O设备是一设备是一样的。样的。一般概念一般概念21 有的情况下,当处理器给加速器发出一个处理任务有的情况下,当处理器给加速器发出一个处理任务时,并不要求加

29、速器立即响应。处理器把需要加速时,并不要求加速器立即响应。处理器把需要加速器处理的多项任务的描述信息写到先入先出队列器处理的多项任务的描述信息写到先入先出队列(FIFOFIFO)中,加速器从)中,加速器从FIFOFIFO中读取每件任务的描述中读取每件任务的描述信息,等准备好以后,就可以执行一项任务。信息,等准备好以后,就可以执行一项任务。一般概念一般概念22视频边缘检测视频边缘检测视频边缘检测视频边缘检测下面我们将用视频图像边缘检测加速器的下面我们将用视频图像边缘检测加速器的下面我们将用视频图像边缘检测加速器的下面我们将用视频图像边缘检测加速器的设计作为例子,来说明加速器设计中几个设计作为例子

30、,来说明加速器设计中几个设计作为例子,来说明加速器设计中几个设计作为例子,来说明加速器设计中几个方面的问题。真实的边缘检测加速器设计方面的问题。真实的边缘检测加速器设计方面的问题。真实的边缘检测加速器设计方面的问题。真实的边缘检测加速器设计是非常复杂的,本书只是介绍加速器的设是非常复杂的,本书只是介绍加速器的设是非常复杂的,本书只是介绍加速器的设是非常复杂的,本书只是介绍加速器的设计原理,为了不被具体细节所累,我们在计原理,为了不被具体细节所累,我们在计原理,为了不被具体细节所累,我们在计原理,为了不被具体细节所累,我们在这两者之间做了某种程度的折中。这两者之间做了某种程度的折中。这两者之间做

31、了某种程度的折中。这两者之间做了某种程度的折中。 23视频边缘检测视频边缘检测视频边缘检测视频边缘检测边缘检测是分析视频图像的重要手段之边缘检测是分析视频图像的重要手段之一,并且应用领域广泛,像安全监控和计一,并且应用领域广泛,像安全监控和计算机图形学等。边缘检测是确定一幅图算机图形学等。边缘检测是确定一幅图像在哪些区域上亮度发生突变。这些亮像在哪些区域上亮度发生突变。这些亮度突变的区域通常就是物体的边缘。度突变的区域通常就是物体的边缘。24视频边缘检测视频边缘检测视频边缘检测视频边缘检测在这个例子中,我们假设有像素的图像,每个在这个例子中,我们假设有像素的图像,每个像素用像素用88比特表示,

32、按行存储在内存中,并且比特表示,按行存储在内存中,并且每一行里从左到右连续的像素点占据着内存中每一行里从左到右连续的像素点占据着内存中连续的存贮单元。像素值是无符号整数,范围连续的存贮单元。像素值是无符号整数,范围从从00(黑色)到(黑色)到 255255(白色)。这里,我们采用(白色)。这里,我们采用一种相对简单的算法,叫做一种相对简单的算法,叫做SobelSobel边缘检测法。边缘检测法。它的机理是计算它的机理是计算xx和和yy方向亮度信号的导数值并方向亮度信号的导数值并且寻找导数中的最大值和最小值。这些区域就且寻找导数中的最大值和最小值。这些区域就是亮度变化最剧烈的区域。是亮度变化最剧烈

33、的区域。 25视频边缘检测视频边缘检测视频边缘检测视频边缘检测SobelSobel检测法通过一个叫做卷积的过程来估检测法通过一个叫做卷积的过程来估计每个像素点每个方向上的导数值。把中计每个像素点每个方向上的导数值。把中心像素点和离它最近的八个像素点每个乘心像素点和离它最近的八个像素点每个乘以一个系数后相加。该系数通常用一个以一个系数后相加。该系数通常用一个 的的卷积表(卷积表(convolution maskconvolution mask)来表示。分)来表示。分别用于计算别用于计算xx和和yy方向导数值的方向导数值的SobelSobel卷积表卷积表 GxGx和和 Gy Gy 如下图所示。如下

34、图所示。26视频边缘检测视频边缘检测视频边缘检测视频边缘检测 -10+1-20+2-10+1+1+2+1000-1-2-1GxGxGyGy27视频边缘检测视频边缘检测视频边缘检测视频边缘检测我们把每个像素值分别乘以卷积表中对应我们把每个像素值分别乘以卷积表中对应的系数,再把相乘得到的九个数相加就得的系数,再把相乘得到的九个数相加就得到了到了xx方向和方向和yy方向的偏导数值方向的偏导数值 DxDx和和 DyDy。然后,利用这两个偏导数值计算中心像素然后,利用这两个偏导数值计算中心像素点的导数。计算公式如下:点的导数。计算公式如下:28视频边缘检测视频边缘检测视频边缘检测视频边缘检测由于我们只想

35、找到导数幅值的最大值和最小值,由于我们只想找到导数幅值的最大值和最小值,对上式作如下简化:对上式作如下简化:这样近似能够满足计算要求,因为开平方和平方这样近似能够满足计算要求,因为开平方和平方函数都是单调的,实际计算幅度的最大值、最小函数都是单调的,实际计算幅度的最大值、最小值与近似以后计算的最大值、最小值发生在图像值与近似以后计算的最大值、最小值发生在图像的同一个地方。并且,与计算平方和开平方相的同一个地方。并且,与计算平方和开平方相比,计算绝对值所用的硬件资源少得多。比,计算绝对值所用的硬件资源少得多。29视频边缘检测视频边缘检测视频边缘检测视频边缘检测我们需要重复地计算图像中每个像素位置

36、的我们需要重复地计算图像中每个像素位置的导数幅值。但是,注意到环绕图像边缘的导数幅值。但是,注意到环绕图像边缘的像素点并没有一个完整的相邻像素组来计像素点并没有一个完整的相邻像素组来计算偏导数和导数,所以我们需要对这些像算偏导数和导数,所以我们需要对这些像素进行单独处理。最简单的方法就是把图素进行单独处理。最简单的方法就是把图像中边缘像素点的导数值值像中边缘像素点的导数值值 |D|D|设置为设置为00。这可以通过软件来完成。这可以通过软件来完成。30视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例22:把把SobelSobel边缘检测算法用伪代码的形式表达出边缘检测算法用伪代码的形式表

37、达出来,也就是,用一种与计算机编程语言类似的表示法。来,也就是,用一种与计算机编程语言类似的表示法。答:答:答:答:答:答:我们用类似于我们用类似于VerilogVerilog的伪代码来表示该算法。令的伪代码来表示该算法。令Orowcol Orowcol 表示原始图像的像素点,表示原始图像的像素点,DrowcolDrowcol表表示导数图像的像素点,示导数图像的像素点,rowrow的范围从的范围从00到到479479,colcol的的范围从范围从00到到639639。同时令。同时令Gxij Gxij 和和 Gyij Gyij 表示卷积表示卷积表,其中表,其中i i 和和 j j 的范围从的范围

38、从 -1 -1 到到 1. 1. 31视频边缘检测视频边缘检测视频边缘检测视频边缘检测该算法可以表达为如下形式:该算法可以表达为如下形式: for( row=1; row=478; row=row+1 ) for( row=1; row=478; row=row+1 ) begin begin for(col=1; col=638; col=col+1) for(col=1; col=638; col=col+1)beginbegin sumx=0;sumx=0;sumy=0;sumy=0;for( i = -1; i = +1; i = i+1) beginfor( i = -1; i =

39、+1; i = i+1) beginfor (j = -1; j= +1; j = j+1) beginfor (j = -1; j= +1; j = j+1) beginsumx = sumx + Orow+icol+j * Gxij;sumx = sumx + Orow+icol+j * Gxij;sumy = sumy + Orow+icol+j * Gyij;sumy = sumy + Orow+icol+j * Gyij; end end end end Drowcol = abs(sumx) + abs(sumy)Drowcol = abs(sumx) + abs(sumy) en

40、d end end end32视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例3 3 3:求在计算:求在计算:求在计算:求在计算:求在计算:求在计算SobelSobelSobel卷积中表示每个像素点中间值和最终卷积中表示每个像素点中间值和最终卷积中表示每个像素点中间值和最终卷积中表示每个像素点中间值和最终卷积中表示每个像素点中间值和最终卷积中表示每个像素点中间值和最终值所需要的比特数。值所需要的比特数。值所需要的比特数。值所需要的比特数。值所需要的比特数。值所需要的比特数。答:答:答:答:答:答:每个像素用每个像素用每个像素用每个像素用每个像素用每个像素用8 8 8比特无符号数表示

41、。像素值与卷积表中的系比特无符号数表示。像素值与卷积表中的系比特无符号数表示。像素值与卷积表中的系比特无符号数表示。像素值与卷积表中的系比特无符号数表示。像素值与卷积表中的系比特无符号数表示。像素值与卷积表中的系数相乘得到的九个部分积的范围从数相乘得到的九个部分积的范围从数相乘得到的九个部分积的范围从数相乘得到的九个部分积的范围从数相乘得到的九个部分积的范围从数相乘得到的九个部分积的范围从 -510-510-510到到到到到到 +510+510+510。因此,。因此,。因此,。因此,。因此,。因此,部分积应该用部分积应该用部分积应该用部分积应该用部分积应该用部分积应该用101010比特有符号数

42、表示。求出每个比特有符号数表示。求出每个比特有符号数表示。求出每个比特有符号数表示。求出每个比特有符号数表示。求出每个比特有符号数表示。求出每个 DxDxDx和和和和和和 DyDyDy的值需要把各自的九个部分积相加。的值需要把各自的九个部分积相加。的值需要把各自的九个部分积相加。的值需要把各自的九个部分积相加。的值需要把各自的九个部分积相加。的值需要把各自的九个部分积相加。 33视频边缘检测视频边缘检测视频边缘检测视频边缘检测 结果值的范围是从结果值的范围是从结果值的范围是从结果值的范围是从结果值的范围是从结果值的范围是从-1020-1020-1020到到到到到到102010201020,可以

43、用,可以用,可以用,可以用,可以用,可以用111111比特有符号比特有符号比特有符号比特有符号比特有符号比特有符号 数表示。然后,再把这两个绝对值相加,得到数表示。然后,再把这两个绝对值相加,得到数表示。然后,再把这两个绝对值相加,得到数表示。然后,再把这两个绝对值相加,得到数表示。然后,再把这两个绝对值相加,得到数表示。然后,再把这两个绝对值相加,得到 |D| |D| |D| 的范的范的范的范的范的范围从围从围从围从围从围从0 0 0到到到到到到204020402040,也可以用,也可以用,也可以用,也可以用,也可以用,也可以用111111比特表示。因为后续的边缘比特表示。因为后续的边缘比特

44、表示。因为后续的边缘比特表示。因为后续的边缘比特表示。因为后续的边缘比特表示。因为后续的边缘检测操作只需要确定哪个导数图像的像素值超过了特定检测操作只需要确定哪个导数图像的像素值超过了特定检测操作只需要确定哪个导数图像的像素值超过了特定检测操作只需要确定哪个导数图像的像素值超过了特定检测操作只需要确定哪个导数图像的像素值超过了特定检测操作只需要确定哪个导数图像的像素值超过了特定阈值,我们并不需要阈值,我们并不需要阈值,我们并不需要阈值,我们并不需要阈值,我们并不需要阈值,我们并不需要111111比特的精确度。相反,用比特的精确度。相反,用比特的精确度。相反,用比特的精确度。相反,用比特的精确度

45、。相反,用比特的精确度。相反,用8 8 8比特比特比特比特比特比特值来衡量结果更为方便,因为值来衡量结果更为方便,因为值来衡量结果更为方便,因为值来衡量结果更为方便,因为值来衡量结果更为方便,因为值来衡量结果更为方便,因为8 8 8比特的结果可以像原始比特的结果可以像原始比特的结果可以像原始比特的结果可以像原始比特的结果可以像原始比特的结果可以像原始图像一样以相同的格式回送到内存中。在这两者之间图像一样以相同的格式回送到内存中。在这两者之间图像一样以相同的格式回送到内存中。在这两者之间图像一样以相同的格式回送到内存中。在这两者之间图像一样以相同的格式回送到内存中。在这两者之间图像一样以相同的格

46、式回送到内存中。在这两者之间做了某种程度的折中。做了某种程度的折中。做了某种程度的折中。做了某种程度的折中。做了某种程度的折中。做了某种程度的折中。 34视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例4 4 4 :假设视频的帧速为每秒假设视频的帧速为每秒假设视频的帧速为每秒假设视频的帧速为每秒假设视频的帧速为每秒假设视频的帧速为每秒303030帧,计算必须以多快的帧,计算必须以多快的帧,计算必须以多快的帧,计算必须以多快的帧,计算必须以多快的帧,计算必须以多快的速度计算速度计算速度计算速度计算速度计算速度计算SobelSobelSobel卷积。卷积。卷积。卷积。卷积。卷积。答:答

47、:答:答:答:答:每帧图象包括每帧图象包括每帧图象包括每帧图象包括每帧图象包括每帧图象包括640480 = 307,200 640480 = 307,200 640480 = 307,200 个像素。个像素。个像素。个像素。个像素。个像素。因为每秒有因为每秒有因为每秒有因为每秒有因为每秒有因为每秒有303030帧,必须以:帧,必须以:帧,必须以:帧,必须以:帧,必须以:帧,必须以: 307,20030 = 9,216,000 307,20030 = 9,216,000 307,20030 = 9,216,000 每秒的速度每秒的速度每秒的速度每秒的速度每秒的速度每秒的速度对像素点进行处理,换言

48、之,大约每秒对像素点进行处理,换言之,大约每秒对像素点进行处理,换言之,大约每秒对像素点进行处理,换言之,大约每秒对像素点进行处理,换言之,大约每秒对像素点进行处理,换言之,大约每秒100010001000万个像素。万个像素。万个像素。万个像素。万个像素。万个像素。35视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例5 5 5:确定能够满足所要求的计算性能的并行结构方案。确定能够满足所要求的计算性能的并行结构方案。确定能够满足所要求的计算性能的并行结构方案。确定能够满足所要求的计算性能的并行结构方案。确定能够满足所要求的计算性能的并行结构方案。确定能够满足所要求的计算性能的并行结构

49、方案。答:答:答:答:答:答:既然计算只需要原始图像的像素值,因此求解每个导数既然计算只需要原始图像的像素值,因此求解每个导数既然计算只需要原始图像的像素值,因此求解每个导数既然计算只需要原始图像的像素值,因此求解每个导数既然计算只需要原始图像的像素值,因此求解每个导数既然计算只需要原始图像的像素值,因此求解每个导数像素所必须的计算可以各自独立地进行。因此,我们可像素所必须的计算可以各自独立地进行。因此,我们可像素所必须的计算可以各自独立地进行。因此,我们可像素所必须的计算可以各自独立地进行。因此,我们可像素所必须的计算可以各自独立地进行。因此,我们可像素所必须的计算可以各自独立地进行。因此,

50、我们可以按照要求同时对尽可能多的像素进行计算。下图给出以按照要求同时对尽可能多的像素进行计算。下图给出以按照要求同时对尽可能多的像素进行计算。下图给出以按照要求同时对尽可能多的像素进行计算。下图给出以按照要求同时对尽可能多的像素进行计算。下图给出以按照要求同时对尽可能多的像素进行计算。下图给出了计算图像的导数像素的全过程。了计算图像的导数像素的全过程。了计算图像的导数像素的全过程。了计算图像的导数像素的全过程。了计算图像的导数像素的全过程。了计算图像的导数像素的全过程。 36视频边缘检测视频边缘检测视频边缘检测视频边缘检测 计算导数像素的数据关系图37视频边缘检测视频边缘检测视频边缘检测视频边

51、缘检测这张图展示了每个操作步骤所需要的数据,从原这张图展示了每个操作步骤所需要的数据,从原这张图展示了每个操作步骤所需要的数据,从原这张图展示了每个操作步骤所需要的数据,从原这张图展示了每个操作步骤所需要的数据,从原这张图展示了每个操作步骤所需要的数据,从原始图像的顶部像素开始,通过独立并行操作得到始图像的顶部像素开始,通过独立并行操作得到始图像的顶部像素开始,通过独立并行操作得到始图像的顶部像素开始,通过独立并行操作得到始图像的顶部像素开始,通过独立并行操作得到始图像的顶部像素开始,通过独立并行操作得到中间结果,最后求出底部的导数像素。我们已经中间结果,最后求出底部的导数像素。我们已经中间结

52、果,最后求出底部的导数像素。我们已经中间结果,最后求出底部的导数像素。我们已经中间结果,最后求出底部的导数像素。我们已经中间结果,最后求出底部的导数像素。我们已经省略了系数值是省略了系数值是省略了系数值是省略了系数值是省略了系数值是省略了系数值是0 0 0的部分积,因为它们对结果没有的部分积,因为它们对结果没有的部分积,因为它们对结果没有的部分积,因为它们对结果没有的部分积,因为它们对结果没有的部分积,因为它们对结果没有任何影响。通过这幅图,我们看到可以并行地计任何影响。通过这幅图,我们看到可以并行地计任何影响。通过这幅图,我们看到可以并行地计任何影响。通过这幅图,我们看到可以并行地计任何影响

53、。通过这幅图,我们看到可以并行地计任何影响。通过这幅图,我们看到可以并行地计算所有的部分积,因为每个部分积只依赖于原始像算所有的部分积,因为每个部分积只依赖于原始像算所有的部分积,因为每个部分积只依赖于原始像算所有的部分积,因为每个部分积只依赖于原始像算所有的部分积,因为每个部分积只依赖于原始像算所有的部分积,因为每个部分积只依赖于原始像素值和常量系数。然后我们可以并行地把两组各六个素值和常量系数。然后我们可以并行地把两组各六个素值和常量系数。然后我们可以并行地把两组各六个素值和常量系数。然后我们可以并行地把两组各六个素值和常量系数。然后我们可以并行地把两组各六个素值和常量系数。然后我们可以并

54、行地把两组各六个部分积加起来,再并行地计算两个绝对值,把它们加部分积加起来,再并行地计算两个绝对值,把它们加部分积加起来,再并行地计算两个绝对值,把它们加部分积加起来,再并行地计算两个绝对值,把它们加部分积加起来,再并行地计算两个绝对值,把它们加部分积加起来,再并行地计算两个绝对值,把它们加起来最后得到(原始图像某个像素的)导数像素值。起来最后得到(原始图像某个像素的)导数像素值。起来最后得到(原始图像某个像素的)导数像素值。起来最后得到(原始图像某个像素的)导数像素值。起来最后得到(原始图像某个像素的)导数像素值。起来最后得到(原始图像某个像素的)导数像素值。38视频边缘检测视频边缘检测视频

55、边缘检测视频边缘检测包括边缘检测加速器在内的视频系统的顶层框图如图包括边缘检测加速器在内的视频系统的顶层框图如图包括边缘检测加速器在内的视频系统的顶层框图如图包括边缘检测加速器在内的视频系统的顶层框图如图包括边缘检测加速器在内的视频系统的顶层框图如图包括边缘检测加速器在内的视频系统的顶层框图如图555所示。视频输入来所示。视频输入来所示。视频输入来所示。视频输入来所示。视频输入来所示。视频输入来自摄像机的自摄像机的自摄像机的自摄像机的自摄像机的自摄像机的I/OI/OI/O控制器,它把连续的视频图像保存在内存中。在处理器上控制器,它把连续的视频图像保存在内存中。在处理器上控制器,它把连续的视频图

56、像保存在内存中。在处理器上控制器,它把连续的视频图像保存在内存中。在处理器上控制器,它把连续的视频图像保存在内存中。在处理器上控制器,它把连续的视频图像保存在内存中。在处理器上运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。运行的软件控制加速器,对给定的帧进行处理,得到相应的导数图像。 图图图图图图555含有边缘检测加速器的视频系统含有

57、边缘检测加速器的视频系统含有边缘检测加速器的视频系统含有边缘检测加速器的视频系统含有边缘检测加速器的视频系统含有边缘检测加速器的视频系统这这这这这这 39视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例6 66:假设存储原始图像和导数图像的内存是:假设存储原始图像和导数图像的内存是:假设存储原始图像和导数图像的内存是:假设存储原始图像和导数图像的内存是:假设存储原始图像和导数图像的内存是:假设存储原始图像和导数图像的内存是323232位宽,并且每个字位宽,并且每个字位宽,并且每个字位宽,并且每个字位宽,并且每个字位宽,并且每个字节是单独编址的。视频图像是按照每个像素一个字节存储的。

58、一节是单独编址的。视频图像是按照每个像素一个字节存储的。一节是单独编址的。视频图像是按照每个像素一个字节存储的。一节是单独编址的。视频图像是按照每个像素一个字节存储的。一节是单独编址的。视频图像是按照每个像素一个字节存储的。一节是单独编址的。视频图像是按照每个像素一个字节存储的。一帧里一行的像素从左到右依次存储在连续的地址空间,并且所有帧里一行的像素从左到右依次存储在连续的地址空间,并且所有帧里一行的像素从左到右依次存储在连续的地址空间,并且所有帧里一行的像素从左到右依次存储在连续的地址空间,并且所有帧里一行的像素从左到右依次存储在连续的地址空间,并且所有帧里一行的像素从左到右依次存储在连续的

59、地址空间,并且所有行是从上到下,一行接一行地存储。每次内存读写需要花费行是从上到下,一行接一行地存储。每次内存读写需要花费行是从上到下,一行接一行地存储。每次内存读写需要花费行是从上到下,一行接一行地存储。每次内存读写需要花费行是从上到下,一行接一行地存储。每次内存读写需要花费行是从上到下,一行接一行地存储。每次内存读写需要花费202020纳纳纳纳纳纳秒,即需要秒,即需要秒,即需要秒,即需要秒,即需要秒,即需要 100MHz100MHz100MHz系统时钟的两个周期。问内存存取数据的速系统时钟的两个周期。问内存存取数据的速系统时钟的两个周期。问内存存取数据的速系统时钟的两个周期。问内存存取数据

60、的速系统时钟的两个周期。问内存存取数据的速系统时钟的两个周期。问内存存取数据的速度是否足够块?度是否足够块?度是否足够块?度是否足够块?度是否足够块?度是否足够块?解:解:解:解:解:解:前面的分析指出,摄像机以大约每秒前面的分析指出,摄像机以大约每秒前面的分析指出,摄像机以大约每秒前面的分析指出,摄像机以大约每秒前面的分析指出,摄像机以大约每秒前面的分析指出,摄像机以大约每秒100010001000万个像素的速度到达,万个像素的速度到达,万个像素的速度到达,万个像素的速度到达,万个像素的速度到达,万个像素的速度到达,即每即每即每即每即每即每100100100纳秒收到一个像素。如果视频输入控制

61、器用一次单独的纳秒收到一个像素。如果视频输入控制器用一次单独的纳秒收到一个像素。如果视频输入控制器用一次单独的纳秒收到一个像素。如果视频输入控制器用一次单独的纳秒收到一个像素。如果视频输入控制器用一次单独的纳秒收到一个像素。如果视频输入控制器用一次单独的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的写操作把每个像素点存储到内存中,它就会消耗可用内存带宽的20%20

62、%20%。更好的办法是控制器把四个像素值合起来,用一次写操作。更好的办法是控制器把四个像素值合起来,用一次写操作。更好的办法是控制器把四个像素值合起来,用一次写操作。更好的办法是控制器把四个像素值合起来,用一次写操作。更好的办法是控制器把四个像素值合起来,用一次写操作。更好的办法是控制器把四个像素值合起来,用一次写操作来存储这些像素,这样就可以把对内存带宽的占用减少到来存储这些像素,这样就可以把对内存带宽的占用减少到来存储这些像素,这样就可以把对内存带宽的占用减少到来存储这些像素,这样就可以把对内存带宽的占用减少到来存储这些像素,这样就可以把对内存带宽的占用减少到来存储这些像素,这样就可以把对

63、内存带宽的占用减少到5%5%5%。40视频边缘检测视频边缘检测视频边缘检测视频边缘检测边缘检测加速器必须以输入像素到达的同样速度计算边缘检测加速器必须以输入像素到达的同样速度计算边缘检测加速器必须以输入像素到达的同样速度计算边缘检测加速器必须以输入像素到达的同样速度计算边缘检测加速器必须以输入像素到达的同样速度计算边缘检测加速器必须以输入像素到达的同样速度计算出导数像素值,换言之,每出导数像素值,换言之,每出导数像素值,换言之,每出导数像素值,换言之,每出导数像素值,换言之,每出导数像素值,换言之,每100100100纳秒输出一个导数像素纳秒输出一个导数像素纳秒输出一个导数像素纳秒输出一个导数

64、像素纳秒输出一个导数像素纳秒输出一个导数像素值。因此,假定每四个导数像素合成一个值。因此,假定每四个导数像素合成一个值。因此,假定每四个导数像素合成一个值。因此,假定每四个导数像素合成一个值。因此,假定每四个导数像素合成一个值。因此,假定每四个导数像素合成一个323232比特的值,比特的值,比特的值,比特的值,比特的值,比特的值,则把计算出的导数像素值写入内存又消耗内存带宽的则把计算出的导数像素值写入内存又消耗内存带宽的则把计算出的导数像素值写入内存又消耗内存带宽的则把计算出的导数像素值写入内存又消耗内存带宽的则把计算出的导数像素值写入内存又消耗内存带宽的则把计算出的导数像素值写入内存又消耗内

65、存带宽的5%5%5%。计算每个像素需要从原始图像中取出。计算每个像素需要从原始图像中取出。计算每个像素需要从原始图像中取出。计算每个像素需要从原始图像中取出。计算每个像素需要从原始图像中取出。计算每个像素需要从原始图像中取出8 8 8个像素值。个像素值。个像素值。个像素值。个像素值。个像素值。一个天真的想法是一次只读取一个像素分多次读取,一个天真的想法是一次只读取一个像素分多次读取,一个天真的想法是一次只读取一个像素分多次读取,一个天真的想法是一次只读取一个像素分多次读取,一个天真的想法是一次只读取一个像素分多次读取,一个天真的想法是一次只读取一个像素分多次读取,并且计算后续像素的导数值时再次

66、照此方法读取。这并且计算后续像素的导数值时再次照此方法读取。这并且计算后续像素的导数值时再次照此方法读取。这并且计算后续像素的导数值时再次照此方法读取。这并且计算后续像素的导数值时再次照此方法读取。这并且计算后续像素的导数值时再次照此方法读取。这个方案完成每个像素的计算需要进行个方案完成每个像素的计算需要进行个方案完成每个像素的计算需要进行个方案完成每个像素的计算需要进行个方案完成每个像素的计算需要进行个方案完成每个像素的计算需要进行8 8 8次(中心像素点次(中心像素点次(中心像素点次(中心像素点次(中心像素点次(中心像素点周围的周围的周围的周围的周围的周围的8 8 8个像素)读取,占用个像

67、素)读取,占用个像素)读取,占用个像素)读取,占用个像素)读取,占用个像素)读取,占用160%160%160%的内存带宽。显然的内存带宽。显然的内存带宽。显然的内存带宽。显然的内存带宽。显然的内存带宽。显然这是不可能实现的。这是不可能实现的。这是不可能实现的。这是不可能实现的。这是不可能实现的。这是不可能实现的。 41视频边缘检测视频边缘检测视频边缘检测视频边缘检测 因为内存中每个因为内存中每个因为内存中每个因为内存中每个因为内存中每个因为内存中每个323232位字包括了四个相邻的行像位字包括了四个相邻的行像位字包括了四个相邻的行像位字包括了四个相邻的行像位字包括了四个相邻的行像位字包括了四个

68、相邻的行像素,每次读取素,每次读取素,每次读取素,每次读取素,每次读取素,每次读取323232位字,包含了尽可能多的像位字,包含了尽可能多的像位字,包含了尽可能多的像位字,包含了尽可能多的像位字,包含了尽可能多的像位字,包含了尽可能多的像素,可减少所需要的带宽。如果每一行里的三素,可减少所需要的带宽。如果每一行里的三素,可减少所需要的带宽。如果每一行里的三素,可减少所需要的带宽。如果每一行里的三素,可减少所需要的带宽。如果每一行里的三素,可减少所需要的带宽。如果每一行里的三个像素点在同一个个像素点在同一个个像素点在同一个个像素点在同一个个像素点在同一个个像素点在同一个323232位字中,读取三

69、行的像素位字中,读取三行的像素位字中,读取三行的像素位字中,读取三行的像素位字中,读取三行的像素位字中,读取三行的像素只需要三次。如果每一行里的三个像素点在不只需要三次。如果每一行里的三个像素点在不只需要三次。如果每一行里的三个像素点在不只需要三次。如果每一行里的三个像素点在不只需要三次。如果每一行里的三个像素点在不只需要三次。如果每一行里的三个像素点在不同的字中,则读取完整的三行像素需要同的字中,则读取完整的三行像素需要同的字中,则读取完整的三行像素需要同的字中,则读取完整的三行像素需要同的字中,则读取完整的三行像素需要同的字中,则读取完整的三行像素需要6 6 6次。次。次。次。次。次。所以

70、,计算每个像素的导数值平均需要所以,计算每个像素的导数值平均需要所以,计算每个像素的导数值平均需要所以,计算每个像素的导数值平均需要所以,计算每个像素的导数值平均需要所以,计算每个像素的导数值平均需要4.54.54.5次读次读次读次读次读次读操作,占用操作,占用操作,占用操作,占用操作,占用操作,占用90%90%90%的内存带宽。这个方案还是不的内存带宽。这个方案还是不的内存带宽。这个方案还是不的内存带宽。这个方案还是不的内存带宽。这个方案还是不的内存带宽。这个方案还是不可行。可行。可行。可行。可行。可行。 42视频边缘检测视频边缘检测视频边缘检测视频边缘检测注意,原始图像的像素,一旦被读取,

71、就可以用来计注意,原始图像的像素,一旦被读取,就可以用来计注意,原始图像的像素,一旦被读取,就可以用来计注意,原始图像的像素,一旦被读取,就可以用来计注意,原始图像的像素,一旦被读取,就可以用来计注意,原始图像的像素,一旦被读取,就可以用来计算该像素的后一列,本列和前一列中三个像素的导数,算该像素的后一列,本列和前一列中三个像素的导数,算该像素的后一列,本列和前一列中三个像素的导数,算该像素的后一列,本列和前一列中三个像素的导数,算该像素的后一列,本列和前一列中三个像素的导数,算该像素的后一列,本列和前一列中三个像素的导数,这样可以进一步减少所占的内存带宽。所以,我们可这样可以进一步减少所占的

72、内存带宽。所以,我们可这样可以进一步减少所占的内存带宽。所以,我们可这样可以进一步减少所占的内存带宽。所以,我们可这样可以进一步减少所占的内存带宽。所以,我们可这样可以进一步减少所占的内存带宽。所以,我们可以把读取的原始图像的像素存储在加速器中用于计算以把读取的原始图像的像素存储在加速器中用于计算以把读取的原始图像的像素存储在加速器中用于计算以把读取的原始图像的像素存储在加速器中用于计算以把读取的原始图像的像素存储在加速器中用于计算以把读取的原始图像的像素存储在加速器中用于计算多个像素的导数,而不是等到需要计算那些像素的导多个像素的导数,而不是等到需要计算那些像素的导多个像素的导数,而不是等到

73、需要计算那些像素的导多个像素的导数,而不是等到需要计算那些像素的导多个像素的导数,而不是等到需要计算那些像素的导多个像素的导数,而不是等到需要计算那些像素的导数值时再重新读取一遍。这样,每计算四个像素,只数值时再重新读取一遍。这样,每计算四个像素,只数值时再重新读取一遍。这样,每计算四个像素,只数值时再重新读取一遍。这样,每计算四个像素,只数值时再重新读取一遍。这样,每计算四个像素,只数值时再重新读取一遍。这样,每计算四个像素,只需要读取三个字,即只需要需要读取三个字,即只需要需要读取三个字,即只需要需要读取三个字,即只需要需要读取三个字,即只需要需要读取三个字,即只需要15%15%15%的内

74、存带宽。则读取的内存带宽。则读取的内存带宽。则读取的内存带宽。则读取的内存带宽。则读取的内存带宽。则读取三行像素所需的三行像素所需的三行像素所需的三行像素所需的三行像素所需的三行像素所需的15%15%15%内存带宽再加上把视频图像存入内存带宽再加上把视频图像存入内存带宽再加上把视频图像存入内存带宽再加上把视频图像存入内存带宽再加上把视频图像存入内存带宽再加上把视频图像存入内存所需的内存所需的内存所需的内存所需的内存所需的内存所需的5%5%5%,以及把像素导数值写入内存所需的,以及把像素导数值写入内存所需的,以及把像素导数值写入内存所需的,以及把像素导数值写入内存所需的,以及把像素导数值写入内存

75、所需的,以及把像素导数值写入内存所需的5% 5% 5% 带宽,共占用带宽,共占用带宽,共占用带宽,共占用带宽,共占用带宽,共占用25%25%25%的内存带宽。我们假设剩下的内存带宽。我们假设剩下的内存带宽。我们假设剩下的内存带宽。我们假设剩下的内存带宽。我们假设剩下的内存带宽。我们假设剩下75%75%75%的内的内的内的内的内的内存带宽足以完成系统的其它操作,则这个方案是可行存带宽足以完成系统的其它操作,则这个方案是可行存带宽足以完成系统的其它操作,则这个方案是可行存带宽足以完成系统的其它操作,则这个方案是可行存带宽足以完成系统的其它操作,则这个方案是可行存带宽足以完成系统的其它操作,则这个方

76、案是可行的。的。的。的。的。的。 43视频边缘检测视频边缘检测视频边缘检测视频边缘检测若需进一步减少加速器所消耗的带宽,可若需进一步减少加速器所消耗的带宽,可若需进一步减少加速器所消耗的带宽,可若需进一步减少加速器所消耗的带宽,可若需进一步减少加速器所消耗的带宽,可若需进一步减少加速器所消耗的带宽,可以在加速器中加入小块内存来存储从主存以在加速器中加入小块内存来存储从主存以在加速器中加入小块内存来存储从主存以在加速器中加入小块内存来存储从主存以在加速器中加入小块内存来存储从主存以在加速器中加入小块内存来存储从主存中读取的一整行。这可以让每个像素只被中读取的一整行。这可以让每个像素只被中读取的一

77、整行。这可以让每个像素只被中读取的一整行。这可以让每个像素只被中读取的一整行。这可以让每个像素只被中读取的一整行。这可以让每个像素只被读取一次,把读取像素所要求的带宽减少读取一次,把读取像素所要求的带宽减少读取一次,把读取像素所要求的带宽减少读取一次,把读取像素所要求的带宽减少读取一次,把读取像素所要求的带宽减少读取一次,把读取像素所要求的带宽减少到只有到只有到只有到只有到只有到只有5%5%5%。视频输入和边缘检测将总共只。视频输入和边缘检测将总共只。视频输入和边缘检测将总共只。视频输入和边缘检测将总共只。视频输入和边缘检测将总共只。视频输入和边缘检测将总共只占用占用占用占用占用占用15%15

78、%15%的可用带宽。的可用带宽。的可用带宽。的可用带宽。的可用带宽。的可用带宽。 44视频边缘检测视频边缘检测视频边缘检测视频边缘检测在设计边缘检测器加速器时,我们将采用以下方法:从在设计边缘检测器加速器时,我们将采用以下方法:从在设计边缘检测器加速器时,我们将采用以下方法:从在设计边缘检测器加速器时,我们将采用以下方法:从在设计边缘检测器加速器时,我们将采用以下方法:从在设计边缘检测器加速器时,我们将采用以下方法:从原始图像中读取三行,每行原始图像中读取三行,每行原始图像中读取三行,每行原始图像中读取三行,每行原始图像中读取三行,每行原始图像中读取三行,每行4 4 4个相邻的像素,把这些像个

79、相邻的像素,把这些像个相邻的像素,把这些像个相邻的像素,把这些像个相邻的像素,把这些像个相邻的像素,把这些像素值存储在加速器的寄存器中以待处理。我们把原始图素值存储在加速器的寄存器中以待处理。我们把原始图素值存储在加速器的寄存器中以待处理。我们把原始图素值存储在加速器的寄存器中以待处理。我们把原始图素值存储在加速器的寄存器中以待处理。我们把原始图素值存储在加速器的寄存器中以待处理。我们把原始图像的三整行作为一个数据块,整块的数据经过加速器以像的三整行作为一个数据块,整块的数据经过加速器以像的三整行作为一个数据块,整块的数据经过加速器以像的三整行作为一个数据块,整块的数据经过加速器以像的三整行作

80、为一个数据块,整块的数据经过加速器以像的三整行作为一个数据块,整块的数据经过加速器以后,形成导数图像中的一整行。正如我们后面要介绍后,形成导数图像中的一整行。正如我们后面要介绍后,形成导数图像中的一整行。正如我们后面要介绍后,形成导数图像中的一整行。正如我们后面要介绍后,形成导数图像中的一整行。正如我们后面要介绍后,形成导数图像中的一整行。正如我们后面要介绍的,这样的数据块的处理过程包括三个阶段:起始阶的,这样的数据块的处理过程包括三个阶段:起始阶的,这样的数据块的处理过程包括三个阶段:起始阶的,这样的数据块的处理过程包括三个阶段:起始阶的,这样的数据块的处理过程包括三个阶段:起始阶的,这样的

81、数据块的处理过程包括三个阶段:起始阶段,重复计算阶段,和完成阶段。不断地重复执行这段,重复计算阶段,和完成阶段。不断地重复执行这段,重复计算阶段,和完成阶段。不断地重复执行这段,重复计算阶段,和完成阶段。不断地重复执行这段,重复计算阶段,和完成阶段。不断地重复执行这段,重复计算阶段,和完成阶段。不断地重复执行这三个阶段,就可以求出导数图像中的每一行。三个阶段,就可以求出导数图像中的每一行。三个阶段,就可以求出导数图像中的每一行。三个阶段,就可以求出导数图像中的每一行。三个阶段,就可以求出导数图像中的每一行。三个阶段,就可以求出导数图像中的每一行。 45视频边缘检测视频边缘检测视频边缘检测视频边

82、缘检测 SobelSobelSobel加速器的数据路径结构如图加速器的数据路径结构如图加速器的数据路径结构如图加速器的数据路径结构如图加速器的数据路径结构如图加速器的数据路径结构如图6 66所示。它实质上是一个这样的所示。它实质上是一个这样的所示。它实质上是一个这样的所示。它实质上是一个这样的所示。它实质上是一个这样的所示。它实质上是一个这样的流水线,先从原始图像中依次读取三行像素值存入图右上角的寄流水线,先从原始图像中依次读取三行像素值存入图右上角的寄流水线,先从原始图像中依次读取三行像素值存入图右上角的寄流水线,先从原始图像中依次读取三行像素值存入图右上角的寄流水线,先从原始图像中依次读取

83、三行像素值存入图右上角的寄流水线,先从原始图像中依次读取三行像素值存入图右上角的寄存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向存器,再让这些像素按时钟节拍流过左侧的乘法器阵列,然后向下流过加法器到达下流过加法器到达下流过加法器到达下流过加法器到达下流过加法器到达下流过加法器到达 DxDxDx和和和和和和 DyDyDy寄存器,再通过绝对值电路和加法器寄存器,再通过

84、绝对值电路和加法器寄存器,再通过绝对值电路和加法器寄存器,再通过绝对值电路和加法器寄存器,再通过绝对值电路和加法器寄存器,再通过绝对值电路和加法器到达到达到达到达到达到达 |D| |D| |D| 寄存器,最终进入图左下角的寄存器。然后把计算得到寄存器,最终进入图左下角的寄存器。然后把计算得到寄存器,最终进入图左下角的寄存器。然后把计算得到寄存器,最终进入图左下角的寄存器。然后把计算得到寄存器,最终进入图左下角的寄存器。然后把计算得到寄存器,最终进入图左下角的寄存器。然后把计算得到的像导数素值从寄存器写到内存中。(尽管一个从右到左的数据的像导数素值从寄存器写到内存中。(尽管一个从右到左的数据的像

85、导数素值从寄存器写到内存中。(尽管一个从右到左的数据的像导数素值从寄存器写到内存中。(尽管一个从右到左的数据的像导数素值从寄存器写到内存中。(尽管一个从右到左的数据的像导数素值从寄存器写到内存中。(尽管一个从右到左的数据流和通常情况是相反的,但在本例中,这样有助于保持像素的位流和通常情况是相反的,但在本例中,这样有助于保持像素的位流和通常情况是相反的,但在本例中,这样有助于保持像素的位流和通常情况是相反的,但在本例中,这样有助于保持像素的位流和通常情况是相反的,但在本例中,这样有助于保持像素的位流和通常情况是相反的,但在本例中,这样有助于保持像素的位置安排和原图像一致)。我们将先假设流水线从一

86、开始就充满置安排和原图像一致)。我们将先假设流水线从一开始就充满置安排和原图像一致)。我们将先假设流水线从一开始就充满置安排和原图像一致)。我们将先假设流水线从一开始就充满置安排和原图像一致)。我们将先假设流水线从一开始就充满置安排和原图像一致)。我们将先假设流水线从一开始就充满有效数据来描述流水线的操作过程。然后再讨论在图像行的起始有效数据来描述流水线的操作过程。然后再讨论在图像行的起始有效数据来描述流水线的操作过程。然后再讨论在图像行的起始有效数据来描述流水线的操作过程。然后再讨论在图像行的起始有效数据来描述流水线的操作过程。然后再讨论在图像行的起始有效数据来描述流水线的操作过程。然后再讨

87、论在图像行的起始处流水线是如何启动的,和在图像行的结尾处,流水线中的数据处流水线是如何启动的,和在图像行的结尾处,流水线中的数据处流水线是如何启动的,和在图像行的结尾处,流水线中的数据处流水线是如何启动的,和在图像行的结尾处,流水线中的数据处流水线是如何启动的,和在图像行的结尾处,流水线中的数据处流水线是如何启动的,和在图像行的结尾处,流水线中的数据又是如何排出的。又是如何排出的。又是如何排出的。又是如何排出的。又是如何排出的。又是如何排出的。 46视频边缘检测视频边缘检测视频边缘检测视频边缘检测图图6 Sobel6 Sobel加速器数据通路结构加速器数据通路结构47视频边缘检测视频边缘检测视

88、频边缘检测视频边缘检测计算流水线按照每四个像素值一组的形式产生给定行计算流水线按照每四个像素值一组的形式产生给定行计算流水线按照每四个像素值一组的形式产生给定行计算流水线按照每四个像素值一组的形式产生给定行计算流水线按照每四个像素值一组的形式产生给定行计算流水线按照每四个像素值一组的形式产生给定行的导数像素值。加速器从内存中的上一行,本行,下的导数像素值。加速器从内存中的上一行,本行,下的导数像素值。加速器从内存中的上一行,本行,下的导数像素值。加速器从内存中的上一行,本行,下的导数像素值。加速器从内存中的上一行,本行,下的导数像素值。加速器从内存中的上一行,本行,下一行各读取四个像素点到如图

89、一行各读取四个像素点到如图一行各读取四个像素点到如图一行各读取四个像素点到如图一行各读取四个像素点到如图一行各读取四个像素点到如图6 6 6所示右上角的所示右上角的所示右上角的所示右上角的所示右上角的所示右上角的3 3 3个个个个个个323232位位位位位位寄存器中。每个寄存器包括寄存器中。每个寄存器包括寄存器中。每个寄存器包括寄存器中。每个寄存器包括寄存器中。每个寄存器包括寄存器中。每个寄存器包括4 4 4个个个个个个8 8 8比特像素值寄存器。比特像素值寄存器。比特像素值寄存器。比特像素值寄存器。比特像素值寄存器。比特像素值寄存器。在接下来的四个时钟周期里,像素值依次左移,每次在接下来的四

90、个时钟周期里,像素值依次左移,每次在接下来的四个时钟周期里,像素值依次左移,每次在接下来的四个时钟周期里,像素值依次左移,每次在接下来的四个时钟周期里,像素值依次左移,每次在接下来的四个时钟周期里,像素值依次左移,每次一个像素值,到乘法器阵列中。阵列中的每个单元包一个像素值,到乘法器阵列中。阵列中的每个单元包一个像素值,到乘法器阵列中。阵列中的每个单元包一个像素值,到乘法器阵列中。阵列中的每个单元包一个像素值,到乘法器阵列中。阵列中的每个单元包一个像素值,到乘法器阵列中。阵列中的每个单元包括一个像素值寄存器和一个或两个乘法电路。乘法电括一个像素值寄存器和一个或两个乘法电路。乘法电括一个像素值寄

91、存器和一个或两个乘法电路。乘法电括一个像素值寄存器和一个或两个乘法电路。乘法电括一个像素值寄存器和一个或两个乘法电路。乘法电括一个像素值寄存器和一个或两个乘法电路。乘法电路用于把像素值寄存器中存储的像素值乘以一个常量路用于把像素值寄存器中存储的像素值乘以一个常量路用于把像素值寄存器中存储的像素值乘以一个常量路用于把像素值寄存器中存储的像素值乘以一个常量路用于把像素值寄存器中存储的像素值乘以一个常量路用于把像素值寄存器中存储的像素值乘以一个常量系数。系数。系数。系数。系数。系数。 48视频边缘检测视频边缘检测视频边缘检测视频边缘检测 因为系数都是因为系数都是因为系数都是因为系数都是因为系数都是因

92、为系数都是-1-1-1,+1+1+1,-2-2-2或者或者或者或者或者或者+2+2+2,这些电路并不是完,这些电路并不是完,这些电路并不是完,这些电路并不是完,这些电路并不是完,这些电路并不是完全意义上的的乘法器。相反,乘以全意义上的的乘法器。相反,乘以全意义上的的乘法器。相反,乘以全意义上的的乘法器。相反,乘以全意义上的的乘法器。相反,乘以全意义上的的乘法器。相反,乘以-1-1-1仅仅是一个取反仅仅是一个取反仅仅是一个取反仅仅是一个取反仅仅是一个取反仅仅是一个取反电路,乘以电路,乘以电路,乘以电路,乘以电路,乘以电路,乘以+1+1+1是一个直通连接而没有任何电路,乘以是一个直通连接而没有任何

93、电路,乘以是一个直通连接而没有任何电路,乘以是一个直通连接而没有任何电路,乘以是一个直通连接而没有任何电路,乘以是一个直通连接而没有任何电路,乘以-2-2-2是把取反电路的结果左移,乘以是把取反电路的结果左移,乘以是把取反电路的结果左移,乘以是把取反电路的结果左移,乘以是把取反电路的结果左移,乘以是把取反电路的结果左移,乘以+2+2+2仅仅是一个左移。仅仅是一个左移。仅仅是一个左移。仅仅是一个左移。仅仅是一个左移。仅仅是一个左移。在每个时钟周期,硬件电路阵列提供了求一个导数像在每个时钟周期,硬件电路阵列提供了求一个导数像在每个时钟周期,硬件电路阵列提供了求一个导数像在每个时钟周期,硬件电路阵列

94、提供了求一个导数像在每个时钟周期,硬件电路阵列提供了求一个导数像在每个时钟周期,硬件电路阵列提供了求一个导数像素值所需要的部分积,部分积加起来后存储到素值所需要的部分积,部分积加起来后存储到素值所需要的部分积,部分积加起来后存储到素值所需要的部分积,部分积加起来后存储到素值所需要的部分积,部分积加起来后存储到素值所需要的部分积,部分积加起来后存储到 DxDxDx和和和和和和Dy Dy Dy 寄存器中。同样,在每个时钟周期,计算出前一个寄存器中。同样,在每个时钟周期,计算出前一个寄存器中。同样,在每个时钟周期,计算出前一个寄存器中。同样,在每个时钟周期,计算出前一个寄存器中。同样,在每个时钟周期

95、,计算出前一个寄存器中。同样,在每个时钟周期,计算出前一个像素值的像素值的像素值的像素值的像素值的像素值的Dx Dx Dx 和和和和和和DyDyDy的绝对值,加起来后存储到的绝对值,加起来后存储到的绝对值,加起来后存储到的绝对值,加起来后存储到的绝对值,加起来后存储到的绝对值,加起来后存储到 |D| |D| |D| 寄存寄存寄存寄存寄存寄存器中。器中。器中。器中。器中。器中。|D| |D| |D| 寄存器中的导数像素值左移到结果行寄存器寄存器中的导数像素值左移到结果行寄存器寄存器中的导数像素值左移到结果行寄存器寄存器中的导数像素值左移到结果行寄存器寄存器中的导数像素值左移到结果行寄存器寄存器中

96、的导数像素值左移到结果行寄存器中。当寄存器中四个结果像素值都准备好后,随即被中。当寄存器中四个结果像素值都准备好后,随即被中。当寄存器中四个结果像素值都准备好后,随即被中。当寄存器中四个结果像素值都准备好后,随即被中。当寄存器中四个结果像素值都准备好后,随即被中。当寄存器中四个结果像素值都准备好后,随即被写入到内存中去。写入到内存中去。写入到内存中去。写入到内存中去。写入到内存中去。写入到内存中去。 49视频边缘检测视频边缘检测视频边缘检测视频边缘检测进入稳态后,在处理一行的过程中,加速器在移入新的像素值到进入稳态后,在处理一行的过程中,加速器在移入新的像素值到进入稳态后,在处理一行的过程中,

97、加速器在移入新的像素值到进入稳态后,在处理一行的过程中,加速器在移入新的像素值到进入稳态后,在处理一行的过程中,加速器在移入新的像素值到进入稳态后,在处理一行的过程中,加速器在移入新的像素值到乘法法器阵列乘法法器阵列乘法法器阵列乘法法器阵列乘法法器阵列乘法法器阵列 ,DxDxDx,DyDyDy和和和和和和 |D| |D| |D| 寄存器之前,需要把导数像素值从寄存器之前,需要把导数像素值从寄存器之前,需要把导数像素值从寄存器之前,需要把导数像素值从寄存器之前,需要把导数像素值从寄存器之前,需要把导数像素值从结果寄存器写到内存中。否则,上一次计算结果就会被覆盖掉。结果寄存器写到内存中。否则,上一

98、次计算结果就会被覆盖掉。结果寄存器写到内存中。否则,上一次计算结果就会被覆盖掉。结果寄存器写到内存中。否则,上一次计算结果就会被覆盖掉。结果寄存器写到内存中。否则,上一次计算结果就会被覆盖掉。结果寄存器写到内存中。否则,上一次计算结果就会被覆盖掉。在把四个像素值写到内存后,读寄存器中的像素值已经全部移入在把四个像素值写到内存后,读寄存器中的像素值已经全部移入在把四个像素值写到内存后,读寄存器中的像素值已经全部移入在把四个像素值写到内存后,读寄存器中的像素值已经全部移入在把四个像素值写到内存后,读寄存器中的像素值已经全部移入在把四个像素值写到内存后,读寄存器中的像素值已经全部移入流水线中,此时读

99、寄存器为空。我们再读入三组各四个像素点,流水线中,此时读寄存器为空。我们再读入三组各四个像素点,流水线中,此时读寄存器为空。我们再读入三组各四个像素点,流水线中,此时读寄存器为空。我们再读入三组各四个像素点,流水线中,此时读寄存器为空。我们再读入三组各四个像素点,流水线中,此时读寄存器为空。我们再读入三组各四个像素点,像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素

100、像素值按时钟节拍移入计算流水线,当结果寄存器填满四个像素值后,再次写到内存值后,再次写到内存值后,再次写到内存值后,再次写到内存值后,再次写到内存值后,再次写到内存 然后不断重复这个过程。时序如图然后不断重复这个过程。时序如图然后不断重复这个过程。时序如图然后不断重复这个过程。时序如图然后不断重复这个过程。时序如图然后不断重复这个过程。时序如图7 77所示。所示。所示。所示。所示。所示。假设加速器有一个假设加速器有一个假设加速器有一个假设加速器有一个假设加速器有一个假设加速器有一个WishboneWishboneWishbone总线接口,数据位宽总线接口,数据位宽总线接口,数据位宽总线接口,数

101、据位宽总线接口,数据位宽总线接口,数据位宽323232位,时钟频率位,时钟频率位,时钟频率位,时钟频率位,时钟频率位,时钟频率为为为为为为100MHz100MHz100MHz。加速器是内存总线的主设备之一,它必须先给仲裁器。加速器是内存总线的主设备之一,它必须先给仲裁器。加速器是内存总线的主设备之一,它必须先给仲裁器。加速器是内存总线的主设备之一,它必须先给仲裁器。加速器是内存总线的主设备之一,它必须先给仲裁器。加速器是内存总线的主设备之一,它必须先给仲裁器发出访问内存的请求信号,等总线仲裁器批准以后,才能读写内发出访问内存的请求信号,等总线仲裁器批准以后,才能读写内发出访问内存的请求信号,等

102、总线仲裁器批准以后,才能读写内发出访问内存的请求信号,等总线仲裁器批准以后,才能读写内发出访问内存的请求信号,等总线仲裁器批准以后,才能读写内发出访问内存的请求信号,等总线仲裁器批准以后,才能读写内存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以存。我们假设仲裁器给加速器足够高的优先权,这样加速器可以占有需要的内存带宽。占有需要的内存带宽。占有需要的内存带宽。占有需

103、要的内存带宽。占有需要的内存带宽。占有需要的内存带宽。 50视频边缘检测视频边缘检测视频边缘检测视频边缘检测图图图图图图777流水线中像素读写操作和计算的时序流水线中像素读写操作和计算的时序流水线中像素读写操作和计算的时序流水线中像素读写操作和计算的时序流水线中像素读写操作和计算的时序流水线中像素读写操作和计算的时序51视频边缘检测视频边缘检测视频边缘检测视频边缘检测我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考虑我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考虑我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考虑我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考

104、虑我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考虑我们已经考虑了处理一行像素过程中的稳定状态,下面我们将考虑在一行像素的开始处流水线是如何启动的。在处理一行像素的在一行像素的开始处流水线是如何启动的。在处理一行像素的在一行像素的开始处流水线是如何启动的。在处理一行像素的在一行像素的开始处流水线是如何启动的。在处理一行像素的在一行像素的开始处流水线是如何启动的。在处理一行像素的在一行像素的开始处流水线是如何启动的。在处理一行像素的开始处,流水线中的寄存器中没有有效的数据。我们先读入三开始处,流水线中的寄存器中没有有效的数据。我们先读入三开始处,流水线中的寄存器中没有有效的数据。我们先读

105、入三开始处,流水线中的寄存器中没有有效的数据。我们先读入三开始处,流水线中的寄存器中没有有效的数据。我们先读入三开始处,流水线中的寄存器中没有有效的数据。我们先读入三行各四个像素值,经过四个计算周期(行各四个像素值,经过四个计算周期(行各四个像素值,经过四个计算周期(行各四个像素值,经过四个计算周期(行各四个像素值,经过四个计算周期(行各四个像素值,经过四个计算周期(4 44个时钟周期)后,有效个时钟周期)后,有效个时钟周期)后,有效个时钟周期)后,有效个时钟周期)后,有效个时钟周期)后,有效数据已经进入到流水线中的数据已经进入到流水线中的数据已经进入到流水线中的数据已经进入到流水线中的数据已

106、经进入到流水线中的数据已经进入到流水线中的DxDxDx和和和和和和 DyDyDy寄存器。此时,结果寄存器寄存器。此时,结果寄存器寄存器。此时,结果寄存器寄存器。此时,结果寄存器寄存器。此时,结果寄存器寄存器。此时,结果寄存器中没有有效数据。因此,在经过第一次四个计算周期后不进行中没有有效数据。因此,在经过第一次四个计算周期后不进行中没有有效数据。因此,在经过第一次四个计算周期后不进行中没有有效数据。因此,在经过第一次四个计算周期后不进行中没有有效数据。因此,在经过第一次四个计算周期后不进行中没有有效数据。因此,在经过第一次四个计算周期后不进行写操作。由于读寄存器已空,再读入三行像素值,经过四个

107、计写操作。由于读寄存器已空,再读入三行像素值,经过四个计写操作。由于读寄存器已空,再读入三行像素值,经过四个计写操作。由于读寄存器已空,再读入三行像素值,经过四个计写操作。由于读寄存器已空,再读入三行像素值,经过四个计写操作。由于读寄存器已空,再读入三行像素值,经过四个计算周期后,有效数据已经进入到最右侧的三个结果像素值寄存算周期后,有效数据已经进入到最右侧的三个结果像素值寄存算周期后,有效数据已经进入到最右侧的三个结果像素值寄存算周期后,有效数据已经进入到最右侧的三个结果像素值寄存算周期后,有效数据已经进入到最右侧的三个结果像素值寄存算周期后,有效数据已经进入到最右侧的三个结果像素值寄存器中

108、。最左侧的结果像素值寄存器里仍然是无效数据。我们前器中。最左侧的结果像素值寄存器里仍然是无效数据。我们前器中。最左侧的结果像素值寄存器里仍然是无效数据。我们前器中。最左侧的结果像素值寄存器里仍然是无效数据。我们前器中。最左侧的结果像素值寄存器里仍然是无效数据。我们前器中。最左侧的结果像素值寄存器里仍然是无效数据。我们前面曾经提过,最左边的像素位置没有一组完整的相邻像素点来面曾经提过,最左边的像素位置没有一组完整的相邻像素点来面曾经提过,最左边的像素位置没有一组完整的相邻像素点来面曾经提过,最左边的像素位置没有一组完整的相邻像素点来面曾经提过,最左边的像素位置没有一组完整的相邻像素点来面曾经提过

109、,最左边的像素位置没有一组完整的相邻像素点来计算导数像素值,我们将用软件把它设为计算导数像素值,我们将用软件把它设为计算导数像素值,我们将用软件把它设为计算导数像素值,我们将用软件把它设为计算导数像素值,我们将用软件把它设为计算导数像素值,我们将用软件把它设为0 00。所以,得到的第一。所以,得到的第一。所以,得到的第一。所以,得到的第一。所以,得到的第一。所以,得到的第一组导数像素值(一个无效值和三个有效值)应该写入内存中。组导数像素值(一个无效值和三个有效值)应该写入内存中。组导数像素值(一个无效值和三个有效值)应该写入内存中。组导数像素值(一个无效值和三个有效值)应该写入内存中。组导数像

110、素值(一个无效值和三个有效值)应该写入内存中。组导数像素值(一个无效值和三个有效值)应该写入内存中。此后,流水线进入了稳态,这种情况前面已经讨论过。此后,流水线进入了稳态,这种情况前面已经讨论过。此后,流水线进入了稳态,这种情况前面已经讨论过。此后,流水线进入了稳态,这种情况前面已经讨论过。此后,流水线进入了稳态,这种情况前面已经讨论过。此后,流水线进入了稳态,这种情况前面已经讨论过。52视频边缘检测视频边缘检测视频边缘检测视频边缘检测当到达一行的结尾,我们需要排出流水线中的数据。因当到达一行的结尾,我们需要排出流水线中的数据。因当到达一行的结尾,我们需要排出流水线中的数据。因当到达一行的结尾

111、,我们需要排出流水线中的数据。因当到达一行的结尾,我们需要排出流水线中的数据。因当到达一行的结尾,我们需要排出流水线中的数据。因为一行里像素点的个数是为一行里像素点的个数是为一行里像素点的个数是为一行里像素点的个数是为一行里像素点的个数是为一行里像素点的个数是4 4 4的整数倍(的整数倍(的整数倍(的整数倍(的整数倍(的整数倍(640 =160640 =160640 =160 4 4 4 ),),),),),),我们每次都可以读到包含四个像素值的完整组。当我们我们每次都可以读到包含四个像素值的完整组。当我们我们每次都可以读到包含四个像素值的完整组。当我们我们每次都可以读到包含四个像素值的完整组

112、。当我们我们每次都可以读到包含四个像素值的完整组。当我们我们每次都可以读到包含四个像素值的完整组。当我们把一行里最后四个像素读入读寄存器,经过四个计算周把一行里最后四个像素读入读寄存器,经过四个计算周把一行里最后四个像素读入读寄存器,经过四个计算周把一行里最后四个像素读入读寄存器,经过四个计算周把一行里最后四个像素读入读寄存器,经过四个计算周把一行里最后四个像素读入读寄存器,经过四个计算周期后,结果寄存器被移入四个新的结果值,同时读寄存期后,结果寄存器被移入四个新的结果值,同时读寄存期后,结果寄存器被移入四个新的结果值,同时读寄存期后,结果寄存器被移入四个新的结果值,同时读寄存期后,结果寄存器

113、被移入四个新的结果值,同时读寄存期后,结果寄存器被移入四个新的结果值,同时读寄存器中的像素值被全部移入流水线中。然后结果寄存器被器中的像素值被全部移入流水线中。然后结果寄存器被器中的像素值被全部移入流水线中。然后结果寄存器被器中的像素值被全部移入流水线中。然后结果寄存器被器中的像素值被全部移入流水线中。然后结果寄存器被器中的像素值被全部移入流水线中。然后结果寄存器被写入内存。由于整行像素已经被读完,不执行读操作。写入内存。由于整行像素已经被读完,不执行读操作。写入内存。由于整行像素已经被读完,不执行读操作。写入内存。由于整行像素已经被读完,不执行读操作。写入内存。由于整行像素已经被读完,不执行

114、读操作。写入内存。由于整行像素已经被读完,不执行读操作。此时,流水线中还有数据,再执行四个计算周期排出流此时,流水线中还有数据,再执行四个计算周期排出流此时,流水线中还有数据,再执行四个计算周期排出流此时,流水线中还有数据,再执行四个计算周期排出流此时,流水线中还有数据,再执行四个计算周期排出流此时,流水线中还有数据,再执行四个计算周期排出流水线中的数据。经过这四个计算周期,结果寄存器被移水线中的数据。经过这四个计算周期,结果寄存器被移水线中的数据。经过这四个计算周期,结果寄存器被移水线中的数据。经过这四个计算周期,结果寄存器被移水线中的数据。经过这四个计算周期,结果寄存器被移水线中的数据。经

115、过这四个计算周期,结果寄存器被移入四个数据,但是寄存器中最右边的数据是无效数据。入四个数据,但是寄存器中最右边的数据是无效数据。入四个数据,但是寄存器中最右边的数据是无效数据。入四个数据,但是寄存器中最右边的数据是无效数据。入四个数据,但是寄存器中最右边的数据是无效数据。入四个数据,但是寄存器中最右边的数据是无效数据。因为图像最右边的像素点没有完整的相邻像素组。我们因为图像最右边的像素点没有完整的相邻像素组。我们因为图像最右边的像素点没有完整的相邻像素组。我们因为图像最右边的像素点没有完整的相邻像素组。我们因为图像最右边的像素点没有完整的相邻像素组。我们因为图像最右边的像素点没有完整的相邻像素

116、组。我们还将用软件把那个像素值清零。还将用软件把那个像素值清零。还将用软件把那个像素值清零。还将用软件把那个像素值清零。还将用软件把那个像素值清零。还将用软件把那个像素值清零。 53视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例7: 7: 7: 编写编写编写编写编写编写VerilogVerilogVerilog寄存器传输级代码来描述图寄存器传输级代码来描述图寄存器传输级代码来描述图寄存器传输级代码来描述图寄存器传输级代码来描述图寄存器传输级代码来描述图666的数据通路。的数据通路。的数据通路。的数据通路。的数据通路。的数据通路。答:定义答:定义答:定义答:定义答:定义答:定义So

117、belSobelSobel加速器模块的加速器模块的加速器模块的加速器模块的加速器模块的加速器模块的VerilogVerilogVerilog代码如下:代码如下:代码如下:代码如下:代码如下:代码如下:/计算数据通路信号计算数据通路信号计算数据通路信号计算数据通路信号计算数据通路信号计算数据通路信号regregreg31:0 prev_row, curr_row, next_row;31:0 prev_row, curr_row, next_row;31:0 prev_row, curr_row, next_row;regregreg7:07:07:0O-1:1-1:1;O-1:1-1:1;O-

118、1:1-1:1;reg signed reg signed reg signed 10:010:010:0Dx, Dy;Dx, Dy;Dx, Dy;wire signed 10:0 D;wire signed 10:0 D;wire signed 10:0 D;regregreg7:07:07:0abs_D;abs_D;abs_D;regregreg31:031:031:0result_row;result_row;result_row;/可进行计算的数据通路可进行计算的数据通路可进行计算的数据通路可进行计算的数据通路可进行计算的数据通路可进行计算的数据通路always(posedge clk

119、_i) /always(posedge clk_i) /always(posedge clk_i) /上一行寄存器上一行寄存器上一行寄存器上一行寄存器上一行寄存器上一行寄存器if(prev_row_load)if(prev_row_load)if(prev_row_load) prev_row prev_row prev_row= dat_i;= dat_i;= dat_i;else else else if(shift_en) if(shift_en) if(shift_en) prev_row31:8 = prev_row23:0; prev_row31:8 = prev_row23:0;

120、 prev_row31:8 = prev_row23:0; 54视频边缘检测视频边缘检测视频边缘检测视频边缘检测 always(posedge clk_i) /always(posedge clk_i) /always(posedge clk_i) /当前行寄存器当前行寄存器当前行寄存器当前行寄存器当前行寄存器当前行寄存器if(curr_row_load)if(curr_row_load)if(curr_row_load) curr_row= dat_i; curr_row= dat_i; curr_row= dat_i;else else else if(shift_en ) if(shif

121、t_en ) if(shift_en ) curr_row 31:8=curr_row23:0; curr_row 31:8=curr_row23:0; curr_row 31:8=curr_row23:0;always(posedge clk_i) /always(posedge clk_i) /always(posedge clk_i) /下一行寄存器下一行寄存器下一行寄存器下一行寄存器下一行寄存器下一行寄存器if(next_row_load)if(next_row_load)if(next_row_load) next_row=dat_i; next_row=dat_i; next_ro

122、w=dat_i;elseelseelse if(shift_en ) if(shift_en ) if(shift_en ) next_row 31:8=next_row23:0; next_row 31:8=next_row23:0; next_row 31:8=0 ? x : -x ;abs = x =0 ? x : -x ;abs = x =0 ? x : -x ;endfunctionendfunctionendfunction/计算流水线计算流水线计算流水线计算流水线计算流水线计算流水线assign D = abs(Dx) + abs(Dy);assign D = abs(Dx) +

123、 abs(Dy);assign D = abs(Dx) + abs(Dy);always (posedge clk_i) always (posedge clk_i) always (posedge clk_i) if ( shift_en )if ( shift_en )if ( shift_en ) begin begin beginabs_D = D10:3;abs_D = D10:3;abs_D = D10:3;Dx = -$signed(3b000, O-1-1)Dx = -$signed(3b000, O-1-1)Dx = -$signed(3b000, O-1-1) /-1* O

124、-1-1 /-1* O-1-1 /-1* O-1-1 +$signed(3b000, O-1+1) +$signed(3b000, O-1+1) +$signed(3b000, O-1+1) /+1* O-1+1 /+1* 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 0-1) 1) /-2* O 0-1 +($signed(3b000, O 0+1) 1) /+2* O 0+1 +($signed(3b000, O

125、0+1) 1) /+2* O 0+1 +($signed(3b000, O 0+1) 1) /+2* O 0+1 -$signed(3b000, O+1-1) -$signed(3b000, O+1-1) -$signed(3b000, O+1-1) /-1* O+1-1 /-1* O+1-1 /-1* O+1-1 +$signed(3b000, O+1+1); +$signed(3b000, O+1+1); +$signed(3b000, O+1+1); /+1* O+1+1 /+1* O+1+1 /+1* O+1+1 56视频边缘检测视频边缘检测视频边缘检测视频边缘检测 Dy = $sig

126、ned(3b000, O-1-1) Dy = $signed(3b000, O-1-1) Dy = $signed(3b000, O-1-1) /+1* O-1-1 /+1* O-1-1 /+1* O-1-1 +($signed(3b000, O-1 0) 1) +($signed(3b000, O-1 0) 1) +($signed(3b000, O-1 0) 1) /+2* O-10 /+2* O-10 /+2* O-10 +$signed(3b000, O-1+1) +$signed(3b000, O-1+1) +$signed(3b000, O-1+1) /+1* O-1+1/+1*

127、O-1+1/+1* O-1+1 -$signed(3b000, O+1-1) /-1* O+1-1 -$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 0) 1) /-2* O+1 0 -($signed(3b000, O+1 0) 1) /-2* O+1 0 - $signed(3b000, O+1+1); - $signed(3b000, O+1+1); - $signed(3b000, O

128、+1+1); /-1* O+1+1/-1* O+1+1/-1* O+1+1 O-1-1 = O-10; O-1-1 = O-10; O-1-1 = O-10; O-1 0 = O-1+1; O-1 0 = O-1+1; O-1 0 = O-1+1; O-1+1 = prev_row31:24; O-1+1 = prev_row31:24; O-1+1 = prev_row31:24; O 0-1 = O00; O 0-1 = O00; O 0-1 = O00; O 0 0 = O0+1; O 0 0 = O0+1; O 0 0 = O0+1; O 0+1 = curr_row31:24; O

129、0+1 = curr_row31:24; O 0+1 = curr_row31:24; O+1-1 = O+10; O+1-1 = O+10; O+1-1 = O+10; O+1 0 = O+1+1; O+1 0 = O+1+1; O+1 0 = O+1+1; O+1+1 = next_row31:24; O+1+1 = next_row31:24; O+1+1 = next_row31:24; end end endalwaysalwaysalways(posedge clk_i)(posedge clk_i)(posedge clk_i)/结果行寄存器结果行寄存器结果行寄存器结果行寄存器结

130、果行寄存器结果行寄存器if(shift_en)if(shift_en)if(shift_en) result_row result_row result_row= result_row23:0, abs_D ;= result_row23:0, abs_D ;= result_row23:0, abs_D ;57视频边缘检测视频边缘检测视频边缘检测视频边缘检测模块中前三个模块中前三个模块中前三个模块中前三个模块中前三个模块中前三个alwaysalwaysalways块表示三个寄存器组(每块表示三个寄存器组(每块表示三个寄存器组(每块表示三个寄存器组(每块表示三个寄存器组(每块表示三个寄存器组(

131、每个寄存器组由四个个寄存器组由四个个寄存器组由四个个寄存器组由四个个寄存器组由四个个寄存器组由四个8 8 8比特的寄存器组成),从比特的寄存器组成),从比特的寄存器组成),从比特的寄存器组成),从比特的寄存器组成),从比特的寄存器组成),从内存中读取的每组四个像素值被加载到这三内存中读取的每组四个像素值被加载到这三内存中读取的每组四个像素值被加载到这三内存中读取的每组四个像素值被加载到这三内存中读取的每组四个像素值被加载到这三内存中读取的每组四个像素值被加载到这三个寄存器组中。因为这些寄存器要通过依次个寄存器组中。因为这些寄存器要通过依次个寄存器组中。因为这些寄存器要通过依次个寄存器组中。因为

132、这些寄存器要通过依次个寄存器组中。因为这些寄存器要通过依次个寄存器组中。因为这些寄存器要通过依次读取内存来加载数据,所以每个寄存器组有读取内存来加载数据,所以每个寄存器组有读取内存来加载数据,所以每个寄存器组有读取内存来加载数据,所以每个寄存器组有读取内存来加载数据,所以每个寄存器组有读取内存来加载数据,所以每个寄存器组有一个单独的控制信号来控制数据的加载。同一个单独的控制信号来控制数据的加载。同一个单独的控制信号来控制数据的加载。同一个单独的控制信号来控制数据的加载。同一个单独的控制信号来控制数据的加载。同一个单独的控制信号来控制数据的加载。同时,三组寄存器都并行地把一个像素值移出时,三组寄

133、存器都并行地把一个像素值移出时,三组寄存器都并行地把一个像素值移出时,三组寄存器都并行地把一个像素值移出时,三组寄存器都并行地把一个像素值移出时,三组寄存器都并行地把一个像素值移出寄存器,进入流水线中,所以它们共用一个寄存器,进入流水线中,所以它们共用一个寄存器,进入流水线中,所以它们共用一个寄存器,进入流水线中,所以它们共用一个寄存器,进入流水线中,所以它们共用一个寄存器,进入流水线中,所以它们共用一个移位控制信号。移位控制信号。移位控制信号。移位控制信号。移位控制信号。移位控制信号。 58视频边缘检测视频边缘检测视频边缘检测视频边缘检测第四个第四个第四个第四个第四个第四个alwaysalw

134、aysalways块,描述加速器的计算流水线。所有的计块,描述加速器的计算流水线。所有的计块,描述加速器的计算流水线。所有的计块,描述加速器的计算流水线。所有的计块,描述加速器的计算流水线。所有的计块,描述加速器的计算流水线。所有的计算逻辑和寄存器移位操作都在控制信号算逻辑和寄存器移位操作都在控制信号算逻辑和寄存器移位操作都在控制信号算逻辑和寄存器移位操作都在控制信号算逻辑和寄存器移位操作都在控制信号算逻辑和寄存器移位操作都在控制信号shift_enshift_enshift_en控制控制控制控制控制控制下进行。信号下进行。信号下进行。信号下进行。信号下进行。信号下进行。信号OOO是一个的原始

135、图像像素阵列(类似于是一个的原始图像像素阵列(类似于是一个的原始图像像素阵列(类似于是一个的原始图像像素阵列(类似于是一个的原始图像像素阵列(类似于是一个的原始图像像素阵列(类似于CCC语言中的二维数组),该阵列(数组)中的每个元语言中的二维数组),该阵列(数组)中的每个元语言中的二维数组),该阵列(数组)中的每个元语言中的二维数组),该阵列(数组)中的每个元语言中的二维数组),该阵列(数组)中的每个元语言中的二维数组),该阵列(数组)中的每个元素对应一个寄存器。从图素对应一个寄存器。从图素对应一个寄存器。从图素对应一个寄存器。从图素对应一个寄存器。从图素对应一个寄存器。从图6 6 6可以看到

136、,下标为可以看到,下标为可以看到,下标为可以看到,下标为可以看到,下标为可以看到,下标为-1+1-1+1-1+1的元素,是寄存器阵列的前一行(的元素,是寄存器阵列的前一行(的元素,是寄存器阵列的前一行(的元素,是寄存器阵列的前一行(的元素,是寄存器阵列的前一行(的元素,是寄存器阵列的前一行(prev rowprev rowprev row),下一),下一),下一),下一),下一),下一列(最右列)的像素值。阵列中的元素值都是由每个列(最右列)的像素值。阵列中的元素值都是由每个列(最右列)的像素值。阵列中的元素值都是由每个列(最右列)的像素值。阵列中的元素值都是由每个列(最右列)的像素值。阵列中

137、的元素值都是由每个列(最右列)的像素值。阵列中的元素值都是由每个输入寄存器最左边输入寄存器最左边输入寄存器最左边输入寄存器最左边输入寄存器最左边输入寄存器最左边8 8 8位向左移入阵列的。位向左移入阵列的。位向左移入阵列的。位向左移入阵列的。位向左移入阵列的。位向左移入阵列的。DxDxDx和和和和和和 DyDyDy值值值值值值由阵列元素乘以对应系数计算出来的。我们通过前面由阵列元素乘以对应系数计算出来的。我们通过前面由阵列元素乘以对应系数计算出来的。我们通过前面由阵列元素乘以对应系数计算出来的。我们通过前面由阵列元素乘以对应系数计算出来的。我们通过前面由阵列元素乘以对应系数计算出来的。我们通过

138、前面分析得出,分析得出,分析得出,分析得出,分析得出,分析得出,DxDxDx,DyDyDy的范围是从的范围是从的范围是从的范围是从的范围是从的范围是从-1020-1020-1020到到到到到到102010201020,用,用,用,用,用,用111111比比比比比比特有符号数来表示。因此,我们把每个原始像素扩展特有符号数来表示。因此,我们把每个原始像素扩展特有符号数来表示。因此,我们把每个原始像素扩展特有符号数来表示。因此,我们把每个原始像素扩展特有符号数来表示。因此,我们把每个原始像素扩展特有符号数来表示。因此,我们把每个原始像素扩展成成成成成成111111比特,并转换成有符号数再进行计算。比

139、特,并转换成有符号数再进行计算。比特,并转换成有符号数再进行计算。比特,并转换成有符号数再进行计算。比特,并转换成有符号数再进行计算。比特,并转换成有符号数再进行计算。59视频边缘检测视频边缘检测视频边缘检测视频边缘检测最后一个最后一个最后一个最后一个alwaysalways块,在块,在块,在块,在shift_enshift_en控制下控制下控制下控制下88比比比比特的计算结果被从右至左依次移入特的计算结果被从右至左依次移入特的计算结果被从右至左依次移入特的计算结果被从右至左依次移入3232比比比比特结果寄存器。当结果寄存器被移入特结果寄存器。当结果寄存器被移入特结果寄存器。当结果寄存器被移入

140、特结果寄存器。当结果寄存器被移入3232比特数据时,其值将被一次写入内存。比特数据时,其值将被一次写入内存。比特数据时,其值将被一次写入内存。比特数据时,其值将被一次写入内存。60视频边缘检测视频边缘检测视频边缘检测视频边缘检测我们在前面曾提到块处理加速器必须有地址产生和数据我们在前面曾提到块处理加速器必须有地址产生和数据我们在前面曾提到块处理加速器必须有地址产生和数据我们在前面曾提到块处理加速器必须有地址产生和数据我们在前面曾提到块处理加速器必须有地址产生和数据我们在前面曾提到块处理加速器必须有地址产生和数据处理电路。加速器作为系统中的主设备,必须提供读处理电路。加速器作为系统中的主设备,必

141、须提供读处理电路。加速器作为系统中的主设备,必须提供读处理电路。加速器作为系统中的主设备,必须提供读处理电路。加速器作为系统中的主设备,必须提供读处理电路。加速器作为系统中的主设备,必须提供读写内存的地址信号。我们设计的写内存的地址信号。我们设计的写内存的地址信号。我们设计的写内存的地址信号。我们设计的写内存的地址信号。我们设计的写内存的地址信号。我们设计的SobelSobelSobel加速器也需要加速器也需要加速器也需要加速器也需要加速器也需要加速器也需要地址产生电路来给出读取原始图像像素所需的地址,地址产生电路来给出读取原始图像像素所需的地址,地址产生电路来给出读取原始图像像素所需的地址,

142、地址产生电路来给出读取原始图像像素所需的地址,地址产生电路来给出读取原始图像像素所需的地址,地址产生电路来给出读取原始图像像素所需的地址,以及写入导数像素所需的地址。在加速器内部,我们以及写入导数像素所需的地址。在加速器内部,我们以及写入导数像素所需的地址。在加速器内部,我们以及写入导数像素所需的地址。在加速器内部,我们以及写入导数像素所需的地址。在加速器内部,我们以及写入导数像素所需的地址。在加速器内部,我们将会提供两个寄存器,以便嵌入式软件可以把原始图将会提供两个寄存器,以便嵌入式软件可以把原始图将会提供两个寄存器,以便嵌入式软件可以把原始图将会提供两个寄存器,以便嵌入式软件可以把原始图将

143、会提供两个寄存器,以便嵌入式软件可以把原始图将会提供两个寄存器,以便嵌入式软件可以把原始图像和导数图像在内存中的基地址写入这两个寄存器。像和导数图像在内存中的基地址写入这两个寄存器。像和导数图像在内存中的基地址写入这两个寄存器。像和导数图像在内存中的基地址写入这两个寄存器。像和导数图像在内存中的基地址写入这两个寄存器。像和导数图像在内存中的基地址写入这两个寄存器。地址产生电路可以用寄存器中的基地址自动地产生像地址产生电路可以用寄存器中的基地址自动地产生像地址产生电路可以用寄存器中的基地址自动地产生像地址产生电路可以用寄存器中的基地址自动地产生像地址产生电路可以用寄存器中的基地址自动地产生像地址

144、产生电路可以用寄存器中的基地址自动地产生像素地址。我们要求所有的地址是按字排列的,也就是素地址。我们要求所有的地址是按字排列的,也就是素地址。我们要求所有的地址是按字排列的,也就是素地址。我们要求所有的地址是按字排列的,也就是素地址。我们要求所有的地址是按字排列的,也就是素地址。我们要求所有的地址是按字排列的,也就是说,它们都是四的整数倍。这意味着地址的最低两位说,它们都是四的整数倍。这意味着地址的最低两位说,它们都是四的整数倍。这意味着地址的最低两位说,它们都是四的整数倍。这意味着地址的最低两位说,它们都是四的整数倍。这意味着地址的最低两位说,它们都是四的整数倍。这意味着地址的最低两位总是总

145、是总是总是总是总是000000。61视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例8: 8: 8: 假设一幅图像在内存中的基地址为假设一幅图像在内存中的基地址为假设一幅图像在内存中的基地址为假设一幅图像在内存中的基地址为假设一幅图像在内存中的基地址为假设一幅图像在内存中的基地址为B B B,请推,请推,请推,请推,请推,请推导出计算图像的第导出计算图像的第导出计算图像的第导出计算图像的第导出计算图像的第导出计算图像的第r r r行第行第行第行第行第行第c c c列的像素值地址的表列的像素值地址的表列的像素值地址的表列的像素值地址的表列的像素值地址的表列的像素值地址的表达式。行列都

146、从达式。行列都从达式。行列都从达式。行列都从达式。行列都从达式。行列都从0 0 0开始编号。开始编号。开始编号。开始编号。开始编号。开始编号。答:图像尺寸是答:图像尺寸是答:图像尺寸是答:图像尺寸是答:图像尺寸是答:图像尺寸是480480480行,每行行,每行行,每行行,每行行,每行行,每行640640640个像素。第个像素。第个像素。第个像素。第个像素。第个像素。第r r r行行行行行行的起始地址是:的起始地址是:的起始地址是:的起始地址是:的起始地址是:的起始地址是: B + B + B + r r r 640 640 640 那么,那么,那么,那么,那么,那么,r r r行行行行行行c

147、c c列的像素点位于地址:列的像素点位于地址:列的像素点位于地址:列的像素点位于地址:列的像素点位于地址:列的像素点位于地址: B + B + B + r r r 640 + 640 + 640 + c c c我们可以把表达式我们可以把表达式我们可以把表达式我们可以把表达式我们可以把表达式我们可以把表达式 r r r 640 + 640 + 640 + c c c 看作基地址的地址看作基地址的地址看作基地址的地址看作基地址的地址看作基地址的地址看作基地址的地址偏移量。偏移量。偏移量。偏移量。偏移量。偏移量。62视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例9: 9: 9: 假设内

148、存的大小是假设内存的大小是假设内存的大小是假设内存的大小是假设内存的大小是假设内存的大小是4M4M4M字节,组织成字节,组织成字节,组织成字节,组织成字节,组织成字节,组织成 1M321M321M32比特。请你为比特。请你为比特。请你为比特。请你为比特。请你为比特。请你为SobelSobelSobel加速器设计能自动选通存储地址(数据通路)的电路。加速器设计能自动选通存储地址(数据通路)的电路。加速器设计能自动选通存储地址(数据通路)的电路。加速器设计能自动选通存储地址(数据通路)的电路。加速器设计能自动选通存储地址(数据通路)的电路。加速器设计能自动选通存储地址(数据通路)的电路。答:答:答

149、:答:答:答:地址产生电路需要两个基地址寄存器:原始图像基地址寄存器地址产生电路需要两个基地址寄存器:原始图像基地址寄存器地址产生电路需要两个基地址寄存器:原始图像基地址寄存器地址产生电路需要两个基地址寄存器:原始图像基地址寄存器地址产生电路需要两个基地址寄存器:原始图像基地址寄存器地址产生电路需要两个基地址寄存器:原始图像基地址寄存器O_baseO_baseO_base和导数图像基地址寄存器和导数图像基地址寄存器和导数图像基地址寄存器和导数图像基地址寄存器和导数图像基地址寄存器和导数图像基地址寄存器D_baseD_baseD_base。因为像素值按四个一。因为像素值按四个一。因为像素值按四个

150、一。因为像素值按四个一。因为像素值按四个一。因为像素值按四个一组存储,地址的最低两位总是组存储,地址的最低两位总是组存储,地址的最低两位总是组存储,地址的最低两位总是组存储,地址的最低两位总是组存储,地址的最低两位总是000,所以不需要在地址寄存器中显,所以不需要在地址寄存器中显,所以不需要在地址寄存器中显,所以不需要在地址寄存器中显,所以不需要在地址寄存器中显,所以不需要在地址寄存器中显式地给出这两位地址。式地给出这两位地址。式地给出这两位地址。式地给出这两位地址。式地给出这两位地址。式地给出这两位地址。有几种方案可以得到读有几种方案可以得到读有几种方案可以得到读有几种方案可以得到读有几种方

151、案可以得到读有几种方案可以得到读/写地址,包括采用计数器对图像行和列写地址,包括采用计数器对图像行和列写地址,包括采用计数器对图像行和列写地址,包括采用计数器对图像行和列写地址,包括采用计数器对图像行和列写地址,包括采用计数器对图像行和列进行计数,利用行和列的计数值,根据例进行计数,利用行和列的计数值,根据例进行计数,利用行和列的计数值,根据例进行计数,利用行和列的计数值,根据例进行计数,利用行和列的计数值,根据例进行计数,利用行和列的计数值,根据例888推导的公式来计算像推导的公式来计算像推导的公式来计算像推导的公式来计算像推导的公式来计算像推导的公式来计算像素地址。但是这种方法引入了乘法运

152、算(素地址。但是这种方法引入了乘法运算(素地址。但是这种方法引入了乘法运算(素地址。但是这种方法引入了乘法运算(素地址。但是这种方法引入了乘法运算(素地址。但是这种方法引入了乘法运算(r640r640r640),实现起来会),实现起来会),实现起来会),实现起来会),实现起来会),实现起来会消耗较多的硬件资源。然而,我们可以仅仅对基地址的偏移值进消耗较多的硬件资源。然而,我们可以仅仅对基地址的偏移值进消耗较多的硬件资源。然而,我们可以仅仅对基地址的偏移值进消耗较多的硬件资源。然而,我们可以仅仅对基地址的偏移值进消耗较多的硬件资源。然而,我们可以仅仅对基地址的偏移值进消耗较多的硬件资源。然而,我

153、们可以仅仅对基地址的偏移值进行计数,这样就可以避免乘以行计数,这样就可以避免乘以行计数,这样就可以避免乘以行计数,这样就可以避免乘以行计数,这样就可以避免乘以行计数,这样就可以避免乘以640640640的操作,见图的操作,见图的操作,见图的操作,见图的操作,见图的操作,见图888所示。所示。所示。所示。所示。所示。63视频边缘检测视频边缘检测视频边缘检测视频边缘检测图图图图图图8 8 8 地址产生电路地址产生电路地址产生电路地址产生电路地址产生电路地址产生电路64视频边缘检测视频边缘检测视频边缘检测视频边缘检测对于原始图像,偏移值从对于原始图像,偏移值从对于原始图像,偏移值从对于原始图像,偏移

154、值从对于原始图像,偏移值从对于原始图像,偏移值从0 00开始计数。从内存中每读取一组四个像开始计数。从内存中每读取一组四个像开始计数。从内存中每读取一组四个像开始计数。从内存中每读取一组四个像开始计数。从内存中每读取一组四个像开始计数。从内存中每读取一组四个像素值,偏移值加素值,偏移值加素值,偏移值加素值,偏移值加素值,偏移值加素值,偏移值加1 11。把偏移值和基地址加起来形成前一行(。把偏移值和基地址加起来形成前一行(。把偏移值和基地址加起来形成前一行(。把偏移值和基地址加起来形成前一行(。把偏移值和基地址加起来形成前一行(。把偏移值和基地址加起来形成前一行(prev prev prev r

155、owrowrow)的像素组地址。前一行的像素组地址加上)的像素组地址。前一行的像素组地址加上)的像素组地址。前一行的像素组地址加上)的像素组地址。前一行的像素组地址加上)的像素组地址。前一行的像素组地址加上)的像素组地址。前一行的像素组地址加上640/4640/4640/4形成当前行形成当前行形成当前行形成当前行形成当前行形成当前行(curr rowcurr rowcurr row)的读地址。前一行的像素组地址加上)的读地址。前一行的像素组地址加上)的读地址。前一行的像素组地址加上)的读地址。前一行的像素组地址加上)的读地址。前一行的像素组地址加上)的读地址。前一行的像素组地址加上1280/4

156、1280/41280/4形成下形成下形成下形成下形成下形成下一行(一行(一行(一行(一行(一行(next rownext rownext row)的读地址(假设地址的最低两位都是)的读地址(假设地址的最低两位都是)的读地址(假设地址的最低两位都是)的读地址(假设地址的最低两位都是)的读地址(假设地址的最低两位都是)的读地址(假设地址的最低两位都是000000)。)。)。)。)。)。图象的像素点总共有图象的像素点总共有图象的像素点总共有图象的像素点总共有图象的像素点总共有图象的像素点总共有480480480行行行行行行640640640列,前一行(列,前一行(列,前一行(列,前一行(列,前一行(

157、列,前一行(prev rowprev rowprev row)像素的地)像素的地)像素的地)像素的地)像素的地)像素的地址加上址加上址加上址加上址加上址加上640/4640/4640/4后,与原地址正好差了一行的位置;加上后,与原地址正好差了一行的位置;加上后,与原地址正好差了一行的位置;加上后,与原地址正好差了一行的位置;加上后,与原地址正好差了一行的位置;加上后,与原地址正好差了一行的位置;加上1280/41280/41280/4后,后,后,后,后,后,正好相差两行的位置。根据这两个地址从内存中读取的像素值正正好相差两行的位置。根据这两个地址从内存中读取的像素值正正好相差两行的位置。根据这

158、两个地址从内存中读取的像素值正正好相差两行的位置。根据这两个地址从内存中读取的像素值正正好相差两行的位置。根据这两个地址从内存中读取的像素值正正好相差两行的位置。根据这两个地址从内存中读取的像素值正好就是用好就是用好就是用好就是用好就是用好就是用SobelSobelSobel卷积表计算当前行像素导数值所需要的当前行和下卷积表计算当前行像素导数值所需要的当前行和下卷积表计算当前行像素导数值所需要的当前行和下卷积表计算当前行像素导数值所需要的当前行和下卷积表计算当前行像素导数值所需要的当前行和下卷积表计算当前行像素导数值所需要的当前行和下一行的像素值。对于导数图像,我们从偏移值一行的像素值。对于导

159、数图像,我们从偏移值一行的像素值。对于导数图像,我们从偏移值一行的像素值。对于导数图像,我们从偏移值一行的像素值。对于导数图像,我们从偏移值一行的像素值。对于导数图像,我们从偏移值640/4640/4640/4开始计数,依开始计数,依开始计数,依开始计数,依开始计数,依开始计数,依次加次加次加次加次加次加1 11形成每次的写地址。图中的多路器根据当前操作要求选择适形成每次的写地址。图中的多路器根据当前操作要求选择适形成每次的写地址。图中的多路器根据当前操作要求选择适形成每次的写地址。图中的多路器根据当前操作要求选择适形成每次的写地址。图中的多路器根据当前操作要求选择适形成每次的写地址。图中的多

160、路器根据当前操作要求选择适当的计算地址来驱动内存地址总线。当的计算地址来驱动内存地址总线。当的计算地址来驱动内存地址总线。当的计算地址来驱动内存地址总线。当的计算地址来驱动内存地址总线。当的计算地址来驱动内存地址总线。65视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例10 : 10 : 10 : 编写寄存器传输(编写寄存器传输(编写寄存器传输(编写寄存器传输(编写寄存器传输(编写寄存器传输(RTLRTLRTL)级的)级的)级的)级的)级的)级的VerilogVerilogVerilog代码描述如图代码描述如图代码描述如图代码描述如图代码描述如图代码描述如图888所示的地址产所示的

161、地址产所示的地址产所示的地址产所示的地址产所示的地址产 生电路。生电路。生电路。生电路。生电路。生电路。解决方案:解决方案:解决方案:解决方案:解决方案:解决方案:SobelSobelSobel加速器模块定义中的地址生成电路的代码如下:加速器模块定义中的地址生成电路的代码如下:加速器模块定义中的地址生成电路的代码如下:加速器模块定义中的地址生成电路的代码如下:加速器模块定义中的地址生成电路的代码如下:加速器模块定义中的地址生成电路的代码如下: always always always (posedge clk_i) (posedge clk_i) (posedge clk_i) / / / 原

162、始图像基地址寄存器原始图像基地址寄存器原始图像基地址寄存器原始图像基地址寄存器原始图像基地址寄存器原始图像基地址寄存器 if(O_base_ce)if(O_base_ce)if(O_base_ce) O_base = dat_i21:2; O_base = dat_i21:2; O_base = dat_i21:2; always always always(posedge clk_i)(posedge clk_i)(posedge clk_i) / / / 原始图像地址偏移量计数器原始图像地址偏移量计数器原始图像地址偏移量计数器原始图像地址偏移量计数器原始图像地址偏移量计数器原始图像地址偏移

163、量计数器if(offset_reset)if(offset_reset)if(offset_reset)O_offsetO_offsetO_offset= 0;= 0;= 0; else else else if(O_offset_cnt_en) if(O_offset_cnt_en) if(O_offset_cnt_en) O_offsetO_offsetO_offset= O_offset+1;= O_offset+1;= O_offset+1;66视频边缘检测视频边缘检测视频边缘检测视频边缘检测assignassignassign O_prev_addr = O_base + O_off

164、set; O_prev_addr = O_base + O_offset; O_prev_addr = O_base + O_offset;assignassignassign O_curr_addr = O_prev_addr + 640/4; O_curr_addr = O_prev_addr + 640/4; O_curr_addr = O_prev_addr + 640/4;assignassignassign O_next_addr = O_prev_addr + 1280/4; O_next_addr = O_prev_addr + 1280/4; O_next_addr = O_

165、prev_addr + 1280/4;alwaysalwaysalways(posedge clk_i)(posedge clk_i)(posedge clk_i) / / /导数图像基地址寄存器导数图像基地址寄存器导数图像基地址寄存器导数图像基地址寄存器导数图像基地址寄存器导数图像基地址寄存器if(D_base_ce)if(D_base_ce)if(D_base_ce)D_base =dat_i21:2;D_base =dat_i21:2;D_base =dat_i21:2;alwaysalwaysalways(posedge clk_i) (posedge clk_i) (posedge

166、clk_i) /导数图像地址偏移量计数器导数图像地址偏移量计数器导数图像地址偏移量计数器导数图像地址偏移量计数器导数图像地址偏移量计数器导数图像地址偏移量计数器if(offset_reset)if(offset_reset)if(offset_reset)D_offset = 0;D_offset = 0;D_offset = 0;elseelseelse if (D_offset_cnt_en) if (D_offset_cnt_en) if (D_offset_cnt_en) D_offset = D_offset+1; D_offset = D_offset+1; D_offset =

167、D_offset+1;67视频边缘检测视频边缘检测视频边缘检测视频边缘检测assign D_addr = D_base +D_offset;assign D_addr = D_base +D_offset;assign D_addr = D_base +D_offset;assignassignassignadr_o21:2 = prev_row_load ? O_prev_addr : adr_o21:2 = prev_row_load ? O_prev_addr : adr_o21:2 = prev_row_load ? O_prev_addr : curr_row_load ? O_cu

168、rr_addr : next_row_load ? curr_row_load ? O_curr_addr : next_row_load ? curr_row_load ? O_curr_addr : next_row_load ? O_next_addr : D_addr ;O_next_addr : D_addr ;O_next_addr : D_addr ;assign adr_o1:0 = 2b00;assign adr_o1:0 = 2b00;assign adr_o1:0 = 2b00;68视频边缘检测视频边缘检测视频边缘检测视频边缘检测第一、三个第一、三个第一、三个第一、三个第

169、一、三个第一、三个alwaysalwaysalways块把分别表示原始图像基地址寄存器块把分别表示原始图像基地址寄存器块把分别表示原始图像基地址寄存器块把分别表示原始图像基地址寄存器块把分别表示原始图像基地址寄存器块把分别表示原始图像基地址寄存器和导数图像基地址寄存器。当处理器要把原始图像基和导数图像基地址寄存器。当处理器要把原始图像基和导数图像基地址寄存器。当处理器要把原始图像基和导数图像基地址寄存器。当处理器要把原始图像基和导数图像基地址寄存器。当处理器要把原始图像基和导数图像基地址寄存器。当处理器要把原始图像基地址或导数图像基地址写入其中一个寄存器时,地址或导数图像基地址写入其中一个寄存

170、器时,地址或导数图像基地址写入其中一个寄存器时,地址或导数图像基地址写入其中一个寄存器时,地址或导数图像基地址写入其中一个寄存器时,地址或导数图像基地址写入其中一个寄存器时,O_base_ceO_base_ceO_base_ce或或或或或或D_base_ceD_base_ceD_base_ce有效,数据总线上的数据就被有效,数据总线上的数据就被有效,数据总线上的数据就被有效,数据总线上的数据就被有效,数据总线上的数据就被有效,数据总线上的数据就被加载到相应的地址寄存器。第二、四个加载到相应的地址寄存器。第二、四个加载到相应的地址寄存器。第二、四个加载到相应的地址寄存器。第二、四个加载到相应的地

171、址寄存器。第二、四个加载到相应的地址寄存器。第二、四个alwaysalwaysalways块描述块描述块描述块描述块描述块描述原始图像和导数图像地址偏移量计数器。计数器的控原始图像和导数图像地址偏移量计数器。计数器的控原始图像和导数图像地址偏移量计数器。计数器的控原始图像和导数图像地址偏移量计数器。计数器的控原始图像和导数图像地址偏移量计数器。计数器的控原始图像和导数图像地址偏移量计数器。计数器的控制信号由控制电路部分提供。图制信号由控制电路部分提供。图制信号由控制电路部分提供。图制信号由控制电路部分提供。图制信号由控制电路部分提供。图制信号由控制电路部分提供。图8 8 8中的四个加法器分中的

172、四个加法器分中的四个加法器分中的四个加法器分中的四个加法器分中的四个加法器分别由四条别由四条别由四条别由四条别由四条别由四条assignassignassign赋值语句实现。分别产生赋值语句实现。分别产生赋值语句实现。分别产生赋值语句实现。分别产生赋值语句实现。分别产生赋值语句实现。分别产生O_prev_addrO_prev_addrO_prev_addr,O_curr_addrO_curr_addrO_curr_addr,O_next_addrO_next_addrO_next_addr和和和和和和D_addrD_addrD_addr。最后,通过一个多路器在产生的四个地址。最后,通过一个多路

173、器在产生的四个地址。最后,通过一个多路器在产生的四个地址。最后,通过一个多路器在产生的四个地址。最后,通过一个多路器在产生的四个地址。最后,通过一个多路器在产生的四个地址中选择一个作为输出地址。中选择一个作为输出地址。中选择一个作为输出地址。中选择一个作为输出地址。中选择一个作为输出地址。中选择一个作为输出地址。69视频边缘检测视频边缘检测视频边缘检测视频边缘检测我们在前面曾经提过,处理器需要提通过我们在前面曾经提过,处理器需要提通过我们在前面曾经提过,处理器需要提通过我们在前面曾经提过,处理器需要提通过读写加速器内部的寄存器来控制加速器读写加速器内部的寄存器来控制加速器读写加速器内部的寄存器

174、来控制加速器读写加速器内部的寄存器来控制加速器的工作、了解它的状态。这时处理器是的工作、了解它的状态。这时处理器是的工作、了解它的状态。这时处理器是的工作、了解它的状态。这时处理器是主设备,加速器是从设备。处理器和加主设备,加速器是从设备。处理器和加主设备,加速器是从设备。处理器和加主设备,加速器是从设备。处理器和加速器的这种交互功能是由加速器的从机速器的这种交互功能是由加速器的从机速器的这种交互功能是由加速器的从机速器的这种交互功能是由加速器的从机接口部分完成的。接口部分完成的。接口部分完成的。接口部分完成的。70视频边缘检测视频边缘检测视频边缘检测视频边缘检测我们将设置如下几个控制和状态寄

175、存器来实现处理器和加速器之我们将设置如下几个控制和状态寄存器来实现处理器和加速器之我们将设置如下几个控制和状态寄存器来实现处理器和加速器之我们将设置如下几个控制和状态寄存器来实现处理器和加速器之我们将设置如下几个控制和状态寄存器来实现处理器和加速器之我们将设置如下几个控制和状态寄存器来实现处理器和加速器之间的交互:间的交互:间的交互:间的交互:间的交互:间的交互:控制寄存器。当写入该控制寄存器时,加速器就开始处理一幅图像。控制寄存器。当写入该控制寄存器时,加速器就开始处理一幅图像。控制寄存器。当写入该控制寄存器时,加速器就开始处理一幅图像。控制寄存器。当写入该控制寄存器时,加速器就开始处理一幅

176、图像。控制寄存器。当写入该控制寄存器时,加速器就开始处理一幅图像。控制寄存器。当写入该控制寄存器时,加速器就开始处理一幅图像。并不关心写入该寄存器的是什么值,写入任何数都开始处理图像。并不关心写入该寄存器的是什么值,写入任何数都开始处理图像。并不关心写入该寄存器的是什么值,写入任何数都开始处理图像。并不关心写入该寄存器的是什么值,写入任何数都开始处理图像。并不关心写入该寄存器的是什么值,写入任何数都开始处理图像。并不关心写入该寄存器的是什么值,写入任何数都开始处理图像。控制寄存器。第控制寄存器。第控制寄存器。第控制寄存器。第控制寄存器。第控制寄存器。第000位是中断使能位。位是中断使能位。位是

177、中断使能位。位是中断使能位。位是中断使能位。位是中断使能位。状态寄存器,其第状态寄存器,其第状态寄存器,其第状态寄存器,其第状态寄存器,其第状态寄存器,其第000位是位是位是位是位是位是done done done 标志位(即完成标志位),当处理器处标志位(即完成标志位),当处理器处标志位(即完成标志位),当处理器处标志位(即完成标志位),当处理器处标志位(即完成标志位),当处理器处标志位(即完成标志位),当处理器处理完一幅图像时,随即将该位设置为理完一幅图像时,随即将该位设置为理完一幅图像时,随即将该位设置为理完一幅图像时,随即将该位设置为理完一幅图像时,随即将该位设置为理完一幅图像时,随即

178、将该位设置为111。其它位为。其它位为。其它位为。其它位为。其它位为。其它位为000。当。当。当。当。当。当done done done 标志位为标志位为标志位为标志位为标志位为标志位为111,且中断使能位为,且中断使能位为,且中断使能位为,且中断使能位为,且中断使能位为,且中断使能位为111时,加速器便发出中断请求。读取该状态寄存器时,加速器便发出中断请求。读取该状态寄存器时,加速器便发出中断请求。读取该状态寄存器时,加速器便发出中断请求。读取该状态寄存器时,加速器便发出中断请求。读取该状态寄存器时,加速器便发出中断请求。读取该状态寄存器done done done 标志位还有一个附带作用是

179、中断应答,并将标志位还有一个附带作用是中断应答,并将标志位还有一个附带作用是中断应答,并将标志位还有一个附带作用是中断应答,并将标志位还有一个附带作用是中断应答,并将标志位还有一个附带作用是中断应答,并将done done done 标志位清零标志位清零标志位清零标志位清零标志位清零标志位清零为了简化总线接口,我们把所有的寄存器设为为了简化总线接口,我们把所有的寄存器设为为了简化总线接口,我们把所有的寄存器设为为了简化总线接口,我们把所有的寄存器设为为了简化总线接口,我们把所有的寄存器设为为了简化总线接口,我们把所有的寄存器设为323232位,占有连续的地址空位,占有连续的地址空位,占有连续的

180、地址空位,占有连续的地址空位,占有连续的地址空位,占有连续的地址空间。完整的寄存器地址映射如表间。完整的寄存器地址映射如表间。完整的寄存器地址映射如表间。完整的寄存器地址映射如表间。完整的寄存器地址映射如表间。完整的寄存器地址映射如表111所示。所示。所示。所示。所示。所示。71视频边缘检测视频边缘检测视频边缘检测视频边缘检测表表1 Sobel1 Sobel加速器的寄存器加速器的寄存器寄存器偏移值读/写中断控制0只写开始4只写原始图像基地址8只写导数图像基地址12只写状态0只读72视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例111111:编写加速器从机接口(:编写加速器从机接口

181、(:编写加速器从机接口(:编写加速器从机接口(:编写加速器从机接口(:编写加速器从机接口(slave interfaceslave interfaceslave interface)的)的)的)的)的)的 Verilog Verilog Verilog 模型模型模型模型模型模型 代码。代码。代码。代码。代码。代码。答:答:答:答:答:答: 总线从机操作的时序如下图所示。总线的读总线从机操作的时序如下图所示。总线的读总线从机操作的时序如下图所示。总线的读总线从机操作的时序如下图所示。总线的读总线从机操作的时序如下图所示。总线的读总线从机操作的时序如下图所示。总线的读/写操作都是在写操作都是在写操

182、作都是在写操作都是在写操作都是在写操作都是在 cyc_i cyc_i cyc_i和和和和和和stb_istb_istb_i为为为为为为111的一个周期内发起的。的一个周期内发起的。的一个周期内发起的。的一个周期内发起的。的一个周期内发起的。的一个周期内发起的。73视频边缘检测视频边缘检测视频边缘检测视频边缘检测处理器发起一次读处理器发起一次读处理器发起一次读处理器发起一次读处理器发起一次读处理器发起一次读/ /写操作,加速器通过在下一个周期把写操作,加速器通过在下一个周期把写操作,加速器通过在下一个周期把写操作,加速器通过在下一个周期把写操作,加速器通过在下一个周期把写操作,加速器通过在下一个

183、周期把 ack_o ack_o ack_o 信信信信信信号置号置号置号置号置号置1 11,并在随后一个周期把,并在随后一个周期把,并在随后一个周期把,并在随后一个周期把,并在随后一个周期把,并在随后一个周期把ack_oack_oack_o置置置置置置0 00来响应。我们需要对地址总来响应。我们需要对地址总来响应。我们需要对地址总来响应。我们需要对地址总来响应。我们需要对地址总来响应。我们需要对地址总线进行译码,得到加速器的选通信号。利用地址的低位确定哪个寄线进行译码,得到加速器的选通信号。利用地址的低位确定哪个寄线进行译码,得到加速器的选通信号。利用地址的低位确定哪个寄线进行译码,得到加速器的

184、选通信号。利用地址的低位确定哪个寄线进行译码,得到加速器的选通信号。利用地址的低位确定哪个寄线进行译码,得到加速器的选通信号。利用地址的低位确定哪个寄存器被读写。对起始寄存器(存器被读写。对起始寄存器(存器被读写。对起始寄存器(存器被读写。对起始寄存器(存器被读写。对起始寄存器(存器被读写。对起始寄存器(startstartstart)地址进行写操作,并没有设)地址进行写操作,并没有设)地址进行写操作,并没有设)地址进行写操作,并没有设)地址进行写操作,并没有设)地址进行写操作,并没有设置真实的寄存器来保存写入的数据,而是利用对该地址的写操作置真实的寄存器来保存写入的数据,而是利用对该地址的写

185、操作置真实的寄存器来保存写入的数据,而是利用对该地址的写操作置真实的寄存器来保存写入的数据,而是利用对该地址的写操作置真实的寄存器来保存写入的数据,而是利用对该地址的写操作置真实的寄存器来保存写入的数据,而是利用对该地址的写操作来产生一个控制信号来产生一个控制信号来产生一个控制信号来产生一个控制信号来产生一个控制信号来产生一个控制信号startstartstart,启动加速器的计算时序。读取状态寄,启动加速器的计算时序。读取状态寄,启动加速器的计算时序。读取状态寄,启动加速器的计算时序。读取状态寄,启动加速器的计算时序。读取状态寄,启动加速器的计算时序。读取状态寄存器,存器,存器,存器,存器,

186、存器,donedonedone标志位(第标志位(第标志位(第标志位(第标志位(第标志位(第0 00位)连同其他位(第位)连同其他位(第位)连同其他位(第位)连同其他位(第位)连同其他位(第位)连同其他位(第1-311-311-31位)将被放到数位)将被放到数位)将被放到数位)将被放到数位)将被放到数位)将被放到数据总线上。读取其他寄存器将返回全据总线上。读取其他寄存器将返回全据总线上。读取其他寄存器将返回全据总线上。读取其他寄存器将返回全据总线上。读取其他寄存器将返回全据总线上。读取其他寄存器将返回全0 00。对于加速器,要输出到总。对于加速器,要输出到总。对于加速器,要输出到总。对于加速器,

187、要输出到总。对于加速器,要输出到总。对于加速器,要输出到总线上的数据包括两个部分:从机接口中的状态寄存器和主机部分线上的数据包括两个部分:从机接口中的状态寄存器和主机部分线上的数据包括两个部分:从机接口中的状态寄存器和主机部分线上的数据包括两个部分:从机接口中的状态寄存器和主机部分线上的数据包括两个部分:从机接口中的状态寄存器和主机部分线上的数据包括两个部分:从机接口中的状态寄存器和主机部分的结果寄存器,为此我们使用一个多路器来选择数据总线的驱动的结果寄存器,为此我们使用一个多路器来选择数据总线的驱动的结果寄存器,为此我们使用一个多路器来选择数据总线的驱动的结果寄存器,为此我们使用一个多路器来

188、选择数据总线的驱动的结果寄存器,为此我们使用一个多路器来选择数据总线的驱动的结果寄存器,为此我们使用一个多路器来选择数据总线的驱动源。描述从机接口部分的型代码如下:源。描述从机接口部分的型代码如下:源。描述从机接口部分的型代码如下:源。描述从机接口部分的型代码如下:源。描述从机接口部分的型代码如下:源。描述从机接口部分的型代码如下:74视频边缘检测视频边缘检测视频边缘检测视频边缘检测/ Wishbone / Wishbone / Wishbone 从机接口从机接口从机接口从机接口从机接口从机接口assignassignassignstart = cyc_i & stb_i & we_i & a

189、dr_i3:2 =2b01;/adr_i1:0=00start = cyc_i & stb_i & we_i & adr_i3:2 =2b01;/adr_i1:0=00start = cyc_i & stb_i & we_i & adr_i3:2 =2b01;/adr_i1:0=00assign O_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b10;assign O_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b10;assign O_base_ce = cyc_i & stb_i & we_i & ad

190、r_i3:2 =2b10;assign D_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b11;assign D_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b11;assign D_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b11;always (posedge clk_i)always (posedge clk_i)always (posedge clk_i) / / / 中断使能寄存器中断使能寄存器中断使能寄存器中断使能寄存器中断使能寄存器中断使能寄存器i

191、f (rst_i)if (rst_i)if (rst_i)int_en = 1b0;int_en = 1b0;int_en = 1b0;else if (cyc_i & stb_i & we_i & adr_i3:2 =2b00)else if (cyc_i & stb_i & we_i & adr_i3:2 =2b00)else if (cyc_i & stb_i & we_i & adr_i3:2 =2b00)int_en = dat_i0;int_en = dat_i0;int_en = dat_i0;always (posedge clk_i)always (posedge clk_i

192、)always (posedge clk_i)/ / / 状态寄存器状态寄存器状态寄存器状态寄存器状态寄存器状态寄存器if (rst_i)if (rst_i)if (rst_i) done =1b0; done =1b0; done =1b0;else else else if (done_set) / if (done_set) / if (done_set) /当一幅图像处理完时,当一幅图像处理完时,当一幅图像处理完时,当一幅图像处理完时,当一幅图像处理完时,当一幅图像处理完时,done_setdone_setdone_set被置被置被置被置被置被置111 done =1b1; done

193、=1b1; done =1b1; / for master write / for master write / for master write75视频边缘检测视频边缘检测视频边缘检测视频边缘检测 else else else if (cyc_i & stb_i & !we_i & adr_i3:2 =2b00 & ack_o) if (cyc_i & stb_i & !we_i & adr_i3:2 =2b00 & ack_o) if (cyc_i & stb_i & !we_i & adr_i3:2 =2b00 & ack_o) done =1b0; / done =1b0; / don

194、e =1b0; /读状态寄存器操作将清除标志位读状态寄存器操作将清除标志位读状态寄存器操作将清除标志位读状态寄存器操作将清除标志位读状态寄存器操作将清除标志位读状态寄存器操作将清除标志位/中断申请中断申请中断申请中断申请中断申请中断申请 assign int_req =int_en & done; assign int_req =int_en & done; assign int_req =int_en & done; always (posedge clk_i) always (posedge clk_i) always (posedge clk_i) / / / 生成应答生成应答生成应答生

195、成应答生成应答生成应答ackackack输出输出输出输出输出输出 ack_o = cyc_i & stb_i & !ack_o;ack_o = cyc_i & stb_i & !ack_o;ack_o = cyc_i & stb_i & !ack_o;/总线数据输出多路选择器总线数据输出多路选择器总线数据输出多路选择器总线数据输出多路选择器总线数据输出多路选择器总线数据输出多路选择器always *always *always *if (cyc_i & stb_i & !we_i)if (cyc_i & stb_i & !we_i)if (cyc_i & stb_i & !we_i)if (a

196、dr_i3:2 = 2b00)if (adr_i3:2 = 2b00)if (adr_i3:2 = 2b00)dat_o = 31b0,done;dat_o = 31b0,done;dat_o = 31b0,done; / status register read / status register read / status register readelseelseelsedat_o = 32b0; / other registers read as 0dat_o = 32b0; / other registers read as 0dat_o = 32b0; / other regist

197、ers read as 0else else else dat_o = result_row;dat_o = result_row;dat_o = result_row; / for master write / for master write / for master write76视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例121212:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤

198、:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤:导数图像的计算必须按照确定的步骤进行,请设计能操纵计算步骤 的控制器。的控制器。的控制器。的控制器。的控制器。的控制器。解决方案:解决方案:解决方案:解决方案:解决方案:解决方案:我们可以用一个有限状态机来安排计算的操作步骤。因为大部分的计算步我们可以用一个有限状态机来安排计算的操作步骤。因为大部分的计算步我们可以用一个有限状态机来安排计算的操作步骤。因为大部分的计算步我们可以用一个有限状态机来安排计算的操作步骤。因为大部分的计算步我们可以用一个有限状态机来安排计算的操作步骤。因为大部分的计算步我们可以用一个有限状态机来安排计算的操

199、作步骤。因为大部分的计算步骤是重复执行的,所以可以用计数器来跟踪计算的过程。我们用一个行计骤是重复执行的,所以可以用计数器来跟踪计算的过程。我们用一个行计骤是重复执行的,所以可以用计数器来跟踪计算的过程。我们用一个行计骤是重复执行的,所以可以用计数器来跟踪计算的过程。我们用一个行计骤是重复执行的,所以可以用计数器来跟踪计算的过程。我们用一个行计骤是重复执行的,所以可以用计数器来跟踪计算的过程。我们用一个行计数器来确定已经完成了多少行的计算,从第数器来确定已经完成了多少行的计算,从第数器来确定已经完成了多少行的计算,从第数器来确定已经完成了多少行的计算,从第数器来确定已经完成了多少行的计算,从第

200、数器来确定已经完成了多少行的计算,从第000行起一直增加到第行起一直增加到第行起一直增加到第行起一直增加到第行起一直增加到第行起一直增加到第477477477行;再行;再行;再行;再行;再行;再用另一个计数器来确定已经完成了多少列的计算,从第用另一个计数器来确定已经完成了多少列的计算,从第用另一个计数器来确定已经完成了多少列的计算,从第用另一个计数器来确定已经完成了多少列的计算,从第用另一个计数器来确定已经完成了多少列的计算,从第用另一个计数器来确定已经完成了多少列的计算,从第000列起一直增加到列起一直增加到列起一直增加到列起一直增加到列起一直增加到列起一直增加到第第第第第第15915915

201、9列列列列列列 (159+1159+1159+1)4 = 6404 = 6404 = 640)。控制计算步骤的有限状态机的状态转)。控制计算步骤的有限状态机的状态转)。控制计算步骤的有限状态机的状态转)。控制计算步骤的有限状态机的状态转)。控制计算步骤的有限状态机的状态转)。控制计算步骤的有限状态机的状态转移图如图移图如图移图如图移图如图移图如图移图如图101010所示。为避免状态转移图显得过于混乱,其中只显示了状态和所示。为避免状态转移图显得过于混乱,其中只显示了状态和所示。为避免状态转移图显得过于混乱,其中只显示了状态和所示。为避免状态转移图显得过于混乱,其中只显示了状态和所示。为避免状态

202、转移图显得过于混乱,其中只显示了状态和所示。为避免状态转移图显得过于混乱,其中只显示了状态和转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假转移条件,也没有显示某一个状态回到自己状态的转移。我们在这里假设:若一个给定的状态转移条件为假(即不成立),则该有限状态机就呆设:若一个给定的状态转移条件为假(即不成立),则该有限状态机就呆设:若一

203、个给定的状态转移条件为假(即不成立),则该有限状态机就呆设:若一个给定的状态转移条件为假(即不成立),则该有限状态机就呆设:若一个给定的状态转移条件为假(即不成立),则该有限状态机就呆设:若一个给定的状态转移条件为假(即不成立),则该有限状态机就呆在原状态,直到下一个时钟周期。在原状态,直到下一个时钟周期。在原状态,直到下一个时钟周期。在原状态,直到下一个时钟周期。在原状态,直到下一个时钟周期。在原状态,直到下一个时钟周期。77视频边缘检测视频边缘检测视频边缘检测视频边缘检测该该该该该该FSMFSMFSM(有限状态机)的初始状态为(有限状态机)的初始状态为(有限状态机)的初始状态为(有限状态机

204、)的初始状态为(有限状态机)的初始状态为(有限状态机)的初始状态为idleidleidle(空闲)状态。当处理器(空闲)状态。当处理器(空闲)状态。当处理器(空闲)状态。当处理器(空闲)状态。当处理器(空闲)状态。当处理器对对对对对对startstartstart寄存器写入数据时,寄存器写入数据时,寄存器写入数据时,寄存器写入数据时,寄存器写入数据时,寄存器写入数据时, startstartstart信号变为信号变为信号变为信号变为信号变为信号变为1 11(有效),(有效),(有效),(有效),(有效),(有效),FSMFSMFSM(有限(有限(有限(有限(有限(有限状态机)启动读操作和第一行

205、计算的初始时序。这个过程包括读状态机)启动读操作和第一行计算的初始时序。这个过程包括读状态机)启动读操作和第一行计算的初始时序。这个过程包括读状态机)启动读操作和第一行计算的初始时序。这个过程包括读状态机)启动读操作和第一行计算的初始时序。这个过程包括读状态机)启动读操作和第一行计算的初始时序。这个过程包括读取最初三组原始图像的像素值,然后执行四个计算周期。完成取最初三组原始图像的像素值,然后执行四个计算周期。完成取最初三组原始图像的像素值,然后执行四个计算周期。完成取最初三组原始图像的像素值,然后执行四个计算周期。完成取最初三组原始图像的像素值,然后执行四个计算周期。完成取最初三组原始图像的

206、像素值,然后执行四个计算周期。完成后,该有限状态机进入了一个循环,在这个循环里,它再次读取后,该有限状态机进入了一个循环,在这个循环里,它再次读取后,该有限状态机进入了一个循环,在这个循环里,它再次读取后,该有限状态机进入了一个循环,在这个循环里,它再次读取后,该有限状态机进入了一个循环,在这个循环里,它再次读取后,该有限状态机进入了一个循环,在这个循环里,它再次读取三组原始图像的像素值,执行四个计算周期,然后写一组由计算三组原始图像的像素值,执行四个计算周期,然后写一组由计算三组原始图像的像素值,执行四个计算周期,然后写一组由计算三组原始图像的像素值,执行四个计算周期,然后写一组由计算三组原

207、始图像的像素值,执行四个计算周期,然后写一组由计算三组原始图像的像素值,执行四个计算周期,然后写一组由计算得到的像素值。正像我们在观察该有限状态机输出函数时所看到得到的像素值。正像我们在观察该有限状态机输出函数时所看到得到的像素值。正像我们在观察该有限状态机输出函数时所看到得到的像素值。正像我们在观察该有限状态机输出函数时所看到得到的像素值。正像我们在观察该有限状态机输出函数时所看到得到的像素值。正像我们在观察该有限状态机输出函数时所看到的那样,列计数器在每次写操作后加一。在最后一次计算周期结的那样,列计数器在每次写操作后加一。在最后一次计算周期结的那样,列计数器在每次写操作后加一。在最后一次

208、计算周期结的那样,列计数器在每次写操作后加一。在最后一次计算周期结的那样,列计数器在每次写操作后加一。在最后一次计算周期结的那样,列计数器在每次写操作后加一。在最后一次计算周期结束的时候,若此时列计数器不是束的时候,若此时列计数器不是束的时候,若此时列计数器不是束的时候,若此时列计数器不是束的时候,若此时列计数器不是束的时候,若此时列计数器不是158158158,则该有限状态机继续循环,则该有限状态机继续循环,则该有限状态机继续循环,则该有限状态机继续循环,则该有限状态机继续循环,则该有限状态机继续循环,若此时列计数器是若此时列计数器是若此时列计数器是若此时列计数器是若此时列计数器是若此时列计

209、数器是158158158,则进入一个状态,在该状态中开始排出流,则进入一个状态,在该状态中开始排出流,则进入一个状态,在该状态中开始排出流,则进入一个状态,在该状态中开始排出流,则进入一个状态,在该状态中开始排出流,则进入一个状态,在该状态中开始排出流水线中的数据。排出流水线中的数据包括一个把倒数第二组结果水线中的数据。排出流水线中的数据包括一个把倒数第二组结果水线中的数据。排出流水线中的数据包括一个把倒数第二组结果水线中的数据。排出流水线中的数据包括一个把倒数第二组结果水线中的数据。排出流水线中的数据包括一个把倒数第二组结果水线中的数据。排出流水线中的数据包括一个把倒数第二组结果写入的状态,

210、四个计算周期,和一个把最后一组计算结果写入的写入的状态,四个计算周期,和一个把最后一组计算结果写入的写入的状态,四个计算周期,和一个把最后一组计算结果写入的写入的状态,四个计算周期,和一个把最后一组计算结果写入的写入的状态,四个计算周期,和一个把最后一组计算结果写入的写入的状态,四个计算周期,和一个把最后一组计算结果写入的状态。行计数在这最后一次写操作后器加一。然后若此时行计数状态。行计数在这最后一次写操作后器加一。然后若此时行计数状态。行计数在这最后一次写操作后器加一。然后若此时行计数状态。行计数在这最后一次写操作后器加一。然后若此时行计数状态。行计数在这最后一次写操作后器加一。然后若此时行

211、计数状态。行计数在这最后一次写操作后器加一。然后若此时行计数器的计数值不是器的计数值不是器的计数值不是器的计数值不是器的计数值不是器的计数值不是477477477,则该有限状态机回到下一行的初始时序,若,则该有限状态机回到下一行的初始时序,若,则该有限状态机回到下一行的初始时序,若,则该有限状态机回到下一行的初始时序,若,则该有限状态机回到下一行的初始时序,若,则该有限状态机回到下一行的初始时序,若此时行计数器的计数值是最终的计数值此时行计数器的计数值是最终的计数值此时行计数器的计数值是最终的计数值此时行计数器的计数值是最终的计数值此时行计数器的计数值是最终的计数值此时行计数器的计数值是最终的

212、计数值477477477,则回到空闲状态。,则回到空闲状态。,则回到空闲状态。,则回到空闲状态。,则回到空闲状态。,则回到空闲状态。 78视频边缘检测视频边缘检测视频边缘检测视频边缘检测图图图图图图10 10 10 状态转移图状态转移图状态转移图状态转移图状态转移图状态转移图79视频边缘检测视频边缘检测视频边缘检测视频边缘检测该有限状态机的输出函数如表该有限状态机的输出函数如表该有限状态机的输出函数如表该有限状态机的输出函数如表该有限状态机的输出函数如表该有限状态机的输出函数如表2 2 2和和和和和和3 3 3所示。为让所示。为让所示。为让所示。为让所示。为让所示。为让图表读起来简单一些,我们

213、把控制信号输出为图表读起来简单一些,我们把控制信号输出为图表读起来简单一些,我们把控制信号输出为图表读起来简单一些,我们把控制信号输出为图表读起来简单一些,我们把控制信号输出为图表读起来简单一些,我们把控制信号输出为0 0 0的表格项留做空白,只列出表格项为的表格项留做空白,只列出表格项为的表格项留做空白,只列出表格项为的表格项留做空白,只列出表格项为的表格项留做空白,只列出表格项为的表格项留做空白,只列出表格项为1 1 1的情况。的情况。的情况。的情况。的情况。的情况。有些控制信号是摩尔型输出,只取决于当前状有些控制信号是摩尔型输出,只取决于当前状有些控制信号是摩尔型输出,只取决于当前状有些

214、控制信号是摩尔型输出,只取决于当前状有些控制信号是摩尔型输出,只取决于当前状有些控制信号是摩尔型输出,只取决于当前状态,见表态,见表态,见表态,见表态,见表态,见表2 2 2所示。其它控制信号为米利型输出,所示。其它控制信号为米利型输出,所示。其它控制信号为米利型输出,所示。其它控制信号为米利型输出,所示。其它控制信号为米利型输出,所示。其它控制信号为米利型输出,见表见表见表见表见表见表3 3 3所示。这些信号由输入条件和当前的状态所示。这些信号由输入条件和当前的状态所示。这些信号由输入条件和当前的状态所示。这些信号由输入条件和当前的状态所示。这些信号由输入条件和当前的状态所示。这些信号由输入

215、条件和当前的状态共同决定其值。共同决定其值。共同决定其值。共同决定其值。共同决定其值。共同决定其值。80视频边缘检测视频边缘检测视频边缘检测视频边缘检测表表表表表表222:摩尔状态:摩尔状态:摩尔状态:摩尔状态:摩尔状态:摩尔状态机的输出机的输出机的输出机的输出机的输出机的输出81视频边缘检测视频边缘检测视频边缘检测视频边缘检测表表表表表表3 33:米利状态:米利状态:米利状态:米利状态:米利状态:米利状态机的输出机的输出机的输出机的输出机的输出机的输出82视频边缘检测视频边缘检测视频边缘检测视频边缘检测例例例例例例13 13 13 为为为为为为SobelSobelSobel加速器的控制部分编

216、写一个加速器的控制部分编写一个加速器的控制部分编写一个加速器的控制部分编写一个加速器的控制部分编写一个加速器的控制部分编写一个VerilogVerilogVerilog模型。模型。模型。模型。模型。模型。解决方案:解决方案:解决方案:解决方案:解决方案:解决方案:控制部分的代码包括该控制有限状态机(控制部分的代码包括该控制有限状态机(控制部分的代码包括该控制有限状态机(控制部分的代码包括该控制有限状态机(控制部分的代码包括该控制有限状态机(控制部分的代码包括该控制有限状态机(FSMFSMFSM)的内部信号、行列计数器和控制信号的声明:)的内部信号、行列计数器和控制信号的声明:)的内部信号、行列

217、计数器和控制信号的声明:)的内部信号、行列计数器和控制信号的声明:)的内部信号、行列计数器和控制信号的声明:)的内部信号、行列计数器和控制信号的声明:parameter 4:0parameter 4:0parameter 4:0 idle idle idle=5b00000,=5b00000,=5b00000, read_prev_0 = 5b00001, read_prev_0 = 5b00001, read_prev_0 = 5b00001, read_curr_0 = 5b00010, read_curr_0 = 5b00010, read_curr_0 = 5b00010, read_

218、next_0 = 5b00011, read_next_0 = 5b00011, read_next_0 = 5b00011, comp1_0 = 5b00100, comp1_0 = 5b00100, comp1_0 = 5b00100, comp2_0 = 5b00101, comp2_0 = 5b00101, comp2_0 = 5b00101, comp3_0 = 5b00110, comp3_0 = 5b00110, comp3_0 = 5b00110, comp4_0 = 5b00111, comp4_0 = 5b00111, comp4_0 = 5b00111, read_pre

219、v = 5b01000, read_prev = 5b01000, read_prev = 5b01000, read_curr = 5b01001, read_curr = 5b01001, read_curr = 5b01001, read_next = 5b01010, read_next = 5b01010, read_next = 5b01010,83视频边缘检测视频边缘检测视频边缘检测视频边缘检测 comp1 = 5b01011, comp1 = 5b01011, comp1 = 5b01011, comp2 = 5b01100, comp2 = 5b01100, comp2 =

220、5b01100, comp3 = 5b01101, comp3 = 5b01101, comp3 = 5b01101, comp4 = 5b01110, comp4 = 5b01110, comp4 = 5b01110, write_result = 5b01111, write_result = 5b01111, write_result = 5b01111, write_158 = 5b10000, write_158 = 5b10000, write_158 = 5b10000, comp1_159 = 5b10001, comp1_159 = 5b10001, comp1_159 =

221、5b10001, comp2_159 = 5b10010, comp2_159 = 5b10010, comp2_159 = 5b10010, comp3_159 = 5b10011, comp3_159 = 5b10011, comp3_159 = 5b10011, comp4_159 = 5b10100, comp4_159 = 5b10100, comp4_159 = 5b10100, write_159 = 5b10101; write_159 = 5b10101; write_159 = 5b10101;84视频边缘检测视频边缘检测视频边缘检测视频边缘检测reg 4:0 curren

222、t_state,next_state;reg 4:0 current_state,next_state;reg 4:0 current_state,next_state;reg 8:0 row; /reg 8:0 row; /reg 8:0 row; /范围从范围从范围从范围从范围从范围从 0 0 0 到到到到到到 477;477;477;reg 7:0 col; /reg 7:0 col; /reg 7:0 col; /范围从范围从范围从范围从范围从范围从0 0 0 到到到到到到 159;159;159;wire start;wire start;wire start;wire stb_o;

223、wire stb_o;wire stb_o;reg offset_reset,row_reset,col_reset;reg offset_reset,row_reset,col_reset;reg offset_reset,row_reset,col_reset;reg prev_row_load, curr_row_load, next_row_load;reg prev_row_load, curr_row_load, next_row_load;reg prev_row_load, curr_row_load, next_row_load;reg shift_en;reg shift_

224、en;reg shift_en;reg cyc_o,we_o;reg cyc_o,we_o;reg cyc_o,we_o;reg row_cnt_en, col_cnt_en;reg row_cnt_en, col_cnt_en;reg row_cnt_en, col_cnt_en;reg O_offset_cnt_en, D_offset_cnt_en;reg O_offset_cnt_en, D_offset_cnt_en;reg O_offset_cnt_en, D_offset_cnt_en;reg int_en, done_set, done;reg int_en, done_set

225、, done;reg int_en, done_set, done;85视频边缘检测视频边缘检测视频边缘检测视频边缘检测用行、列两个计数器来控制计算过程,分别用下面两个用行、列两个计数器来控制计算过程,分别用下面两个用行、列两个计数器来控制计算过程,分别用下面两个用行、列两个计数器来控制计算过程,分别用下面两个用行、列两个计数器来控制计算过程,分别用下面两个用行、列两个计数器来控制计算过程,分别用下面两个alwaysalwaysalways块表示:块表示:块表示:块表示:块表示:块表示:always (posedge clk_i)always (posedge clk_i)always (po

226、sedge clk_i)/Row counter/Row counter/Row counterif (row_reset)if (row_reset)if (row_reset) row = 0; row = 0; row = 0;else else else if (row_cnt_en) if (row_cnt_en) if (row_cnt_en) row = row + 1; row = row + 1; row = row + 1;always (posedge clk_i)always (posedge clk_i)always (posedge clk_i)/Column co

227、unter/Column counter/Column counterif (col_reset)if (col_reset)if (col_reset) col col col= 0;= 0;= 0;else else else if (col_cnt_en) if (col_cnt_en) if (col_cnt_en) col= col+1; col= col+1; col= col+1;86视频边缘检测视频边缘检测视频边缘检测视频边缘检测always * beginalways * beginalways * begin /FSM /FSM /FSM 的组合逻辑部分的组合逻辑部分的组合

228、逻辑部分的组合逻辑部分的组合逻辑部分的组合逻辑部分offset_resetoffset_resetoffset_reset=1b0; row_reset=1b0; row_reset=1b0; row_reset=1b0;=1b0;=1b0;col_resetcol_resetcol_reset=1b0;=1b0;=1b0;row_cnt_enrow_cnt_enrow_cnt_en=1b0; col_cnt_en=1b0; col_cnt_en=1b0; col_cnt_en=1b0;=1b0;=1b0;O_offset_cnt_enO_offset_cnt_enO_offset_cnt_e

229、n=1b0; D_offset_cnt_en=1b0; D_offset_cnt_en=1b0; D_offset_cnt_en=1b0;=1b0;=1b0;prev_row_loadprev_row_loadprev_row_load=1b0; curr_row_load=1b0; curr_row_load=1b0; curr_row_load=1b0;=1b0;=1b0;next_row_loadnext_row_loadnext_row_load=1b0;=1b0;=1b0;shift_enshift_enshift_en=1b0; cyc_0=1b0; cyc_0=1b0; cyc_

230、0=1b0;=1b0;=1b0;we_owe_owe_o=1b0; done_set=1b0; done_set=1b0; done_set=1b0;=1b0;=1b0;case (current_state)case (current_state)case (current_state) idle: begin idle: begin idle: beginoffset_reset =1b1; row_reset =1b1;offset_reset =1b1; row_reset =1b1;offset_reset =1b1; row_reset =1b1;col_reset = 1b1;c

231、ol_reset = 1b1;col_reset = 1b1;if (start) next_state = read_prev_0;if (start) next_state = read_prev_0;if (start) next_state = read_prev_0;elseelseelse next_state = idle; next_state = idle; next_state = idle; end end end87视频边缘检测视频边缘检测视频边缘检测视频边缘检测 read_prev_0: begin read_prev_0: begin read_prev_0: be

232、gincol_reset = 1b1; pre_row_load = 1b1;col_reset = 1b1; pre_row_load = 1b1;col_reset = 1b1; pre_row_load = 1b1;cyc_ocyc_ocyc_o= 1b1;= 1b1;= 1b1;if (ack_i) next_state = read_curr_0;if (ack_i) next_state = read_curr_0;if (ack_i) next_state = read_curr_0;else next_state = read_prev_0;else next_state =

233、read_prev_0;else next_state = read_prev_0; end end end read_curr_0: beginread_curr_0: beginread_curr_0: begin curr_row_load =1b1; cyc_o =1b1;curr_row_load =1b1; cyc_o =1b1;curr_row_load =1b1; cyc_o =1b1;if (ack_i) next_state = read_next_0;if (ack_i) next_state = read_next_0;if (ack_i) next_state = r

234、ead_next_0;else next_state = read_curr_0;else next_state = read_curr_0;else next_state = read_curr_0; end end end read_next_0: beginread_next_0: beginread_next_0: beginnext_row_load =1b1; cyc_o =1b1;next_row_load =1b1; cyc_o =1b1;next_row_load =1b1; cyc_o =1b1;if (ack_i)if (ack_i)if (ack_i)beginbegi

235、nbegin O_offset_cnt_en =1b1; O_offset_cnt_en =1b1; O_offset_cnt_en =1b1; next_state =comp1_0; next_state =comp1_0; next_state =comp1_0; end end endelse next_state = read_next_0;else next_state = read_next_0;else next_state = read_next_0; end end end 88视频边缘检测视频边缘检测视频边缘检测视频边缘检测 comp1_0: begincomp1_0:

236、begincomp1_0: beginshift_en =1b1;shift_en =1b1;shift_en =1b1;next_state =comp2_0;next_state =comp2_0;next_state =comp2_0; end end p4: begincomp4: begincomp4: beginshift_en =1b1;shift_en =1b1;shift_en =1b1;if (col =158) next_state = write_158;if (col =158) next_state = write_158;if (col =158) next_st

237、ate = write_158;else next_state = write_result;else next_state = write_result;else next_state = write_result; end end endwrite_result: beginwrite_result: beginwrite_result: begin cyc_o =1b1; we_o =1b1; cyc_o =1b1; we_o =1b1; cyc_o =1b1; we_o =1b1;if(ack_i)if(ack_i)if(ack_i)beginbeginbegin col_cnt_en

238、 =1b1; D_offset_cnt_en =1b1; col_cnt_en =1b1; D_offset_cnt_en =1b1; col_cnt_en =1b1; D_offset_cnt_en =1b1; next_state =read_prev; next_state =read_prev; next_state =read_prev;endendendelse next_state = write_result;else next_state = write_result;else next_state = write_result; end end end 89视频边缘检测视频

239、边缘检测视频边缘检测视频边缘检测 write_result: beginwrite_result: beginwrite_result: begin cyc_o =1b1; we_o =1b1; cyc_o =1b1; we_o =1b1; cyc_o =1b1; we_o =1b1;if(ack_i)if(ack_i)if(ack_i)beginbeginbegin col_cnt_en =1b1; D_offset_cnt_en =1b1; col_cnt_en =1b1; D_offset_cnt_en =1b1; col_cnt_en =1b1; D_offset_cnt_en =1b

240、1; next_state =read_prev; next_state =read_prev; next_state =read_prev; end end end else next_state = write_result; else next_state = write_result; else next_state = write_result; end end endwrite_158: beginwrite_158: beginwrite_158: begincyc_o =1b1; we_o =1b1;cyc_o =1b1; we_o =1b1;cyc_o =1b1; we_o

241、=1b1;if(ack_i)if(ack_i)if(ack_i)beginbeginbegin col_cnt_en =1b1; D_offset_cnt_en =1b1; col_cnt_en =1b1; D_offset_cnt_en =1b1; col_cnt_en =1b1; D_offset_cnt_en =1b1; next_state =comp1_159; next_state =comp1_159; next_state =comp1_159; end end endelse next_state =write_158;else next_state =write_158;e

242、lse next_state =write_158; end end end. 90视频边缘检测视频边缘检测视频边缘检测视频边缘检测 write_159: beginwrite_159: beginwrite_159: begin cyc_o =1b1;we_0 =1b1; cyc_o =1b1;we_0 =1b1; cyc_o =1b1;we_0 =1b1; if(ack_i) if(ack_i) if(ack_i)beginbeginbegin D_offset_cnt_en =1b1; D_offset_cnt_en =1b1; D_offset_cnt_en =1b1; if (row

243、 = 477) begin if (row = 477) begin if (row = 477) begin done_set =1b1; done_set =1b1; done_set =1b1; next_state = idle; next_state = idle; next_state = idle; end end end else begin else begin else begin row_cnt_en =1b1; row_cnt_en =1b1; row_cnt_en =1b1; next_state =read_prev_0; next_state =read_prev

244、_0; next_state =read_prev_0; end end end end end end else next_state = write_159; else next_state = write_159; else next_state = write_159;endendendendcaseendcaseendcaseendendendassign stb_o = cyc_o;assign stb_o = cyc_o;assign stb_o = cyc_o;91视频边缘检测视频边缘检测视频边缘检测视频边缘检测到目前为止,我们已经开发了构建到目前为止,我们已经开发了构建到目前

245、为止,我们已经开发了构建到目前为止,我们已经开发了构建到目前为止,我们已经开发了构建到目前为止,我们已经开发了构建SobelSobelSobel加速器需要的全部硬件,加速器需要的全部硬件,加速器需要的全部硬件,加速器需要的全部硬件,加速器需要的全部硬件,加速器需要的全部硬件,剩下的部分是用来控制加速器工作的嵌入式软件。正如我们在介剩下的部分是用来控制加速器工作的嵌入式软件。正如我们在介剩下的部分是用来控制加速器工作的嵌入式软件。正如我们在介剩下的部分是用来控制加速器工作的嵌入式软件。正如我们在介剩下的部分是用来控制加速器工作的嵌入式软件。正如我们在介剩下的部分是用来控制加速器工作的嵌入式软件。

246、正如我们在介绍这个例子时提到的那样,视频边缘检测有着广泛的应用领域。绍这个例子时提到的那样,视频边缘检测有着广泛的应用领域。绍这个例子时提到的那样,视频边缘检测有着广泛的应用领域。绍这个例子时提到的那样,视频边缘检测有着广泛的应用领域。绍这个例子时提到的那样,视频边缘检测有着广泛的应用领域。绍这个例子时提到的那样,视频边缘检测有着广泛的应用领域。所以与其为每个具体的应用重新设计一个新的控制软件,还不如所以与其为每个具体的应用重新设计一个新的控制软件,还不如所以与其为每个具体的应用重新设计一个新的控制软件,还不如所以与其为每个具体的应用重新设计一个新的控制软件,还不如所以与其为每个具体的应用重新

247、设计一个新的控制软件,还不如所以与其为每个具体的应用重新设计一个新的控制软件,还不如开发一个能适用于多种类似应用的可重用的软件组件。开发一个开发一个能适用于多种类似应用的可重用的软件组件。开发一个开发一个能适用于多种类似应用的可重用的软件组件。开发一个开发一个能适用于多种类似应用的可重用的软件组件。开发一个开发一个能适用于多种类似应用的可重用的软件组件。开发一个开发一个能适用于多种类似应用的可重用的软件组件。开发一个能提供一系列操作的驱动程序,使得应用程序能够从抽象的视角能提供一系列操作的驱动程序,使得应用程序能够从抽象的视角能提供一系列操作的驱动程序,使得应用程序能够从抽象的视角能提供一系列

248、操作的驱动程序,使得应用程序能够从抽象的视角能提供一系列操作的驱动程序,使得应用程序能够从抽象的视角能提供一系列操作的驱动程序,使得应用程序能够从抽象的视角来理解加速器,就可以圆满地完成以上任务。每个应用程序都可来理解加速器,就可以圆满地完成以上任务。每个应用程序都可来理解加速器,就可以圆满地完成以上任务。每个应用程序都可来理解加速器,就可以圆满地完成以上任务。每个应用程序都可来理解加速器,就可以圆满地完成以上任务。每个应用程序都可来理解加速器,就可以圆满地完成以上任务。每个应用程序都可以把这个驱动程序当作完成其所需功能的软件元件集合的一部以把这个驱动程序当作完成其所需功能的软件元件集合的一部

249、以把这个驱动程序当作完成其所需功能的软件元件集合的一部以把这个驱动程序当作完成其所需功能的软件元件集合的一部以把这个驱动程序当作完成其所需功能的软件元件集合的一部以把这个驱动程序当作完成其所需功能的软件元件集合的一部分。例如,识别视频图像中物体的应用程序可以把边缘检测应用分。例如,识别视频图像中物体的应用程序可以把边缘检测应用分。例如,识别视频图像中物体的应用程序可以把边缘检测应用分。例如,识别视频图像中物体的应用程序可以把边缘检测应用分。例如,识别视频图像中物体的应用程序可以把边缘检测应用分。例如,识别视频图像中物体的应用程序可以把边缘检测应用于视频流的每一幅图像,接着把边缘分组,再和边缘图

250、片库进行于视频流的每一幅图像,接着把边缘分组,再和边缘图片库进行于视频流的每一幅图像,接着把边缘分组,再和边缘图片库进行于视频流的每一幅图像,接着把边缘分组,再和边缘图片库进行于视频流的每一幅图像,接着把边缘分组,再和边缘图片库进行于视频流的每一幅图像,接着把边缘分组,再和边缘图片库进行对比。在一个完整的应用程序中,这些软件的开发和硬件的开发对比。在一个完整的应用程序中,这些软件的开发和硬件的开发对比。在一个完整的应用程序中,这些软件的开发和硬件的开发对比。在一个完整的应用程序中,这些软件的开发和硬件的开发对比。在一个完整的应用程序中,这些软件的开发和硬件的开发对比。在一个完整的应用程序中,这

251、些软件的开发和硬件的开发一样重要。更完整的策略可以在关于嵌入式系统软件开发的书中一样重要。更完整的策略可以在关于嵌入式系统软件开发的书中一样重要。更完整的策略可以在关于嵌入式系统软件开发的书中一样重要。更完整的策略可以在关于嵌入式系统软件开发的书中一样重要。更完整的策略可以在关于嵌入式系统软件开发的书中一样重要。更完整的策略可以在关于嵌入式系统软件开发的书中找到。找到。找到。找到。找到。找到。92加速器的验证加速器的验证加速器的验证加速器的验证因为加速器是比较复杂的,在设计过程中,验因为加速器是比较复杂的,在设计过程中,验因为加速器是比较复杂的,在设计过程中,验因为加速器是比较复杂的,在设计过

252、程中,验因为加速器是比较复杂的,在设计过程中,验因为加速器是比较复杂的,在设计过程中,验证特别重要。我们必须确保已完成的加速器设证特别重要。我们必须确保已完成的加速器设证特别重要。我们必须确保已完成的加速器设证特别重要。我们必须确保已完成的加速器设证特别重要。我们必须确保已完成的加速器设证特别重要。我们必须确保已完成的加速器设计将会正确地对所有合法的输入数据进行操计将会正确地对所有合法的输入数据进行操计将会正确地对所有合法的输入数据进行操计将会正确地对所有合法的输入数据进行操计将会正确地对所有合法的输入数据进行操计将会正确地对所有合法的输入数据进行操作,并且会与嵌入式处理器准确地配合和互作,并

253、且会与嵌入式处理器准确地配合和互作,并且会与嵌入式处理器准确地配合和互作,并且会与嵌入式处理器准确地配合和互作,并且会与嵌入式处理器准确地配合和互作,并且会与嵌入式处理器准确地配合和互动。因为所有可能的数据值和操作顺序组合的动。因为所有可能的数据值和操作顺序组合的动。因为所有可能的数据值和操作顺序组合的动。因为所有可能的数据值和操作顺序组合的动。因为所有可能的数据值和操作顺序组合的动。因为所有可能的数据值和操作顺序组合的空间是如同天文数字般的巨大,对设计进行无空间是如同天文数字般的巨大,对设计进行无空间是如同天文数字般的巨大,对设计进行无空间是如同天文数字般的巨大,对设计进行无空间是如同天文数

254、字般的巨大,对设计进行无空间是如同天文数字般的巨大,对设计进行无遗漏的验证是不现实的。可行的办法是,我们遗漏的验证是不现实的。可行的办法是,我们遗漏的验证是不现实的。可行的办法是,我们遗漏的验证是不现实的。可行的办法是,我们遗漏的验证是不现实的。可行的办法是,我们遗漏的验证是不现实的。可行的办法是,我们必须先制订可以覆盖多种操作条件的验证方必须先制订可以覆盖多种操作条件的验证方必须先制订可以覆盖多种操作条件的验证方必须先制订可以覆盖多种操作条件的验证方必须先制订可以覆盖多种操作条件的验证方必须先制订可以覆盖多种操作条件的验证方案。案。案。案。案。案。 93加速器的验证加速器的验证加速器的验证加

255、速器的验证验证复杂加速器的方法之一是独立地验证它操验证复杂加速器的方法之一是独立地验证它操验证复杂加速器的方法之一是独立地验证它操验证复杂加速器的方法之一是独立地验证它操验证复杂加速器的方法之一是独立地验证它操验证复杂加速器的方法之一是独立地验证它操作的不同方面。比如,我们可以采用一种作的不同方面。比如,我们可以采用一种作的不同方面。比如,我们可以采用一种作的不同方面。比如,我们可以采用一种作的不同方面。比如,我们可以采用一种作的不同方面。比如,我们可以采用一种“ “ “分分分分分分而而而而而而治之治之治之治之治之治之” ” ”的策略,逐个地验证的策略,逐个地验证的策略,逐个地验证的策略,逐个

256、地验证的策略,逐个地验证的策略,逐个地验证SobelSobelSobel加速器下述几加速器下述几加速器下述几加速器下述几加速器下述几加速器下述几个方面的问题:个方面的问题:个方面的问题:个方面的问题:个方面的问题:个方面的问题: 从机总线的操作从机总线的操作从机总线的操作从机总线的操作从机总线的操作从机总线的操作 计算时序计算时序计算时序计算时序计算时序计算时序 主机总线操作主机总线操作主机总线操作主机总线操作主机总线操作主机总线操作 地址的产生地址的产生地址的产生地址的产生地址的产生地址的产生 像素的计算像素的计算像素的计算像素的计算像素的计算像素的计算94加速器的验证加速器的验证加速器的验

257、证加速器的验证显然,加速器的每个方面都必须正确地工作,因为加速显然,加速器的每个方面都必须正确地工作,因为加速显然,加速器的每个方面都必须正确地工作,因为加速显然,加速器的每个方面都必须正确地工作,因为加速显然,加速器的每个方面都必须正确地工作,因为加速显然,加速器的每个方面都必须正确地工作,因为加速器是作为一个整体在工作。然而,每次只验证一个方面器是作为一个整体在工作。然而,每次只验证一个方面器是作为一个整体在工作。然而,每次只验证一个方面器是作为一个整体在工作。然而,每次只验证一个方面器是作为一个整体在工作。然而,每次只验证一个方面器是作为一个整体在工作。然而,每次只验证一个方面比试图一次

258、验证所有的方面要简单的多。在验证了从机比试图一次验证所有的方面要简单的多。在验证了从机比试图一次验证所有的方面要简单的多。在验证了从机比试图一次验证所有的方面要简单的多。在验证了从机比试图一次验证所有的方面要简单的多。在验证了从机比试图一次验证所有的方面要简单的多。在验证了从机总线的各种操作都能正常运行后,我们可以用这些总线总线的各种操作都能正常运行后,我们可以用这些总线总线的各种操作都能正常运行后,我们可以用这些总线总线的各种操作都能正常运行后,我们可以用这些总线总线的各种操作都能正常运行后,我们可以用这些总线总线的各种操作都能正常运行后,我们可以用这些总线操作来发起计算过程。然后,检查计算

259、是否能根据设计操作来发起计算过程。然后,检查计算是否能根据设计操作来发起计算过程。然后,检查计算是否能根据设计操作来发起计算过程。然后,检查计算是否能根据设计操作来发起计算过程。然后,检查计算是否能根据设计操作来发起计算过程。然后,检查计算是否能根据设计好的步骤进行,与主机总线操作的配合是否正确无误,好的步骤进行,与主机总线操作的配合是否正确无误,好的步骤进行,与主机总线操作的配合是否正确无误,好的步骤进行,与主机总线操作的配合是否正确无误,好的步骤进行,与主机总线操作的配合是否正确无误,好的步骤进行,与主机总线操作的配合是否正确无误,暂时先不考虑实际的地址和像素值。然后确保能生成正暂时先不考

260、虑实际的地址和像素值。然后确保能生成正暂时先不考虑实际的地址和像素值。然后确保能生成正暂时先不考虑实际的地址和像素值。然后确保能生成正暂时先不考虑实际的地址和像素值。然后确保能生成正暂时先不考虑实际的地址和像素值。然后确保能生成正确的地址,最后检查像素值的计算是否正确。验证流处确的地址,最后检查像素值的计算是否正确。验证流处确的地址,最后检查像素值的计算是否正确。验证流处确的地址,最后检查像素值的计算是否正确。验证流处确的地址,最后检查像素值的计算是否正确。验证流处确的地址,最后检查像素值的计算是否正确。验证流处理加速器与上述过程是类似的,但我们还要验证这个加理加速器与上述过程是类似的,但我们

261、还要验证这个加理加速器与上述过程是类似的,但我们还要验证这个加理加速器与上述过程是类似的,但我们还要验证这个加理加速器与上述过程是类似的,但我们还要验证这个加理加速器与上述过程是类似的,但我们还要验证这个加速器和待处理的数据源是否能正确地配合。速器和待处理的数据源是否能正确地配合。速器和待处理的数据源是否能正确地配合。速器和待处理的数据源是否能正确地配合。速器和待处理的数据源是否能正确地配合。速器和待处理的数据源是否能正确地配合。95加速器的验证加速器的验证加速器的验证加速器的验证为了完成这个验证过程,必须构建一个测试平台,该平台为了完成这个验证过程,必须构建一个测试平台,该平台可以模拟带有加

262、速器的嵌入式系统的行为。若我们有一个可以模拟带有加速器的嵌入式系统的行为。若我们有一个已验证的嵌入式处理器模型,则可以把它加到测试平台已验证的嵌入式处理器模型,则可以把它加到测试平台中,编写小的测试程序在它上面运行。测试程序把参数写中,编写小的测试程序在它上面运行。测试程序把参数写入加速器中的寄存器,对其进行设置并启动操作。另一方入加速器中的寄存器,对其进行设置并启动操作。另一方面,若不能获得处理器模型,则必须编写处理器总线的功面,若不能获得处理器模型,则必须编写处理器总线的功能模型,即能执行预先确定的总线操作时序,但不实际执能模型,即能执行预先确定的总线操作时序,但不实际执行任何处理器指令的

263、模型。我们的测试平台也需要有存储行任何处理器指令的模型。我们的测试平台也需要有存储器和总线仲裁器的模型。这个存储器模型,像处理器模型器和总线仲裁器的模型。这个存储器模型,像处理器模型一样,没有必要具有全部的功能,而只要具有总线的读写一样,没有必要具有全部的功能,而只要具有总线的读写操作功能即可,只要能按照预先确定的规则产生读取的数操作功能即可,只要能按照预先确定的规则产生读取的数据,可以不考虑数据的写入。这些简化使得我们可以把精据,可以不考虑数据的写入。这些简化使得我们可以把精力集中在加速器的验证上,以可控的方式建立测试案例。力集中在加速器的验证上,以可控的方式建立测试案例。96加速器的验证加

264、速器的验证加速器的验证加速器的验证例例例例14 14 :开发一个可对开发一个可对 Sobel Sobel 加速器进行验证的测试平加速器进行验证的测试平台,该平台包含一个具有总线功能的处理器模台,该平台包含一个具有总线功能的处理器模型。该处理器模型能通过程序命令加速器对一型。该处理器模型能通过程序命令加速器对一幅存储在地址为幅存储在地址为0080000080001616 的原始图像进行计算,的原始图像进行计算,并把计算生成的图像像素的导数值存入地址为并把计算生成的图像像素的导数值存入地址为0530000530001616 的内存中。该处理器模型必须每的内存中。该处理器模型必须每10s10s读一次

265、状态寄存器,直到读一次状态寄存器,直到done done 标志位标志位标志位标志位(完成标(完成标志位)被设置为止。该测试平台还必须包括能志位)被设置为止。该测试平台还必须包括能赋予加速器优先权的总线仲裁器,以及具有总线赋予加速器优先权的总线仲裁器,以及具有总线功能的存储器,该存储器对读操作返回功能的存储器,该存储器对读操作返回00,并抛,并抛弃写入的数据。弃写入的数据。97加速器的验证加速器的验证加速器的验证加速器的验证解决方案:解决方案:解决方案:解决方案:解决方案:解决方案:该测试平台的构建可参照如图该测试平台的构建可参照如图该测试平台的构建可参照如图该测试平台的构建可参照如图该测试平台

266、的构建可参照如图该测试平台的构建可参照如图2 2 2所示所示所示所示所示所示 的系统模的系统模的系统模的系统模的系统模的系统模型。型。型。型。型。型。 加速器是待验证的设计,仲裁器和具有总加速器是待验证的设计,仲裁器和具有总加速器是待验证的设计,仲裁器和具有总加速器是待验证的设计,仲裁器和具有总加速器是待验证的设计,仲裁器和具有总加速器是待验证的设计,仲裁器和具有总线功能的处理器还有存储器组成了测试平台的线功能的处理器还有存储器组成了测试平台的线功能的处理器还有存储器组成了测试平台的线功能的处理器还有存储器组成了测试平台的线功能的处理器还有存储器组成了测试平台的线功能的处理器还有存储器组成了测

267、试平台的剩余部分。我们还加入了时钟和复位信号发剩余部分。我们还加入了时钟和复位信号发剩余部分。我们还加入了时钟和复位信号发剩余部分。我们还加入了时钟和复位信号发剩余部分。我们还加入了时钟和复位信号发剩余部分。我们还加入了时钟和复位信号发生器。测试平台模块定义的要点如下:生器。测试平台模块定义的要点如下:生器。测试平台模块定义的要点如下:生器。测试平台模块定义的要点如下:生器。测试平台模块定义的要点如下:生器。测试平台模块定义的要点如下:98加速器的验证加速器的验证加速器的验证加速器的验证 timescale 1ns/1nstimescale 1ns/1nstimescale 1ns/1ns m

268、odule testbench;module testbench;module testbench; parameter t_c = 10;parameter t_c = 10;parameter t_c = 10;parameter 22:0 mem_base = 23h000000;parameter 22:0 mem_base = 23h000000;parameter 22:0 mem_base = 23h000000;parameter 22:0 sobel_reg_base = 23h400000;parameter 22:0 sobel_reg_base = 23h400000;

269、parameter 22:0 sobel_reg_base = 23h400000;parameter sobel_int_reg_offset = 0;parameter sobel_int_reg_offset = 0;parameter sobel_int_reg_offset = 0;parameter sobel_start_reg_offsetparameter sobel_start_reg_offsetparameter sobel_start_reg_offset= 4;= 4;= 4; parameter sobel_O_base_reg_offsetp = 8; para

270、meter sobel_O_base_reg_offsetp = 8; parameter sobel_O_base_reg_offsetp = 8; parameter sobel_D_base_reg_offsetp = 12; parameter sobel_D_base_reg_offsetp = 12; parameter sobel_D_base_reg_offsetp = 12; parameter sobel_status_reg_offsetp = 0; parameter sobel_status_reg_offsetp = 0; parameter sobel_statu

271、s_reg_offsetp = 0; 99加速器的验证加速器的验证加速器的验证加速器的验证 reg reg regclk, rst;clk, rst;clk, rst; wire wire wirebus_cyc, bus_stb, bus_we;bus_cyc, bus_stb, bus_we;bus_cyc, bus_stb, bus_we; wire 3:0 wire 3:0 wire 3:0bus_sel;bus_sel;bus_sel;wire 22:0wire 22:0wire 22:0bus_adr;bus_adr;bus_adr;wirewirewire bus_ack; bu

272、s_ack; bus_ack;wire 31:0wire 31:0wire 31:0bus_dat;bus_dat;bus_dat;wirewirewire int_req; int_req; int_req;wirewirewiresobel_cyc_o, sobel_stb_o, sobel_we_o;sobel_cyc_o, sobel_stb_o, sobel_we_o;sobel_cyc_o, sobel_stb_o, sobel_we_o;wire 21:0wire 21:0wire 21:0sobel_adr_o;sobel_adr_o;sobel_adr_o;wirewirew

273、ire sobel_ack_i; sobel_ack_i; sobel_ack_i;wirewirewiresobel_stb_i;sobel_stb_i;sobel_stb_i;wirewirewire sobel_ack_o; sobel_ack_o; sobel_ack_o;wire 31:0wire 31:0wire 31:0sobel_dat_o;sobel_dat_o;sobel_dat_o; . . .100加速器的验证加速器的验证加速器的验证加速器的验证 always beginalways begin/ / 时钟发生器时钟发生器clk = 1b1; #(t_c/2);clk

274、= 1b1; #(t_c/2);clk = 1b0; #(t_c/2);clk = 1b0; #(t_c/2); end endinitial begin initial begin / / 复位发生器复位发生器rst = 1b1;rst = 1b1;#(2.5*t_c)#(2.5*t_c)rst = 1b0;rst = 1b0;endend sobel duv ( .clk_i(clk), .rst_i(rst), sobel duv ( .clk_i(clk), .rst_i(rst), .cyc_o(sobel_cyc_o), .cyc_o(sobel_cyc_o),.stb_o(sob

275、el_stb_o),.stb_o(sobel_stb_o), .we_o (sobel_we_o), .we_o (sobel_we_o), .adr_o(sobel_adr_o), .adr_o(sobel_adr_o),.ack_i(sobel_ack_i),.ack_i(sobel_ack_i), .cyc_i(bus_cyc), .stb_i(sobel_stb_i), .cyc_i(bus_cyc), .stb_i(sobel_stb_i), .we_i(bus_we), .adr_i(bus_adr3:2), .we_i(bus_we), .adr_i(bus_adr3:2), .

276、ack_o(sobel_ack_o), .ack_o(sobel_ack_o), .dat_o(sobel_dat_o), .dat_o(sobel_dat_o),.dat_i(bus_dat),.dat_i(bus_dat), .int_req(int_req) ); .int_req(int_req) ); endmoduleendmodule101加速器的验证加速器的验证加速器的验证加速器的验证时钟发生器时钟发生器alwaysalways块用参数块用参数t_ct_c确定了时钟周确定了时钟周期时间,产生频率为期时间,产生频率为100MHz100MHz的时钟信号。的时钟信号。参数参数mem_

277、basemem_base和和sobel_basesobel_base定义了存储器的基地址定义了存储器的基地址(0000000000001616 )和)和SobelSobel加速器寄存器的基地址加速器寄存器的基地址(4000004000001616)。其他参数定义了控制寄存器和)。其他参数定义了控制寄存器和状态寄存器相对基地址的偏移值。接下去,测试状态寄存器相对基地址的偏移值。接下去,测试平台列出了表示总线地址,数据和控制信号的平台列出了表示总线地址,数据和控制信号的wirewire类型的线网。正如我们马上将要看到的那样,这些类型的线网。正如我们马上将要看到的那样,这些wirewire类型的线网

278、信号是从系统中不同的源设备经由类型的线网信号是从系统中不同的源设备经由多路器选择出来的。该测试平台还声明了专用于连多路器选择出来的。该测试平台还声明了专用于连接接SobelSobel加速器的线网。在模块中,加速器被实例引加速器的线网。在模块中,加速器被实例引用为待验证的设计(用为待验证的设计(duvduv)并与该线网连接。)并与该线网连接。 102加速器的验证加速器的验证加速器的验证加速器的验证为处理器总线功能模型编写的测试平台为处理器总线功能模型编写的测试平台为处理器总线功能模型编写的测试平台为处理器总线功能模型编写的测试平台为处理器总线功能模型编写的测试平台为处理器总线功能模型编写的测试平

279、台代码如下:代码如下:代码如下:代码如下:代码如下:代码如下:reg cpu_cyc_o, cpu_stb_o, cpu_we_o;reg cpu_cyc_o, cpu_stb_o, cpu_we_o;reg cpu_cyc_o, cpu_stb_o, cpu_we_o;reg 3:0 reg 3:0 reg 3:0 cpu_sel_o;cpu_sel_o;cpu_sel_o;reg 22:0 reg 22:0 reg 22:0 cpu_adr_o;cpu_adr_o;cpu_adr_o;wirewirewire cpu_ack_i; cpu_ack_i; cpu_ack_i;reg 31:0

280、 reg 31:0 reg 31:0 cpu_dat_o;cpu_dat_o;cpu_dat_o;wire31:0wire31:0wire31:0cpu_dat_i;cpu_dat_i;cpu_dat_i; 103加速器的验证加速器的验证加速器的验证加速器的验证 task bus_write ( input 22:0 adr, input 31:0 dat );task bus_write ( input 22:0 adr, input 31:0 dat );task bus_write ( input 22:0 adr, input 31:0 dat );beginbeginbegincpu

281、_adr_o = adr;cpu_adr_o = adr;cpu_adr_o = adr;cpu_sel_o = 4b1111;cpu_sel_o = 4b1111;cpu_sel_o = 4b1111;cpu_dat_o = dat;cpu_dat_o = dat;cpu_dat_o = dat;cpu_cyc_o = 1b1; cpu_stb_o = 1b1; cpu_we_o = 1b1;cpu_cyc_o = 1b1; cpu_stb_o = 1b1; cpu_we_o = 1b1;cpu_cyc_o = 1b1; cpu_stb_o = 1b1; cpu_we_o = 1b1;(po

282、sedge clk); while (!cpu_ack_i) (posedge clk);(posedge clk); while (!cpu_ack_i) (posedge clk);(posedge clk); while (!cpu_ack_i) (posedge clk);endendendendtaskendtaskendtaskinitial begin / initial begin / initial begin / 处理器总线功能模型处理器总线功能模型处理器总线功能模型处理器总线功能模型处理器总线功能模型处理器总线功能模型 cpu_adr_o = 23h000000;cpu_

283、adr_o = 23h000000;cpu_adr_o = 23h000000; cpu_sel_o = 4b0000; cpu_sel_o = 4b0000; cpu_sel_o = 4b0000; cpu_dat_o = 32h00000000; cpu_dat_o = 32h00000000; cpu_dat_o = 32h00000000; cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_we_o = 1b0; cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_we_o = 1b0; cpu_cyc_o = 1b0; cpu_stb

284、_o = 1b0; cpu_we_o = 1b0; 104加速器的验证加速器的验证加速器的验证加速器的验证(negedge rst);(negedge rst);(negedge rst);(posedge clk);(posedge clk);(posedge clk);/ / / 把把把把把把00800 (hex)00800 (hex)00800 (hex)写到写到写到写到写到写到 O_base_addrO_base_addrO_base_addr寄存器寄存器寄存器寄存器寄存器寄存器bus_write (sobel_reg_base + sobel_O_base_reg_offset, b

285、us_write (sobel_reg_base + sobel_O_base_reg_offset, bus_write (sobel_reg_base + sobel_O_base_reg_offset, 32h00008000); 32h00008000); 32h00008000);/ / / 把把把把把把053000 + 2800(hex) 053000 + 2800(hex) 053000 + 2800(hex) 写到写到写到写到写到写到 D_base_addr registerD_base_addr registerD_base_addr registerbus_write(so

286、bel_reg_base+ sobel_D_base_reg_offset, bus_write(sobel_reg_base+ sobel_D_base_reg_offset, bus_write(sobel_reg_base+ sobel_D_base_reg_offset, 32h00532800); 32h00532800); 32h00532800);/ / / 把把把把把把111写到中断控制寄存器写到中断控制寄存器写到中断控制寄存器写到中断控制寄存器写到中断控制寄存器写到中断控制寄存器 (中断使能中断使能中断使能中断使能中断使能中断使能) bus_write(sobel_reg_b

287、ase+ sobel_int_reg_offset,bus_write(sobel_reg_base+ sobel_int_reg_offset,bus_write(sobel_reg_base+ sobel_int_reg_offset, 32h00000001); 32h00000001); 32h00000001);/写到启动寄存器写到启动寄存器写到启动寄存器写到启动寄存器写到启动寄存器写到启动寄存器 (不考虑数据值不考虑数据值不考虑数据值不考虑数据值不考虑数据值不考虑数据值)bus_write(sobel_reg_base + sobel_start_reg_offset, bus_w

288、rite(sobel_reg_base + sobel_start_reg_offset, bus_write(sobel_reg_base + sobel_start_reg_offset, 32h00000000); 32h00000000); 32h00000000);/写操作的结束写操作的结束写操作的结束写操作的结束写操作的结束写操作的结束 cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_we_o = 1b0;cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_we_o = 1b0;cpu_cyc_o = 1b0; cpu_stb_o

289、 = 1b0; cpu_we_o = 1b0; 105加速器的验证加速器的验证加速器的验证加速器的验证 begin: loop begin: loop begin: loopforever beginforever beginforever begin#10000;#10000;#10000;(posedge clk);(posedge clk);(posedge clk);/读取状态寄存器读取状态寄存器读取状态寄存器读取状态寄存器读取状态寄存器读取状态寄存器 cpu_adr_o = sobel_reg_base + cpu_adr_o = sobel_reg_base + cpu_adr_o

290、 = sobel_reg_base + sobel_status_reg_offset; sobel_status_reg_offset; sobel_status_reg_offset;cpu_sel_o = 4b1111;cpu_sel_o = 4b1111;cpu_sel_o = 4b1111;cpu_cyc_o = 1b1; cpu_stb_o = 1b1;cpu_cyc_o = 1b1; cpu_stb_o = 1b1;cpu_cyc_o = 1b1; cpu_stb_o = 1b1; cpu_we_o = 1b0; cpu_we_o = 1b0; cpu_we_o = 1b0;(p

291、osedge clk); (posedge clk); (posedge clk); while (!cpu_ack_i) while (!cpu_ack_i) while (!cpu_ack_i) ( posedge clk); ( posedge clk); ( posedge clk);cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_cyc_o = 1b0; cpu_stb_o = 1b0; cpu_we_o = 1b0; cpu_we_o = 1b0; cpu_we_o = 1b0;if(c

292、pu_dat_i0) disable loop;if(cpu_dat_i0) disable loop;if(cpu_dat_i0) disable loop; end end end end end endendendend 106加速器的验证加速器的验证加速器的验证加速器的验证处理器等到系统复位完成后,随即执行所处理器等到系统复位完成后,随即执行所处理器等到系统复位完成后,随即执行所处理器等到系统复位完成后,随即执行所处理器等到系统复位完成后,随即执行所处理器等到系统复位完成后,随即执行所要求的总线写操作时序,对加速器进行初要求的总线写操作时序,对加速器进行初要求的总线写操作时序,对加速器

293、进行初要求的总线写操作时序,对加速器进行初要求的总线写操作时序,对加速器进行初要求的总线写操作时序,对加速器进行初始化。对于由任务始化。对于由任务始化。对于由任务始化。对于由任务始化。对于由任务始化。对于由任务bus_writebus_writebus_write描述的每个描述的每个描述的每个描述的每个描述的每个描述的每个总线操作,处理器给地址、数据和控制信总线操作,处理器给地址、数据和控制信总线操作,处理器给地址、数据和控制信总线操作,处理器给地址、数据和控制信总线操作,处理器给地址、数据和控制信总线操作,处理器给地址、数据和控制信号赋恰当的值,然后等待加速器确认已完号赋恰当的值,然后等待加

294、速器确认已完号赋恰当的值,然后等待加速器确认已完号赋恰当的值,然后等待加速器确认已完号赋恰当的值,然后等待加速器确认已完号赋恰当的值,然后等待加速器确认已完成操作。在完成对成操作。在完成对成操作。在完成对成操作。在完成对成操作。在完成对成操作。在完成对startstartstart寄存器的写操作寄存器的写操作寄存器的写操作寄存器的写操作寄存器的写操作寄存器的写操作后,处理器进入一个循环,它等待后,处理器进入一个循环,它等待后,处理器进入一个循环,它等待后,处理器进入一个循环,它等待后,处理器进入一个循环,它等待后,处理器进入一个循环,它等待10s10s10s后,和时钟进行一次同步,然后读加速器

295、后,和时钟进行一次同步,然后读加速器后,和时钟进行一次同步,然后读加速器后,和时钟进行一次同步,然后读加速器后,和时钟进行一次同步,然后读加速器后,和时钟进行一次同步,然后读加速器的状态寄存器。当加速器确认完成读操作的状态寄存器。当加速器确认完成读操作的状态寄存器。当加速器确认完成读操作的状态寄存器。当加速器确认完成读操作的状态寄存器。当加速器确认完成读操作的状态寄存器。当加速器确认完成读操作时,处理器检查时,处理器检查时,处理器检查时,处理器检查时,处理器检查时,处理器检查done done done 标志位是否为标志位是否为标志位是否为标志位是否为标志位是否为标志位是否为1 1 1。若。若

296、。若。若。若。若为为为为为为1 1 1,则处理器退出循环,完成测试。,则处理器退出循环,完成测试。,则处理器退出循环,完成测试。,则处理器退出循环,完成测试。,则处理器退出循环,完成测试。,则处理器退出循环,完成测试。107加速器的验证加速器的验证加速器的验证加速器的验证存储器总线功能模型的测试平台代码如下:存储器总线功能模型的测试平台代码如下:wirewire mem_stb_i; mem_stb_i;wire 3:0wire 3:0mem_sel_i;mem_sel_i;regreg mem_ack_o; mem_ack_o;reg 31:0reg 31:0mem_dat_o;mem_da

297、t_o;always begin / always begin / 存储器总线功能模型存储器总线功能模型 mem_ack_o = 1b0;mem_ack_o = 1b0;mem_dat_o = 3h00000000;mem_dat_o = 3h00000000;(posedge clk);(posedge clk);while (!(bus_cyc & mem_stb_i) (posedge clk);while (!(bus_cyc & mem_stb_i) (posedge clk);if (!bus_we)if (!bus_we)mem_dat_o = 32h00000000; / me

298、m_dat_o = 32h00000000; / 代替读取的数据代替读取的数据 mem_ack_o = 1b1;mem_ack_o = 1b1;(posedge clk);(posedge clk);endend108加速器的验证加速器的验证加速器的验证加速器的验证存储器一直等待,直到信号存储器一直等待,直到信号bus_cyc bus_cyc 和和mem_stb_imem_stb_i都为都为11,这表示需要进行存储器操作。若,这表示需要进行存储器操作。若bus_webus_we为为00,则进行读取操作,故从存储器的输出读取,则进行读取操作,故从存储器的输出读取的数据为的数据为00。在写操作的情

299、况下,存储器不对输。在写操作的情况下,存储器不对输入数据进行任何操作。在这两种情况下,存储器入数据进行任何操作。在这两种情况下,存储器都把确认信号设置为都把确认信号设置为11,在下一个周期随即把这,在下一个周期随即把这个信号清零,完成操作。个信号清零,完成操作。109加速器的验证加速器的验证加速器的验证加速器的验证测试平台仲裁器在某种程度上比测试平台的其它测试平台仲裁器在某种程度上比测试平台的其它器件要复杂些。它把信号器件要复杂些。它把信号sobel_cyc_o sobel_cyc_o 和和cpu_cyc_ocpu_cyc_o分别用作分别用作SobelSobel加速器和处理器的请求加速器和处理

300、器的请求信号,并产生信号,并产生sobel_gntsobel_gnt和和cpu_gntcpu_gnt作为作为批准批准批准批准(grantgrant)信号。当任一请求信号变成有效时,仲裁器便发出信号。当任一请求信号变成有效时,仲裁器便发出相应的批准信号。若两个请求信号在同一个周期变相应的批准信号。若两个请求信号在同一个周期变成有效,则仲裁器授予加速器优先权,发出加速器成有效,则仲裁器授予加速器优先权,发出加速器的的批准批准批准批准信号,而不发出处理器的信号,而不发出处理器的批准批准批准批准信号直到加速信号直到加速器的请求被撤销为止。因为批准信号输出不仅仅取器的请求被撤销为止。因为批准信号输出不仅

301、仅取决于请求信号的输入值,还取决于请求信号值的以决于请求信号的输入值,还取决于请求信号值的以前历史情况。仲裁器必须由时序电路采用有限状态前历史情况。仲裁器必须由时序电路采用有限状态机来实现。状态转移图如图机来实现。状态转移图如图1111所示。该有限状态机所示。该有限状态机是一个米利型状态机,因为它允许在相应的请求信是一个米利型状态机,因为它允许在相应的请求信号变为有效的同一个周期就发出号变为有效的同一个周期就发出批准批准批准批准信号。信号。 110加速器的验证加速器的验证加速器的验证加速器的验证图图1111仲裁器状态转移图仲裁器状态转移图111加速器的验证加速器的验证加速器的验证加速器的验证仲

302、裁器的测试平台代码如下:仲裁器的测试平台代码如下:parameter sobel = 1b0, cpu =1b1;parameter sobel = 1b0, cpu =1b1;reg arbiter_current_state, arbiter_next_state;reg arbiter_current_state, arbiter_next_state;reg sobel_gnt, cpu_gnt;reg sobel_gnt, cpu_gnt;/ / 仲裁器有限状态机寄存器仲裁器有限状态机寄存器 always (posedge clk) always (posedge clk) if (

303、rst)if (rst)arbiter_current_state = sobel;arbiter_current_state = sobel;elseelsearbiter_current_state = arbiter_next_state;arbiter_current_state = arbiter_next_state; 112加速器的验证加速器的验证加速器的验证加速器的验证 always *always */ / 仲裁器逻辑仲裁器逻辑case (arbiter_current_state)case (arbiter_current_state) sobel: if (sobel_c

304、yc_o) begin sobel: if (sobel_cyc_o) begin sobel_gnt = 1b1; cpu_gnt = 1b0; sobel_gnt = 1b1; cpu_gnt = 1b0; arbiter_next_state = sobel; arbiter_next_state = sobel; end end else if (!sobel_cyc_o & cpu_cyc_o) else if (!sobel_cyc_o & cpu_cyc_o) begin begin sobel_gnt = 1b0; cpu_gnt = 1b1; sobel_gnt = 1b0;

305、 cpu_gnt = 1b1; arbiter_next_state = cpu; arbiter_next_state = cpu; end end else begin else begin sobel_gnt = 1b0; cpu_gnt = 1b0; sobel_gnt = 1b0; cpu_gnt = 1b0; arbiter_next_state = sobel; arbiter_next_state = sobel; end end 113加速器的验证加速器的验证加速器的验证加速器的验证 cpu:cpu:if (cpu_cyc_o) beginif (cpu_cyc_o) beg

306、in sobel_gnt = 1b0; cpu_gnt = 1b1; sobel_gnt = 1b0; cpu_gnt = 1b1; arbiter_next_state = cpu; arbiter_next_state = cpu; end end else if (sobel_cyc_o & !cpu_cyc_o) else if (sobel_cyc_o & !cpu_cyc_o) begin begin sobel_gnt = 1b1; cpu_gnt = 1b0; sobel_gnt = 1b1; cpu_gnt = 1b0; arbiter_next_state = sobel;

307、 arbiter_next_state = sobel; end end else begin else begin sobel_gnt = 1b0; cpu_gnt = 1b0; sobel_gnt = 1b0; cpu_gnt = 1b0; arbiter_next_state = sobel; arbiter_next_state = sobel; end endendcaseendcase114加速器的验证加速器的验证加速器的验证加速器的验证测试平台代码剩下的部分表示总线多路选择器和从机选测试平台代码剩下的部分表示总线多路选择器和从机选择逻辑:择逻辑:wirewiresobel_sel

308、, mem_sel;sobel_sel, mem_sel;assign bus_cyc = sobel_gnt ? sobel_cyc_o : cpu_cyc_o;assign bus_cyc = sobel_gnt ? sobel_cyc_o : cpu_cyc_o;assign bus_stb = sobel_gnt ? sobel_stb_o : cpu_stb_o;assign bus_stb = sobel_gnt ? sobel_stb_o : cpu_stb_o;assign bus_we = sobel_gnt ? sobel_we_o : cpu_we_o;assign bu

309、s_we = sobel_gnt ? sobel_we_o : cpu_we_o;assign bus_sel = sobel_gnt ? 4b1111 : cpu_sel_o;assign bus_sel = sobel_gnt ? 4b1111 : cpu_sel_o;assign bus_adr = sobel_gnt ? 1b0, sobel_adr_o:cpu_adr_o;assign bus_adr = sobel_gnt ? 1b0, sobel_adr_o:cpu_adr_o;assign sobel_ack_i assign sobel_ack_i = bus_ack & s

310、obel_gnt;= bus_ack & sobel_gnt;assign cpu_ack_iassign cpu_ack_i = bus_ack & cpu_gnt;= bus_ack & cpu_gnt;115加速器的验证加速器的验证加速器的验证加速器的验证 / / 总线从机逻辑总线从机逻辑 assign sobel_selassign sobel_sel= (bus_adr & 23h7FFFF0) = = (bus_adr & 23h7FFFF0) = sobel_reg_base;sobel_reg_base;assign mem_selassign mem_sel= (bus_ad

311、r & 23h400000) = mem_base;= (bus_adr & 23h400000) = mem_base;assign sobel_stb_i = bus_stb & sobel_sel;assign sobel_stb_i = bus_stb & sobel_sel;assign mem_stb_iassign mem_stb_i = bus_stb & mem_sel; = bus_stb & mem_sel;assignassignbus_ack = sobel_sel ? sobel_ack_o : mem_sel ? bus_ack = sobel_sel ? sob

312、el_ack_o : mem_sel ? mem_ack_o : 1b0; mem_ack_o : 1b0;/ / 总线数据多路选择器总线数据多路选择器assign bus_dat = assign bus_dat = (sobel_gnt & bus_we | sobel_sel & !bus_we) (sobel_gnt & bus_we | sobel_sel & !bus_we) ? sobel_dat_o : (cpu_gnt & bus_we) ? ? sobel_dat_o : (cpu_gnt & bus_we) ? cpu_dat_o : mem_dat_o; cpu_dat

313、_o : mem_dat_o;116加速器的验证加速器的验证加速器的验证加速器的验证来自仲裁器的批准信号确定由哪个主设备来自仲裁器的批准信号确定由哪个主设备提供总线控制信号和地址信号。仲裁器的提供总线控制信号和地址信号。仲裁器的批准批准批准批准(grantgrant)信号也被用来选择哪一个主)信号也被用来选择哪一个主机接收从机的确认信号,这样只有取得总机接收从机的确认信号,这样只有取得总线使用权的线使用权的主机主机主机主机才能接收到从机的确认信才能接收到从机的确认信号。总线号。总线从机从机从机从机逻辑对地址进行译码得到设逻辑对地址进行译码得到设备的片选信号。被选中的备的片选信号。被选中的从机从

314、机从机从机(片选信号(片选信号有效)利用其片选信号把有效)利用其片选信号把确认确认确认确认(ackack)信)信号经由多路器送到号经由多路器送到bus_ackbus_ack信号上。总线信号上。总线数据多路器根据哪个数据多路器根据哪个主机主机主机主机是有效的,哪个是有效的,哪个从机从机从机从机被选中,总线操作是读还是写,来确被选中,总线操作是读还是写,来确定定bus_databus_data信号的数据源。信号的数据源。117加速器的验证加速器的验证加速器的验证加速器的验证我们将利用例我们将利用例1414的测试平台进行仿真,以验的测试平台进行仿真,以验证证SobelSobel加速器正确地响应了从机

315、总线操作,加速器正确地响应了从机总线操作,并在正确的地址上执行了主机总线操作。我并在正确的地址上执行了主机总线操作。我们必须观察总线的控制信号和地址信号的们必须观察总线的控制信号和地址信号的值,以及加速器内部信号的值。图值,以及加速器内部信号的值。图1212显示了显示了由处理器总线功能模块对加速器进行初始化由处理器总线功能模块对加速器进行初始化的过程中总线信号的仿真波形。图的过程中总线信号的仿真波形。图1313到到1515显显示了加速器内部信号在处理一行开始时的波示了加速器内部信号在处理一行开始时的波形(图形(图1313),在稳态处理过程中的波形(图),在稳态处理过程中的波形(图1414),和

316、在处理一行结束时和下一行开始时),和在处理一行结束时和下一行开始时的波形(图的波形(图1515)。最后,图)。最后,图1616展示了整幅图展示了整幅图像处理完成时的内部信号。像处理完成时的内部信号。118加速器的验证加速器的验证加速器的验证加速器的验证图图12 12 对对SobelSobel加速器进行初始化的总线操作波形加速器进行初始化的总线操作波形119加速器的验证加速器的验证加速器的验证加速器的验证图图13 13 行处理开始时的加速器内部信号波形行处理开始时的加速器内部信号波形120加速器的验证加速器的验证加速器的验证加速器的验证图图14 14 在稳态情况下的行处理波形在稳态情况下的行处理

317、波形121加速器的验证加速器的验证加速器的验证加速器的验证图图15 15 一行结束,下一行开始时的波形一行结束,下一行开始时的波形122加速器的验证加速器的验证加速器的验证加速器的验证图图16 16 图像处理完成时的波形图像处理完成时的波形123加速器的验证加速器的验证加速器的验证加速器的验证虽然上面的仿真结果显示在我们的测试范围虽然上面的仿真结果显示在我们的测试范围内加速器的功能是对的,但这样的验证过程内加速器的功能是对的,但这样的验证过程绝对不是完整的。例如,它并没有显示计算绝对不是完整的。例如,它并没有显示计算产生了算法所要求的正确结果,也没有显示产生了算法所要求的正确结果,也没有显示控

318、制时序对于加速器和其它总线控制时序对于加速器和其它总线主机主机主机主机所有可所有可能的相互作用都是正确的。能的相互作用都是正确的。 假设考虑数据值假设考虑数据值和总线设备之间相互作用方式的排列组合的和总线设备之间相互作用方式的排列组合的个数,为基于仿真的验证创建测试案例来覆个数,为基于仿真的验证创建测试案例来覆盖所有的情况几乎是不现实的。盖所有的情况几乎是不现实的。 因此我们必因此我们必须求助于更完善的验证技术,比如,受约束须求助于更完善的验证技术,比如,受约束的随机测试生成的随机测试生成(constrained random test genera-(constrained random t

319、est genera-tion)tion),覆盖分析,覆盖分析(coverage analysis)(coverage analysis),和基于属,和基于属性的形式化验证(性的形式化验证(property-based formal property-based formal verificationverification)。)。 124加速器设计总结加速器设计总结加速器设计总结加速器设计总结并行,即一次执行多个处理步骤,可以使并行,即一次执行多个处理步骤,可以使加速器完成一个操作所需的时间减少。加速器完成一个操作所需的时间减少。加速器通过硬件资源的复制和流水线操作加速器通过硬件资源的复制和

320、流水线操作实现了并行,这使得我们必须权衡成本和实现了并行,这使得我们必须权衡成本和性能(以及功耗和性能)对设计的重要性,性能(以及功耗和性能)对设计的重要性,从而做出正确的抉择。从而做出正确的抉择。可达到的并行程度受制于计算中数据的依可达到的并行程度受制于计算中数据的依赖度。赖度。加速器的设计涉及算法分析,确定由硬件加速器的设计涉及算法分析,确定由硬件完成的完成的算法核心算法核心算法核心算法核心。算法的其它部分可由嵌。算法的其它部分可由嵌入式软件完成。入式软件完成。AmdahlAmdahl法则量化了由加速法则量化了由加速算法核心算法核心算法核心算法核心部分所部分所带来的总体速度提升。带来的总体

321、速度提升。125加速器设计总结加速器设计总结加速器设计总结加速器设计总结加速器和高速加速器和高速I/OI/O控制器可以采用直接存储控制器可以采用直接存储器访问方式(器访问方式(DMADMA)向存储器写入)向存储器写入/读出读出数据,而不需要处理器干预。在这种控制数据,而不需要处理器干预。在这种控制器里,由地址发生器为器里,由地址发生器为DMADMA方式计算存储方式计算存储器地址。器地址。 总线仲裁器可在任何时候,裁决由哪个总总线仲裁器可在任何时候,裁决由哪个总线主机控制总线,访问哪个总线从机,诸线主机控制总线,访问哪个总线从机,诸如存储器和如存储器和I/OI/O控制器中的寄存器。控制器中的寄存

322、器。块处理加速器处理储存在存储器中的数据块处理加速器处理储存在存储器中的数据块。许多视频和静止图像的处理应用是面块。许多视频和静止图像的处理应用是面向块处理的。向块处理的。流处理加速器可以处理来自于源设备按照流处理加速器可以处理来自于源设备按照顺序到达的数据块。顺序到达的数据块。 数字信号处理数字信号处理(DSPDSP)通常采用面向流处理的加速器。)通常采用面向流处理的加速器。 126加速器设计总结加速器设计总结加速器设计总结加速器设计总结加速器内部包含可由嵌入式软加速器内部包含可由嵌入式软件设置的控制和状态寄存器。件设置的控制和状态寄存器。采用穷举仿真对加速器进行验采用穷举仿真对加速器进行验证通常是不现实的。可以操作证通常是不现实的。可以操作的每个方面进行独立的验证,的每个方面进行独立的验证,但完整的验证计划必须包括其但完整的验证计划必须包括其它形式的验证。它形式的验证。 127加速器设计总结加速器设计总结加速器设计总结加速器设计总结讲课到此完毕,同学们可以参讲课到此完毕,同学们可以参考已经调试通过的实验程序加考已经调试通过的实验程序加深对课本内容的理解。深对课本内容的理解。 再见!再见!128加速器设计总结加速器设计总结加速器设计总结加速器设计总结

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号