版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1硬件(yn jin)加速器的設(shè)計(jì)(Verilog 1364-2001) - 建模、仿真(fn zhn)、綜合、驗(yàn)證和實(shí)現(xiàn) -北京航空航天大學(xué) 夏宇聞共一百二十九頁2課時(shí)(ksh)安排和學(xué)習(xí)方法四次講課每次3小時(shí);下課后自己閱讀材料在助教指導(dǎo)下做實(shí)驗(yàn)4小時(shí);課堂 3 x 4 =12小時(shí),自己看書(kn sh) 20 小時(shí),做實(shí)驗(yàn) 20 小時(shí),共計(jì)52小時(shí);理論與實(shí)踐結(jié)合的學(xué)習(xí)方法;考核方法:修改課上介紹的設(shè)計(jì),使其具有更高的性能。共一百二十九頁3講課的主要(zhyo)內(nèi)容硬件加速器的一般(ybn)概念為什么要研究硬件加速器設(shè)計(jì)硬件加速器基本方法: 流水線 和 硬件復(fù)制軟件/硬件的劃分原則算法核
2、心(Kernel) 多主設(shè)備共享內(nèi)存系統(tǒng)共一百二十九頁4講課(jing k)的主要內(nèi)容 設(shè)計(jì)舉例 視頻圖像邊緣檢測 算法的原理卷積表算法的偽碼表示中間(zhngjin)值和最終值的比特需求處理階段的劃分共一百二十九頁5講課(jing k)的目的提醒材料上容易忽略的內(nèi)容;指出重點(diǎn)和關(guān)鍵點(diǎn);幫助同學(xué)(tng xu)理解材料上的難點(diǎn);自己看材料、上機(jī)練習(xí)為主;互相認(rèn)識(shí),以便交流。共一百二十九頁6一般(ybn)概念在嵌入式DSP系統(tǒng)中,對處理器有很高的要求,編寫專用的嵌入式軟件,采用高檔的DSP處理器芯片有時(shí)也無法達(dá)到系統(tǒng)對算法運(yùn)算速度(sd)的要求,即使能達(dá)到性能價(jià)格比太差。 不得不設(shè)計(jì)專用硬件;
3、采用硬件復(fù)制和流水線方法;增加并行性;還需要控制成本。共一百二十九頁7一般(ybn)概念 數(shù)據(jù)的互相依賴性;中間數(shù)據(jù)的保存;硬件的復(fù)制;用一個(gè)時(shí)鐘在幾個(gè)并行(bngxng)硬件中可同時(shí)完成多個(gè)操作;時(shí)鐘的頻率也可以提高。共一百二十九頁8一般(ybn)概念步驟1步驟2步驟3寄存器寄存器寄存器圖 流水線在復(fù)雜應(yīng)用(yngyng)中要復(fù)合應(yīng)用(yngyng)流水線和硬件復(fù)制方法共一百二十九頁9 加速算法核心(kernel)引起的性能改善的量化 :設(shè)執(zhí)行算法核心所占的時(shí)間比例(bl)為 f。則執(zhí)行非算法核心的時(shí)間為(1- f ),因此有: t = ft + ( 1-f ) t 如果加速器能把算法核心的
4、處理速度提高到原來的 s 倍,則算法核心的處理時(shí)間就縮短到原來的1/s,非算法核心的處理時(shí)間不變。因此,這個(gè)算法總的運(yùn)行時(shí)間為: t = ft/s + ( 1- f ) t 總體性能的提高比例是原來的處理時(shí)間除以加速后的處理時(shí)間: S= (ft+(1-f ) t) / ( ft/s+(1-f ) t ) = 1 / ( f/s+(1-f )這個(gè)公式稱為Amdahl法則,是以Gene Amdahl的名字命名的,他是并行計(jì)算的先驅(qū)之一。這個(gè)公式表明加速處理核心(kernel)算法所帶來的整體性能的提高在很大程度上依賴于算法核心在整個(gè)算法執(zhí)行時(shí)間中所占的比例。 一般(ybn)概念共一百二十九頁10
5、例1:假設(shè)在嵌入式處理器上運(yùn)行的算法可以分成不同的部分,執(zhí)行每一部分所花費(fèi)的時(shí)間可以估算出來,而該算法可分為(fn wi)兩個(gè)部分,即分成兩個(gè)核心(kernel)算法,一個(gè)占總時(shí)間的80%,而另一個(gè)只占總時(shí)間的20%。若用一個(gè)硬件加速器來加速算法核心,我們將第一個(gè)算法核心的運(yùn)行速度提高到原來的10倍,或者將第二個(gè)算法核心提高到原來的100倍,試問對哪個(gè)算法核心使用硬件加速器能對總體性能的提高產(chǎn)生更好的效果?解:對第一個(gè)算法核心進(jìn)行加速處理所帶來的總體性能提升為: 1 / (0.8/10)+(1-0.8) = 1/(0.08+0.2) =3.57 對第二個(gè)算法核心進(jìn)行加速處理帶來的總體性能提升為
6、: 1 / (0.2/10)+(1-0.2) = 1/(0.02+0.8) =1.25一般(ybn)概念共一百二十九頁11 從結(jié)果對比可以看到,雖然(surn)第二個(gè)算法核心提高的運(yùn)算速度是第一個(gè)的10倍,但是由于它在原來總運(yùn)行時(shí)間里所占的比例較低,對其進(jìn)行加速處理也只能帶來較小的性能改善。而對第一個(gè)算法核心進(jìn)行加速處理會(huì)對總體性能產(chǎn)生更顯著的效果。所以我們在開始正式設(shè)計(jì)硬件時(shí)必須找到主要矛盾,即占總運(yùn)行時(shí)間比例較高的部分,針對這部分算法程序進(jìn)行硬件加速器的設(shè)計(jì) ,以期望取得顯著效果。一般(ybn)概念共一百二十九頁12 在確定算法核心以后,我們需要確定執(zhí)行計(jì)算步驟的順序(shnx)。我們要確
7、保能得到數(shù)據(jù),以便按順序(shnx)處理,并且確保中間結(jié)果能夠在后續(xù)步驟需要前計(jì)算出來。除了這些約束以外,有些運(yùn)算步驟是可以潛在地并行執(zhí)行的。因此,我們要確定哪些步驟可以通過并行執(zhí)行來滿足性能要求。然后再確定加速器的結(jié)構(gòu),即確定各個(gè)處理模塊的功能以及它們之間的數(shù)據(jù)流動(dòng)。一般(ybn)概念共一百二十九頁13 從算法到加速器結(jié)構(gòu),是在系統(tǒng)設(shè)計(jì)流程的早期完成的。這通常是由有經(jīng)驗(yàn)(jngyn)的系統(tǒng)設(shè)計(jì)師完成。讓綜合工具自動(dòng)完成這一過程,面臨很大的技術(shù)挑戰(zhàn)。除了非常少的領(lǐng)域外,早期的高級(jí)綜合工具并不成功。近來,新一代工具開始浮現(xiàn),并且在很廣泛的領(lǐng)域內(nèi)表現(xiàn)出良好的前景,尤其在音頻,視頻,和其它的信號(hào)處理
8、領(lǐng)域。隨著這種技術(shù)的成熟,我們可以期待高級(jí)綜合工具在設(shè)計(jì)方法學(xué)中將會(huì)有更廣泛的應(yīng)用。一般(ybn)概念共一百二十九頁14 在許多嵌入式系統(tǒng)中,需要處理大量的輸入輸出數(shù)據(jù)。I/O控制器必須在外部設(shè)備和嵌入式系統(tǒng)之間高速傳輸數(shù)據(jù)。數(shù)據(jù)從外部設(shè)備讀入內(nèi)存,就可以被嵌入式軟件或加速器處理。處理后的數(shù)據(jù)被寫到內(nèi)存。如果讀寫內(nèi)存數(shù)據(jù)都在處理器的控制下進(jìn)行,那么,數(shù)據(jù)傳輸速度會(huì)很慢,并且占用大量處理器時(shí)間,使處理器無法執(zhí)行其他任務(wù)。如果讓I/O控制器和加速器直接發(fā)起對內(nèi)存的訪問而不通過處理器,勢必可以大大加快(ji kui)訪問內(nèi)存的速度。這種內(nèi)存訪問方式稱為DMA(Direct Memory Access
9、)方式。在這種方式下,I/O控制器和加速器作為主設(shè)備給出讀寫內(nèi)存的地址和控制信號(hào),或者通過DMA控制器發(fā)起對內(nèi)存的訪問,由DMA控制器給出地址和控制信號(hào)。一般(ybn)概念共一百二十九頁15 系統(tǒng)中有處理器和DMA設(shè)備,并且共用內(nèi)存訪問通路,必須避免由于多個(gè)主設(shè)備同時(shí)訪問內(nèi)存而引起的沖突。為此,我們可以在系統(tǒng)中引入仲裁器(Arbiter),如下圖所示。系統(tǒng)中的主設(shè)備(處理器,DMA方式的加速器、I/O控制器)在訪問內(nèi)存之前,必須給仲裁器發(fā)出請求信號(hào),仲裁器根據(jù)預(yù)先確定的仲裁策略,在多個(gè)請求信號(hào)中決定誰將取得訪問內(nèi)存的總線控制權(quán),并給得到總線控制權(quán)的設(shè)備發(fā)出訪問內(nèi)存的準(zhǔn)許信號(hào)。當(dāng)該設(shè)備完成(wn
10、 chng)對內(nèi)存的訪問后,便撤消請求信號(hào)。然后,仲裁器進(jìn)入新一輪的仲裁,仲裁勝出的設(shè)備進(jìn)行內(nèi)存訪問。我們也可以讓處理器來執(zhí)行仲裁器的功能。當(dāng)其他主設(shè)備要訪問內(nèi)存時(shí),必須先向處理器發(fā)出請求信號(hào),由該處理器決定哪個(gè)設(shè)備可以訪問內(nèi)存。根據(jù)不同的應(yīng)用場合,選擇適合的仲裁策略,有優(yōu)先級(jí)模式(賦予某個(gè)或幾個(gè)設(shè)備更高的優(yōu)先權(quán)),輪詢模式(所有主設(shè)備嚴(yán)格按照一定的順序取得內(nèi)存訪問權(quán))。一般(ybn)概念共一百二十九頁16 一般(ybn)概念 CPU 加速器 仲裁(zhngci)器 存儲(chǔ)器圖2 多主設(shè)備共享內(nèi)存系統(tǒng) I/O控制器request grant grant requestrequest grant共
11、一百二十九頁17 在許多應(yīng)用中,數(shù)據(jù)被有規(guī)律地放在內(nèi)存中如占用連續(xù)的內(nèi)存塊,加速器把數(shù)據(jù)從內(nèi)存中一塊一塊取出進(jìn)行處理。例如處理靜態(tài)和視頻圖像的幾種算法把一幀圖像分割成88或者1616的像素塊,然后獨(dú)立地處理每個(gè)塊。這種塊處理加速器的數(shù)據(jù)通路主要由兩部分組成。其中一個(gè)部分以DMA方式訪問內(nèi)存。這部分電路根據(jù)處理器寫入加速器內(nèi)部寄存器的基地址產(chǎn)生后續(xù)地址。這一功能通常由地址計(jì)數(shù)器來完成。數(shù)據(jù)通路的另一部分對數(shù)據(jù)進(jìn)行處理??刂撇糠职匆欢ǖ臅r(shí)序(sh x)控制數(shù)據(jù)通路的打開和關(guān)閉,使數(shù)據(jù)有序、正確地流動(dòng)。控制功能可以用一個(gè)有限狀態(tài)機(jī)或多個(gè)狀態(tài)機(jī)實(shí)現(xiàn)。一般(ybn)概念共一百二十九頁18 與塊處理加速器
12、相對應(yīng)的是流處理加速器。流處理加速器處理的數(shù)據(jù)是按時(shí)間順序達(dá)到的數(shù)據(jù)流。數(shù)據(jù)流可以是來自于高速的輸入設(shè)備(如A/D、攝像機(jī)等),也可以是其他加速器的輸出(shch)。此外,內(nèi)存中的數(shù)據(jù)也能以流的方式讀出,供加速器處理。流處理加速器最常見的應(yīng)用領(lǐng)域之一是數(shù)字信號(hào)處理(DSP)。模擬信號(hào)經(jīng)A/D采樣后,得到采樣信號(hào)的數(shù)據(jù)流。對數(shù)據(jù)的處理包括濾波、混合、放大/衰減、以及時(shí)域和頻域間的轉(zhuǎn)換。 一般(ybn)概念共一百二十九頁19 雖然,加速器可以直接讀取內(nèi)存數(shù)據(jù),并且把數(shù)據(jù)處理完后寫回內(nèi)存,但是加速器必須知道什么時(shí)候開始工作,待處理數(shù)據(jù)的起始地址(dzh),數(shù)據(jù)的大小,處理后數(shù)據(jù)的存放地址(dzh)以
13、及完成處理后通知處理器。也就是說,處理器必須能夠控制加速器的工作、獲取加速器當(dāng)前的工作狀態(tài)。這些功能通常是由加速器內(nèi)部的輸入輸出寄存器來完成。 一般(ybn)概念共一百二十九頁20 我們可以在加速器內(nèi)部設(shè)置地址寄存器和數(shù)據(jù)長度寄存器,處理器通過向這些寄存器寫入數(shù)據(jù)讓加速器知道從何處讀取數(shù)據(jù)、數(shù)據(jù)大小及處理完后數(shù)據(jù)寫到何處。還可以有狀態(tài)寄存器,處理器通過讀取狀態(tài)寄存器了解加速器當(dāng)前的狀態(tài)。也可以用狀態(tài)寄存器的值產(chǎn)生申請中斷信號(hào),通知處理器。加速器可以看做是處理器的一個(gè)I/O設(shè)備,因此,處理器讀寫加速器的內(nèi)部寄存器與讀寫一般(ybn)的I/O設(shè)備是一樣的。一般(ybn)概念共一百二十九頁21 有的
14、情況下,當(dāng)處理器給加速器發(fā)出一個(gè)處理任務(wù)(rn wu)時(shí),并不要求加速器立即響應(yīng)。處理器把需要加速器處理的多項(xiàng)任務(wù)(rn wu)的描述信息寫到先入先出隊(duì)列(FIFO)中,加速器從FIFO中讀取每件任務(wù)的描述信息,等準(zhǔn)備好以后,就可以執(zhí)行一項(xiàng)任務(wù)。一般(ybn)概念共一百二十九頁22視頻邊緣(binyun)檢測下面我們將用視頻圖像邊緣檢測加速器的設(shè)計(jì)作為例子,來說明加速器設(shè)計(jì)中幾個(gè)方面(fngmin)的問題。真實(shí)的邊緣檢測加速器設(shè)計(jì)是非常復(fù)雜的,本書只是介紹加速器的設(shè)計(jì)原理,為了不被具體細(xì)節(jié)所累,我們在這兩者之間做了某種程度的折中。 共一百二十九頁23視頻邊緣(binyun)檢測邊緣(binyu
15、n)檢測是分析視頻圖像的重要手段之一,并且應(yīng)用領(lǐng)域廣泛,像安全監(jiān)控和計(jì)算機(jī)圖形學(xué)等。邊緣檢測是確定一幅圖像在哪些區(qū)域上亮度發(fā)生突變。這些亮度突變的區(qū)域通常就是物體的邊緣。共一百二十九頁24視頻(shpn)邊緣檢測在這個(gè)例子中,我們假設(shè)有像素的圖像,每個(gè)像素用8比特表示,按行存儲(chǔ)在內(nèi)存中,并且每一行里從左到右連續(xù)的像素點(diǎn)占據(jù)著內(nèi)存中連續(xù)的存貯(cn zh)單元。像素值是無符號(hào)整數(shù),范圍從0(黑色)到 255(白色)。這里,我們采用一種相對簡單的算法,叫做Sobel邊緣檢測法。它的機(jī)理是計(jì)算x和y方向亮度信號(hào)的導(dǎo)數(shù)值并且尋找導(dǎo)數(shù)中的最大值和最小值。這些區(qū)域就是亮度變化最劇烈的區(qū)域。 共一百二十九頁
16、25視頻(shpn)邊緣檢測Sobel檢測法通過一個(gè)叫做卷積的過程來估計(jì)每個(gè)像素點(diǎn)每個(gè)方向上的導(dǎo)數(shù)值。把中心像素點(diǎn)和離它最近的八個(gè)像素點(diǎn)每個(gè)乘以一個(gè)系數(shù)(xsh)后相加。該系數(shù)(xsh)通常用一個(gè) 的卷積表(convolution mask)來表示。分別用于計(jì)算x和y方向?qū)?shù)值的Sobel卷積表 Gx和 Gy 如下圖所示。共一百二十九頁26視頻邊緣(binyun)檢測 -10+1-20+2-10+1+1+2+1000-1-2-1GxGy共一百二十九頁27視頻(shpn)邊緣檢測我們把每個(gè)像素值分別乘以卷積表中對應(yīng)的系數(shù),再把相乘得到的九個(gè)數(shù)相加就得到了x方向和y方向的偏導(dǎo)數(shù)值 Dx和 Dy。然
17、后,利用這兩個(gè)偏導(dǎo)數(shù)值計(jì)算中心(j sun zhn xn)像素點(diǎn)的導(dǎo)數(shù)。計(jì)算公式如下:共一百二十九頁28視頻邊緣(binyun)檢測由于我們只想找到導(dǎo)數(shù)幅值的最大值和最小值,對上式作如下簡化:這樣近似能夠滿足計(jì)算要求,因?yàn)殚_平方和平方函數(shù)都是單調(diào)的,實(shí)際(shj)計(jì)算幅度的最大值、最小值與近似以后計(jì)算的最大值、最小值發(fā)生在圖像的同一個(gè)地方。并且,與計(jì)算平方和開平方相比,計(jì)算絕對值所用的硬件資源少得多。共一百二十九頁29視頻(shpn)邊緣檢測我們需要重復(fù)地計(jì)算圖像中每個(gè)像素位置的導(dǎo)數(shù)幅值。但是,注意到環(huán)繞圖像邊緣的像素點(diǎn)并沒有一個(gè)完整的相鄰像素組來計(jì)算偏導(dǎo)數(shù)和導(dǎo)數(shù),所以我們需要對這些像素進(jìn)行單
18、獨(dú)處理。最簡單的方法就是把圖像中邊緣像素點(diǎn)的導(dǎo)數(shù)值(shz)值 |D|設(shè)置為0。這可以通過軟件來完成。共一百二十九頁30視頻(shpn)邊緣檢測例2:把Sobel邊緣檢測算法用偽代碼(di m)的形式表達(dá)出來,也就是,用一種與計(jì)算機(jī)編程語言類似的表示法。答:我們用類似于Verilog的偽代碼來表示該算法。令Orowcol 表示原始圖像的像素點(diǎn),Drowcol表示導(dǎo)數(shù)圖像的像素點(diǎn),row的范圍從0到479,col的范圍從0到639。同時(shí)令Gxij 和 Gyij 表示卷積表,其中i 和 j 的范圍從 -1 到 1. 共一百二十九頁31視頻邊緣(binyun)檢測該算法可以(ky)表達(dá)為如下形式:
19、for( row=1; row=478; row=row+1 ) begin for(col=1; col=638; col=col+1)begin sumx=0;sumy=0;for( i = -1; i = +1; i = i+1) beginfor (j = -1; j= +1; j = j+1) beginsumx = sumx + Orow+icol+j * Gxij;sumy = sumy + Orow+icol+j * Gyij; end end Drowcol = abs(sumx) + abs(sumy) end end共一百二十九頁32視頻(shpn)邊緣檢測例3:求在計(jì)算
20、(j sun)Sobel卷積中表示每個(gè)像素點(diǎn)中間值和最終值所需要的比特?cái)?shù)。答:每個(gè)像素用8比特?zé)o符號(hào)數(shù)表示。像素值與卷積表中的系數(shù)相乘得到的九個(gè)部分積的范圍從 -510到 +510。因此,部分積應(yīng)該用10比特有符號(hào)數(shù)表示。求出每個(gè) Dx和 Dy的值需要把各自的九個(gè)部分積相加。 共一百二十九頁33視頻邊緣(binyun)檢測 結(jié)果值的范圍是從-1020到1020,可以用11比特有符號(hào) 數(shù)表示。然后(rnhu),再把這兩個(gè)絕對值相加,得到 |D| 的范圍從0到2040,也可以用11比特表示。因?yàn)楹罄m(xù)的邊緣檢測操作只需要確定哪個(gè)導(dǎo)數(shù)圖像的像素值超過了特定閾值,我們并不需要11比特的精確度。相反,用8
21、比特值來衡量結(jié)果更為方便,因?yàn)?比特的結(jié)果可以像原始圖像一樣以相同的格式回送到內(nèi)存中。在這兩者之間做了某種程度的折中。 共一百二十九頁34視頻(shpn)邊緣檢測例4 :假設(shè)視頻的幀速為每秒30幀,計(jì)算必須以多快的速度計(jì)算Sobel卷積。答:每幀圖象包括640480 = 307,200 個(gè)像素(xin s)。因?yàn)槊棵胗?0幀,必須以: 307,20030 = 9,216,000 每秒的速度對像素點(diǎn)進(jìn)行處理,換言之,大約每秒1000萬個(gè)像素。共一百二十九頁35視頻(shpn)邊緣檢測例5:確定能夠滿足所要求(yoqi)的計(jì)算性能的并行結(jié)構(gòu)方案。答:既然計(jì)算只需要原始圖像的像素值,因此求解每個(gè)導(dǎo)數(shù)
22、像素所必須的計(jì)算可以各自獨(dú)立地進(jìn)行。因此,我們可以按照要求同時(shí)對盡可能多的像素進(jìn)行計(jì)算。下圖給出了計(jì)算圖像的導(dǎo)數(shù)像素的全過程。 共一百二十九頁36視頻(shpn)邊緣檢測 計(jì)算導(dǎo)數(shù)像素的數(shù)據(jù)(shj)關(guān)系圖共一百二十九頁37視頻邊緣(binyun)檢測這張圖展示了每個(gè)操作步驟所需要的數(shù)據(jù),從原始圖像的頂部像素開始,通過獨(dú)立并行操作得到中間結(jié)果,最后求出底部的導(dǎo)數(shù)像素。我們已經(jīng)省略了系數(shù)值是0的部分積,因?yàn)樗鼈儗Y(jié)果沒有任何影響(yngxing)。通過這幅圖,我們看到可以并行地計(jì)算所有的部分積,因?yàn)槊總€(gè)部分積只依賴于原始像素值和常量系數(shù)。然后我們可以并行地把兩組各六個(gè)部分積加起來,再并行地計(jì)算兩
23、個(gè)絕對值,把它們加起來最后得到(原始圖像某個(gè)像素的)導(dǎo)數(shù)像素值。共一百二十九頁38視頻(shpn)邊緣檢測包括邊緣檢測加速器在內(nèi)的視頻系統(tǒng)的頂層框圖如圖5所示。視頻輸入來自攝像機(jī)的I/O控制器,它把連續(xù)的視頻圖像保存(bocn)在內(nèi)存中。在處理器上運(yùn)行的軟件控制加速器,對給定的幀進(jìn)行處理,得到相應(yīng)的導(dǎo)數(shù)圖像。 圖5含有邊緣檢測加速器的視頻系統(tǒng)這 共一百二十九頁39視頻邊緣(binyun)檢測例6:假設(shè)存儲(chǔ)原始圖像和導(dǎo)數(shù)圖像的內(nèi)存是32位寬,并且每個(gè)字節(jié)是單獨(dú)編址的。視頻圖像是按照每個(gè)像素一個(gè)字節(jié)存儲(chǔ)的。一幀里一行的像素從左到右依次存儲(chǔ)在連續(xù)的地址空間,并且所有行是從上到下,一行接一行地存儲(chǔ)。每
24、次內(nèi)存讀寫需要花費(fèi)20納秒,即需要 100MHz系統(tǒng)時(shí)鐘的兩個(gè)周期。問內(nèi)存存取數(shù)據(jù)的速度是否足夠塊?解:前面(qin mian)的分析指出,攝像機(jī)以大約每秒1000萬個(gè)像素的速度到達(dá),即每100納秒收到一個(gè)像素。如果視頻輸入控制器用一次單獨(dú)的寫操作把每個(gè)像素點(diǎn)存儲(chǔ)到內(nèi)存中,它就會(huì)消耗可用內(nèi)存帶寬的20%。更好的辦法是控制器把四個(gè)像素值合起來,用一次寫操作來存儲(chǔ)這些像素,這樣就可以把對內(nèi)存帶寬的占用減少到5%。共一百二十九頁40視頻邊緣(binyun)檢測邊緣檢測加速器必須以輸入像素到達(dá)的同樣速度計(jì)算(j sun)出導(dǎo)數(shù)像素值,換言之,每100納秒輸出一個(gè)導(dǎo)數(shù)像素值。因此,假定每四個(gè)導(dǎo)數(shù)像素合成
25、一個(gè)32比特的值,則把計(jì)算出的導(dǎo)數(shù)像素值寫入內(nèi)存又消耗內(nèi)存帶寬的5%。計(jì)算每個(gè)像素需要從原始圖像中取出8個(gè)像素值。一個(gè)天真的想法是一次只讀取一個(gè)像素分多次讀取,并且計(jì)算后續(xù)像素的導(dǎo)數(shù)值時(shí)再次照此方法讀取。這個(gè)方案完成每個(gè)像素的計(jì)算需要進(jìn)行8次(中心像素點(diǎn)周圍的8個(gè)像素)讀取,占用160%的內(nèi)存帶寬。顯然這是不可能實(shí)現(xiàn)的。 共一百二十九頁41視頻(shpn)邊緣檢測 因?yàn)閮?nèi)存中每個(gè)32位字包括了四個(gè)相鄰的行像素,每次讀取32位字,包含了盡可能多的像素,可減少所需要的帶寬。如果每一行里的三個(gè)像素點(diǎn)在同一個(gè)32位字中,讀取三行的像素只需要三次。如果每一行里的三個(gè)像素點(diǎn)在不同的字中,則讀取完整的三行像
26、素需要6次。所以,計(jì)算每個(gè)像素的導(dǎo)數(shù)值平均(pngjn)需要4.5次讀操作,占用90%的內(nèi)存帶寬。這個(gè)方案還是不可行。 共一百二十九頁42視頻(shpn)邊緣檢測注意,原始圖像的像素,一旦被讀取,就可以用來計(jì)算該像素的后一列,本列和前一列中三個(gè)像素的導(dǎo)數(shù),這樣(zhyng)可以進(jìn)一步減少所占的內(nèi)存帶寬。所以,我們可以把讀取的原始圖像的像素存儲(chǔ)在加速器中用于計(jì)算多個(gè)像素的導(dǎo)數(shù),而不是等到需要計(jì)算那些像素的導(dǎo)數(shù)值時(shí)再重新讀取一遍。這樣,每計(jì)算四個(gè)像素,只需要讀取三個(gè)字,即只需要15%的內(nèi)存帶寬。則讀取三行像素所需的15%內(nèi)存帶寬再加上把視頻圖像存入內(nèi)存所需的5%,以及把像素導(dǎo)數(shù)值寫入內(nèi)存所需的5%
27、 帶寬,共占用25%的內(nèi)存帶寬。我們假設(shè)剩下75%的內(nèi)存帶寬足以完成系統(tǒng)的其它操作,則這個(gè)方案是可行的。 共一百二十九頁43視頻邊緣(binyun)檢測若需進(jìn)一步減少加速器所消耗的帶寬,可以在加速器中加入小塊內(nèi)存來存儲(chǔ)從主存中讀取的一整行。這可以讓每個(gè)像素只被讀取一次,把讀取像素所要求的帶寬減少到只有5%。視頻輸入和邊緣檢測(jin c)將總共只占用15%的可用帶寬。 共一百二十九頁44視頻(shpn)邊緣檢測在設(shè)計(jì)邊緣檢測器加速器時(shí),我們將采用以下(yxi)方法:從原始圖像中讀取三行,每行4個(gè)相鄰的像素,把這些像素值存儲(chǔ)在加速器的寄存器中以待處理。我們把原始圖像的三整行作為一個(gè)數(shù)據(jù)塊,整塊的
28、數(shù)據(jù)經(jīng)過加速器以后,形成導(dǎo)數(shù)圖像中的一整行。正如我們后面要介紹的,這樣的數(shù)據(jù)塊的處理過程包括三個(gè)階段:起始階段,重復(fù)計(jì)算階段,和完成階段。不斷地重復(fù)執(zhí)行這三個(gè)階段,就可以求出導(dǎo)數(shù)圖像中的每一行。 共一百二十九頁45視頻(shpn)邊緣檢測 Sobel加速器的數(shù)據(jù)路徑結(jié)構(gòu)如圖6所示。它實(shí)質(zhì)上是一個(gè)這樣的流水線,先從原始圖像中依次讀取三行像素值存入圖右上角的寄存器,再讓這些像素按時(shí)鐘節(jié)拍流過左側(cè)的乘法器陣列,然后向下流過加法器到達(dá) Dx和 Dy寄存器,再通過絕對值電路和加法器到達(dá) |D| 寄存器,最終進(jìn)入圖左下角的寄存器。然后把計(jì)算得到的像導(dǎo)數(shù)素值從寄存器寫到內(nèi)存中。(盡管一個(gè)從右到左的數(shù)據(jù)流和通
29、常情況是相反(xingfn)的,但在本例中,這樣有助于保持像素的位置安排和原圖像一致)。我們將先假設(shè)流水線從一開始就充滿有效數(shù)據(jù)來描述流水線的操作過程。然后再討論在圖像行的起始處流水線是如何啟動(dòng)的,和在圖像行的結(jié)尾處,流水線中的數(shù)據(jù)又是如何排出的。 共一百二十九頁46視頻(shpn)邊緣檢測圖6 Sobel加速器數(shù)據(jù)通路結(jié)構(gòu)(jigu)共一百二十九頁47視頻(shpn)邊緣檢測計(jì)算流水線按照每四個(gè)像素值一組的形式產(chǎn)生給定行的導(dǎo)數(shù)(do sh)像素值。加速器從內(nèi)存中的上一行,本行,下一行各讀取四個(gè)像素點(diǎn)到如圖6所示右上角的3個(gè)32位寄存器中。每個(gè)寄存器包括4個(gè)8比特像素值寄存器。在接下來的四個(gè)時(shí)
30、鐘周期里,像素值依次左移,每次一個(gè)像素值,到乘法器陣列中。陣列中的每個(gè)單元包括一個(gè)像素值寄存器和一個(gè)或兩個(gè)乘法電路。乘法電路用于把像素值寄存器中存儲(chǔ)的像素值乘以一個(gè)常量系數(shù)。 共一百二十九頁48視頻(shpn)邊緣檢測 因?yàn)橄禂?shù)都是-1,+1,-2或者+2,這些電路并不是完全意義上的的乘法器。相反,乘以-1僅僅是一個(gè)取反電路,乘以+1是一個(gè)直通連接而沒有任何電路,乘以-2是把取反電路的結(jié)果左移,乘以+2僅僅是一個(gè)左移。在每個(gè)時(shí)鐘周期,硬件電路陣列提供了求一個(gè)導(dǎo)數(shù)像素值所需要(xyo)的部分積,部分積加起來后存儲(chǔ)到 Dx和Dy 寄存器中。同樣,在每個(gè)時(shí)鐘周期,計(jì)算出前一個(gè)像素值的Dx 和Dy的絕
31、對值,加起來后存儲(chǔ)到 |D| 寄存器中。|D| 寄存器中的導(dǎo)數(shù)像素值左移到結(jié)果行寄存器中。當(dāng)寄存器中四個(gè)結(jié)果像素值都準(zhǔn)備好后,隨即被寫入到內(nèi)存中去。 共一百二十九頁49視頻邊緣(binyun)檢測進(jìn)入穩(wěn)態(tài)后,在處理一行的過程中,加速器在移入新的像素值到乘法法器陣列 ,Dx,Dy和 |D| 寄存器之前,需要把導(dǎo)數(shù)像素值從結(jié)果寄存器寫到內(nèi)存中。否則,上一次計(jì)算結(jié)果就會(huì)被覆蓋掉。在把四個(gè)像素值寫到內(nèi)存后,讀寄存器中的像素值已經(jīng)(y jing)全部移入流水線中,此時(shí)讀寄存器為空。我們再讀入三組各四個(gè)像素點(diǎn),像素值按時(shí)鐘節(jié)拍移入計(jì)算流水線,當(dāng)結(jié)果寄存器填滿四個(gè)像素值后,再次寫到內(nèi)存 然后不斷重復(fù)這個(gè)過程
32、。時(shí)序如圖7所示。假設(shè)加速器有一個(gè)Wishbone總線接口,數(shù)據(jù)位寬32位,時(shí)鐘頻率為100MHz。加速器是內(nèi)存總線的主設(shè)備之一,它必須先給仲裁器發(fā)出訪問內(nèi)存的請求信號(hào),等總線仲裁器批準(zhǔn)以后,才能讀寫內(nèi)存。我們假設(shè)仲裁器給加速器足夠高的優(yōu)先權(quán),這樣加速器可以占有需要的內(nèi)存帶寬。 共一百二十九頁50視頻邊緣(binyun)檢測圖7流水線中像素(xin s)讀寫操作和計(jì)算的時(shí)序共一百二十九頁51視頻(shpn)邊緣檢測我們已經(jīng)考慮了處理一行像素過程中的穩(wěn)定狀態(tài),下面我們將考慮在一行像素的開始處流水線是如何啟動(dòng)的。在處理一行像素的開始處,流水線中的寄存器中沒有有效的數(shù)據(jù)(shj)。我們先讀入三行各四
33、個(gè)像素值,經(jīng)過四個(gè)計(jì)算周期(4個(gè)時(shí)鐘周期)后,有效數(shù)據(jù)已經(jīng)進(jìn)入到流水線中的Dx和 Dy寄存器。此時(shí),結(jié)果寄存器中沒有有效數(shù)據(jù)。因此,在經(jīng)過第一次四個(gè)計(jì)算周期后不進(jìn)行寫操作。由于讀寄存器已空,再讀入三行像素值,經(jīng)過四個(gè)計(jì)算周期后,有效數(shù)據(jù)已經(jīng)進(jìn)入到最右側(cè)的三個(gè)結(jié)果像素值寄存器中。最左側(cè)的結(jié)果像素值寄存器里仍然是無效數(shù)據(jù)。我們前面曾經(jīng)提過,最左邊的像素位置沒有一組完整的相鄰像素點(diǎn)來計(jì)算導(dǎo)數(shù)像素值,我們將用軟件把它設(shè)為0。所以,得到的第一組導(dǎo)數(shù)像素值(一個(gè)無效值和三個(gè)有效值)應(yīng)該寫入內(nèi)存中。此后,流水線進(jìn)入了穩(wěn)態(tài),這種情況前面已經(jīng)討論過。共一百二十九頁52視頻邊緣(binyun)檢測當(dāng)?shù)竭_(dá)一行的結(jié)尾
34、,我們需要排出流水線中的數(shù)據(jù)。因?yàn)橐恍欣锵袼攸c(diǎn)的個(gè)數(shù)是4的整數(shù)倍(640 =1604 ),我們每次都可以(ky)讀到包含四個(gè)像素值的完整組。當(dāng)我們把一行里最后四個(gè)像素讀入讀寄存器,經(jīng)過四個(gè)計(jì)算周期后,結(jié)果寄存器被移入四個(gè)新的結(jié)果值,同時(shí)讀寄存器中的像素值被全部移入流水線中。然后結(jié)果寄存器被寫入內(nèi)存。由于整行像素已經(jīng)被讀完,不執(zhí)行讀操作。此時(shí),流水線中還有數(shù)據(jù),再執(zhí)行四個(gè)計(jì)算周期排出流水線中的數(shù)據(jù)。經(jīng)過這四個(gè)計(jì)算周期,結(jié)果寄存器被移入四個(gè)數(shù)據(jù),但是寄存器中最右邊的數(shù)據(jù)是無效數(shù)據(jù)。因?yàn)閳D像最右邊的像素點(diǎn)沒有完整的相鄰像素組。我們還將用軟件把那個(gè)像素值清零。 共一百二十九頁53視頻邊緣(binyun
35、)檢測例7: 編寫Verilog寄存器傳輸級(jí)代碼來描述圖6的數(shù)據(jù)通路。答:定義Sobel加速器模塊的Verilog代碼如下:/計(jì)算數(shù)據(jù)通路信號(hào)(xnho)reg31:0 prev_row, curr_row, next_row;reg7:0O-1:1-1:1;reg signed 10:0Dx, Dy;wire signed 10:0 D;reg7:0abs_D;reg31:0result_row;/可進(jìn)行計(jì)算的數(shù)據(jù)通路always(posedge clk_i) /上一行寄存器if(prev_row_load) prev_row= dat_i;else if(shift_en) prev_ro
36、w31:8 = prev_row23:0; 共一百二十九頁54視頻邊緣(binyun)檢測 always(posedge clk_i) /當(dāng)前(dngqin)行寄存器if(curr_row_load) curr_row= dat_i;else if(shift_en ) curr_row 31:8=curr_row23:0;always(posedge clk_i) /下一行寄存器if(next_row_load) next_row=dat_i;else if(shift_en ) next_row 31:8=0 ? x : -x ;endfunction/計(jì)算流水線assign D = ab
37、s(Dx) + abs(Dy);always (posedge clk_i) if ( shift_en ) beginabs_D = D10:3;Dx = -$signed(3b000, O-1-1) /-1* O-1-1 +$signed(3b000, O-1+1) /+1* O-1+1 -($signed(3b000, O 0-1) 1) /-2* O 0-1 +($signed(3b000, O 0+1) 1) /+2* O 0+1 -$signed(3b000, O+1-1) /-1* O+1-1 +$signed(3b000, O+1+1); /+1* O+1+1 共一百二十九頁5
38、6視頻邊緣(binyun)檢測 Dy = $signed(3b000, O-1-1) /+1* O-1-1 +($signed(3b000, O-1 0) 1) /+2* O-10 +$signed(3b000, O-1+1) /+1* O-1+1 -$signed(3b000, O+1-1) /-1* O+1-1 -($signed(3b000, O+1 0) 1) /-2* O+1 0 - $signed(3b000, O+1+1); /-1* O+1+1 O-1-1 = O-10; O-1 0 = O-1+1; O-1+1 = prev_row31:24; O 0-1 = O00; O
39、0 0 = O0+1; O 0+1 = curr_row31:24; O+1-1 = O+10; O+1 0 = O+1+1; O+1+1 = next_row31:24; endalways(posedge clk_i)/結(jié)果(ji gu)行寄存器if(shift_en) result_row= result_row23:0, abs_D ;共一百二十九頁57視頻(shpn)邊緣檢測模塊中前三個(gè)always塊表示(biosh)三個(gè)寄存器組(每個(gè)寄存器組由四個(gè)8比特的寄存器組成),從內(nèi)存中讀取的每組四個(gè)像素值被加載到這三個(gè)寄存器組中。因?yàn)檫@些寄存器要通過依次讀取內(nèi)存來加載數(shù)據(jù),所以每個(gè)寄存器組
40、有一個(gè)單獨(dú)的控制信號(hào)來控制數(shù)據(jù)的加載。同時(shí),三組寄存器都并行地把一個(gè)像素值移出寄存器,進(jìn)入流水線中,所以它們共用一個(gè)移位控制信號(hào)。 共一百二十九頁58視頻(shpn)邊緣檢測第四個(gè)always塊,描述加速器的計(jì)算流水線。所有的計(jì)算邏輯和寄存器移位操作都在控制信號(hào)shift_en控制下進(jìn)行。信號(hào)O是一個(gè)的原始圖像像素陣列(類似于C語言中的二維數(shù)組),該陣列(數(shù)組)中的每個(gè)元素對應(yīng)一個(gè)寄存器。從圖6可以看到,下標(biāo)為-1+1的元素,是寄存器陣列的前一行(prev row),下一列(最右列)的像素值。陣列中的元素值都是由每個(gè)輸入寄存器最左邊8位向左移入陣列的。Dx和 Dy值由陣列元素乘以對應(yīng)系數(shù)計(jì)算出
41、來的。我們通過前面分析得出,Dx,Dy的范圍是從-1020到1020,用11比特有符號(hào)數(shù)來表示。因此(ync),我們把每個(gè)原始像素?cái)U(kuò)展成11比特,并轉(zhuǎn)換成有符號(hào)數(shù)再進(jìn)行計(jì)算。共一百二十九頁59視頻邊緣(binyun)檢測最后一個(gè)(y )always塊,在shift_en控制下8比特的計(jì)算結(jié)果被從右至左依次移入32比特結(jié)果寄存器。當(dāng)結(jié)果寄存器被移入32比特?cái)?shù)據(jù)時(shí),其值將被一次寫入內(nèi)存。共一百二十九頁60視頻(shpn)邊緣檢測我們在前面曾提到塊處理加速器必須有地址產(chǎn)生和數(shù)據(jù)處理電路。加速器作為系統(tǒng)中的主設(shè)備,必須提供讀寫內(nèi)存的地址信號(hào)。我們設(shè)計(jì)的Sobel加速器也需要地址產(chǎn)生電路來給出讀取原始圖
42、像像素所需的地址,以及寫入導(dǎo)數(shù)像素所需的地址。在加速器內(nèi)部,我們將會(huì)提供兩個(gè)寄存器,以便嵌入式軟件可以把原始圖像和導(dǎo)數(shù)圖像在內(nèi)存中的基地址寫入這兩個(gè)寄存器。地址產(chǎn)生電路可以用寄存器中的基地址自動(dòng)地產(chǎn)生像素地址。我們要求所有(suyu)的地址是按字排列的,也就是說,它們都是四的整數(shù)倍。這意味著地址的最低兩位總是00。共一百二十九頁61視頻邊緣(binyun)檢測例8: 假設(shè)一幅圖像在內(nèi)存中的基地址(dzh)為B,請推導(dǎo)出計(jì)算圖像的第r行第c列的像素值地址的表達(dá)式。行列都從0開始編號(hào)。答:圖像尺寸是480行,每行640個(gè)像素。第r行的起始地址是: B + r 640 那么,r行c列的像素點(diǎn)位于地址
43、: B + r 640 + c我們可以把表達(dá)式 r 640 + c 看作基地址的地址偏移量。共一百二十九頁62視頻(shpn)邊緣檢測例9: 假設(shè)內(nèi)存的大小是4M字節(jié),組織成 1M32比特。請你為Sobel加速器設(shè)計(jì)能自動(dòng)選通存儲(chǔ)地址(數(shù)據(jù)通路)的電路。答:地址產(chǎn)生電路需要兩個(gè)基地址寄存器:原始圖像基地址寄存器O_base和導(dǎo)數(shù)圖像基地址寄存器D_base。因?yàn)橄袼刂蛋此膫€(gè)一組存儲(chǔ),地址的最低兩位總是0,所以不需要在地址寄存器中顯式地給出這兩位地址。有幾種方案可以得到讀/寫地址,包括采用計(jì)數(shù)器對圖像行和列進(jìn)行計(jì)數(shù),利用行和列的計(jì)數(shù)值(shz),根據(jù)例8推導(dǎo)的公式來計(jì)算像素地址。但是這種方法引入
44、了乘法運(yùn)算(r640),實(shí)現(xiàn)起來會(huì)消耗較多的硬件資源。然而,我們可以僅僅對基地址的偏移值進(jìn)行計(jì)數(shù),這樣就可以避免乘以640的操作,見圖8所示。共一百二十九頁63視頻邊緣(binyun)檢測圖8 地址產(chǎn)生(chnshng)電路共一百二十九頁64視頻邊緣(binyun)檢測對于原始圖像,偏移值從0開始計(jì)數(shù)。從內(nèi)存中每讀取一組四個(gè)像素值,偏移值加1。把偏移值和基地址加起來形成前一行(prev row)的像素組地址。前一行的像素組地址加上640/4形成當(dāng)前行(curr row)的讀地址。前一行的像素組地址加上1280/4形成下一行(next row)的讀地址(假設(shè)地址的最低兩位都是00)。圖象的像素點(diǎn)
45、總共有480行640列,前一行(prev row)像素的地址加上640/4后,與原地址正好(zhngho)差了一行的位置;加上1280/4后,正好相差兩行的位置。根據(jù)這兩個(gè)地址從內(nèi)存中讀取的像素值正好就是用Sobel卷積表計(jì)算當(dāng)前行像素導(dǎo)數(shù)值所需要的當(dāng)前行和下一行的像素值。對于導(dǎo)數(shù)圖像,我們從偏移值640/4開始計(jì)數(shù),依次加1形成每次的寫地址。圖中的多路器根據(jù)當(dāng)前操作要求選擇適當(dāng)?shù)挠?jì)算地址來驅(qū)動(dòng)內(nèi)存地址總線。共一百二十九頁65視頻(shpn)邊緣檢測例10 : 編寫寄存器傳輸(RTL)級(jí)的Verilog代碼描述如圖8所示的地址產(chǎn) 生電路。解決方案:Sobel加速器模塊定義(dngy)中的地址生
46、成電路的代碼如下: always (posedge clk_i) / 原始圖像基地址寄存器 if(O_base_ce) O_base = dat_i21:2; always(posedge clk_i) / 原始圖像地址偏移量計(jì)數(shù)器if(offset_reset)O_offset= 0; else if(O_offset_cnt_en) O_offset= O_offset+1;共一百二十九頁66視頻邊緣(binyun)檢測assign O_prev_addr = O_base + O_offset;assign O_curr_addr = O_prev_addr + 640/4;assign
47、 O_next_addr = O_prev_addr + 1280/4;always(posedge clk_i) /導(dǎo)數(shù)(do sh)圖像基地址寄存器if(D_base_ce)D_base =dat_i21:2;always(posedge clk_i) /導(dǎo)數(shù)圖像地址偏移量計(jì)數(shù)器if(offset_reset)D_offset = 0;else if (D_offset_cnt_en) D_offset = D_offset+1;共一百二十九頁67視頻邊緣(binyun)檢測assign D_addr = D_base +D_offset;assignadr_o21:2 = prev_ro
48、w_load ? O_prev_addr : curr_row_load ? O_curr_addr : next_row_load ? O_next_addr : D_addr ;assign adr_o1:0 = 2b00;共一百二十九頁68視頻(shpn)邊緣檢測第一、三個(gè)always塊把分別(fnbi)表示原始圖像基地址寄存器和導(dǎo)數(shù)圖像基地址寄存器。當(dāng)處理器要把原始圖像基地址或?qū)?shù)圖像基地址寫入其中一個(gè)寄存器時(shí),O_base_ce或D_base_ce有效,數(shù)據(jù)總線上的數(shù)據(jù)就被加載到相應(yīng)的地址寄存器。第二、四個(gè)always塊描述原始圖像和導(dǎo)數(shù)圖像地址偏移量計(jì)數(shù)器。計(jì)數(shù)器的控制信號(hào)由控制電
49、路部分提供。圖8中的四個(gè)加法器分別由四條assign賦值語句實(shí)現(xiàn)。分別產(chǎn)生O_prev_addr,O_curr_addr,O_next_addr和D_addr。最后,通過一個(gè)多路器在產(chǎn)生的四個(gè)地址中選擇一個(gè)作為輸出地址。共一百二十九頁69視頻邊緣(binyun)檢測我們在前面曾經(jīng)提過,處理器需要提通過讀寫加速器內(nèi)部的寄存器來控制加速器的工作、了解它的狀態(tài)。這時(shí)處理器是主設(shè)備,加速器是從設(shè)備。處理器和加速器的這種交互功能是由加速器的從機(jī)接口(ji ku)部分完成的。共一百二十九頁70視頻(shpn)邊緣檢測我們將設(shè)置如下幾個(gè)控制和狀態(tài)寄存器來實(shí)現(xiàn)處理器和加速器之間的交互:控制寄存器。當(dāng)寫入該控制
50、寄存器時(shí),加速器就開始(kish)處理一幅圖像。并不關(guān)心寫入該寄存器的是什么值,寫入任何數(shù)都開始(kish)處理圖像??刂萍拇嫫?。第0位是中斷使能位。狀態(tài)寄存器,其第0位是done 標(biāo)志位(即完成標(biāo)志位),當(dāng)處理器處理完一幅圖像時(shí),隨即將該位設(shè)置為1。其它位為0。當(dāng)done 標(biāo)志位為1,且中斷使能位為1時(shí),加速器便發(fā)出中斷請求。讀取該狀態(tài)寄存器done 標(biāo)志位還有一個(gè)附帶作用是中斷應(yīng)答,并將done 標(biāo)志位清零為了簡化總線接口,我們把所有的寄存器設(shè)為32位,占有連續(xù)的地址空間。完整的寄存器地址映射如表1所示。共一百二十九頁71視頻(shpn)邊緣檢測表1 Sobel加速器的寄存器寄存器偏移值讀
51、/寫中斷控制0只寫開始4只寫原始圖像基地址8只寫導(dǎo)數(shù)圖像基地址12只寫狀態(tài)0只讀共一百二十九頁72視頻邊緣(binyun)檢測例11:編寫加速器從機(jī)接口(slave interface)的 Verilog 模型 代碼。答: 總線從機(jī)操作的時(shí)序如下(rxi)圖所示。總線的讀/寫操作都是在 cyc_i和stb_i為1的一個(gè)周期內(nèi)發(fā)起的。共一百二十九頁73視頻邊緣(binyun)檢測處理器發(fā)起一次讀/寫操作,加速器通過在下一個(gè)周期把 ack_o 信號(hào)置1,并在隨后一個(gè)周期把a(bǔ)ck_o置0來響應(yīng)。我們需要對地址(dzh)總線進(jìn)行譯碼,得到加速器的選通信號(hào)。利用地址的低位確定哪個(gè)寄存器被讀寫。對起始寄存
52、器(start)地址進(jìn)行寫操作,并沒有設(shè)置真實(shí)的寄存器來保存寫入的數(shù)據(jù),而是利用對該地址的寫操作來產(chǎn)生一個(gè)控制信號(hào)start,啟動(dòng)加速器的計(jì)算時(shí)序。讀取狀態(tài)寄存器,done標(biāo)志位(第0位)連同其他位(第1-31位)將被放到數(shù)據(jù)總線上。讀取其他寄存器將返回全0。對于加速器,要輸出到總線上的數(shù)據(jù)包括兩個(gè)部分:從機(jī)接口中的狀態(tài)寄存器和主機(jī)部分的結(jié)果寄存器,為此我們使用一個(gè)多路器來選擇數(shù)據(jù)總線的驅(qū)動(dòng)源。描述從機(jī)接口部分的型代碼如下:共一百二十九頁74視頻邊緣(binyun)檢測/ Wishbone 從機(jī)接口assignstart = cyc_i & stb_i & we_i & adr_i3:2 =2
53、b01;/adr_i1:0=00assign O_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b10;assign D_base_ce = cyc_i & stb_i & we_i & adr_i3:2 =2b11;always (posedge clk_i) / 中斷使能寄存器if (rst_i)int_en = 1b0;else if (cyc_i & stb_i & we_i & adr_i3:2 =2b00)int_en = dat_i0;always (posedge clk_i)/ 狀態(tài)(zhungti)寄存器if (rst_i) don
54、e =1b0;else if (done_set) /當(dāng)一幅圖像處理完時(shí),done_set被置1 done =1b1; / for master write共一百二十九頁75視頻邊緣(binyun)檢測 else if (cyc_i & stb_i & !we_i & adr_i3:2 =2b00 & ack_o) done =1b0; /讀狀態(tài)寄存器操作將清除(qngch)標(biāo)志位/中斷申請 assign int_req =int_en & done; always (posedge clk_i) / 生成應(yīng)答ack輸出 ack_o = cyc_i & stb_i & !ack_o;/總線數(shù)據(jù)
55、輸出多路選擇器always *if (cyc_i & stb_i & !we_i)if (adr_i3:2 = 2b00)dat_o = 31b0,done; / status register readelsedat_o = 32b0; / other registers read as 0else dat_o = result_row; / for master write共一百二十九頁76視頻(shpn)邊緣檢測例12:導(dǎo)數(shù)圖像的計(jì)算必須按照確定的步驟進(jìn)行,請?jiān)O(shè)計(jì)能操縱計(jì)算步驟 的控制器。解決方案:我們可以用一個(gè)有限(yuxin)狀態(tài)機(jī)來安排計(jì)算的操作步驟。因?yàn)榇蟛糠值挠?jì)算步驟是重復(fù)執(zhí)行
56、的,所以可以用計(jì)數(shù)器來跟蹤計(jì)算的過程。我們用一個(gè)行計(jì)數(shù)器來確定已經(jīng)完成了多少行的計(jì)算,從第0行起一直增加到第477行;再用另一個(gè)計(jì)數(shù)器來確定已經(jīng)完成了多少列的計(jì)算,從第0列起一直增加到第159列 (159+1)4 = 640)??刂朴?jì)算步驟的有限狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖如圖10所示。為避免狀態(tài)轉(zhuǎn)移圖顯得過于混亂,其中只顯示了狀態(tài)和轉(zhuǎn)移條件,也沒有顯示某一個(gè)狀態(tài)回到自己狀態(tài)的轉(zhuǎn)移。我們在這里假設(shè):若一個(gè)給定的狀態(tài)轉(zhuǎn)移條件為假(即不成立),則該有限狀態(tài)機(jī)就呆在原狀態(tài),直到下一個(gè)時(shí)鐘周期。共一百二十九頁77視頻邊緣(binyun)檢測該FSM(有限狀態(tài)機(jī))的初始狀態(tài)為idle(空閑)狀態(tài)。當(dāng)處理器對sta
57、rt寄存器寫入數(shù)據(jù)時(shí), start信號(hào)變?yōu)?(有效),F(xiàn)SM(有限狀態(tài)機(jī))啟動(dòng)讀操作和第一行計(jì)算的初始時(shí)序。這個(gè)過程包括讀取最初三組原始圖像的像素值,然后執(zhí)行四個(gè)計(jì)算周期。完成后,該有限狀態(tài)機(jī)進(jìn)入了一個(gè)循環(huán),在這個(gè)循環(huán)里,它再次讀取三組原始圖像的像素值,執(zhí)行四個(gè)計(jì)算周期,然后寫一組由計(jì)算得到的像素值。正像我們在觀察該有限狀態(tài)機(jī)輸出(shch)函數(shù)時(shí)所看到的那樣,列計(jì)數(shù)器在每次寫操作后加一。在最后一次計(jì)算周期結(jié)束的時(shí)候,若此時(shí)列計(jì)數(shù)器不是158,則該有限狀態(tài)機(jī)繼續(xù)循環(huán),若此時(shí)列計(jì)數(shù)器是158,則進(jìn)入一個(gè)狀態(tài),在該狀態(tài)中開始排出流水線中的數(shù)據(jù)。排出流水線中的數(shù)據(jù)包括一個(gè)把倒數(shù)第二組結(jié)果寫入的狀態(tài),
58、四個(gè)計(jì)算周期,和一個(gè)把最后一組計(jì)算結(jié)果寫入的狀態(tài)。行計(jì)數(shù)在這最后一次寫操作后器加一。然后若此時(shí)行計(jì)數(shù)器的計(jì)數(shù)值不是477,則該有限狀態(tài)機(jī)回到下一行的初始時(shí)序,若此時(shí)行計(jì)數(shù)器的計(jì)數(shù)值是最終的計(jì)數(shù)值477,則回到空閑狀態(tài)。 共一百二十九頁78視頻(shpn)邊緣檢測圖10 狀態(tài)(zhungti)轉(zhuǎn)移圖共一百二十九頁79視頻(shpn)邊緣檢測該有限狀態(tài)機(jī)的輸出函數(shù)如表2和3所示。為讓圖表讀起來簡單一些,我們把控制信號(hào)輸出為0的表格項(xiàng)留做空白,只列出表格項(xiàng)為1的情況。有些控制信號(hào)是摩爾型輸出,只取決于當(dāng)前狀態(tài),見表2所示。其它控制信號(hào)為米利型輸出,見表3所示。這些信號(hào)由輸入條件(tiojin)和當(dāng)前
59、的狀態(tài)共同決定其值。共一百二十九頁80視頻邊緣(binyun)檢測表2:摩爾(m r)狀態(tài)機(jī)的輸出共一百二十九頁81視頻(shpn)邊緣檢測表3:米利狀態(tài)機(jī)的輸出(shch)共一百二十九頁82視頻(shpn)邊緣檢測例13 為Sobel加速器的控制部分編寫一個(gè)Verilog模型(mxng)。解決方案:控制部分的代碼包括該控制有限狀態(tài)機(jī)(FSM)的內(nèi)部信號(hào)、行列計(jì)數(shù)器和控制信號(hào)的聲明:parameter 4:0 idle=5b00000, read_prev_0 = 5b00001, read_curr_0 = 5b00010, read_next_0 = 5b00011, comp1_0 =
60、5b00100, comp2_0 = 5b00101, comp3_0 = 5b00110, comp4_0 = 5b00111, read_prev = 5b01000, read_curr = 5b01001, read_next = 5b01010,共一百二十九頁83視頻邊緣(binyun)檢測 comp1 = 5b01011, comp2 = 5b01100, comp3 = 5b01101, comp4 = 5b01110, write_result = 5b01111, write_158 = 5b10000, comp1_159 = 5b10001, comp2_159 = 5b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西京學(xué)院《建筑裝飾材料及施工工藝》2022-2023學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《國際商務(wù)談判與禮儀》2022-2023學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《電工電子學(xué)》2021-2022學(xué)年期末試卷
- 杯弓蛇影英文課件
- 2024-2025學(xué)年高中物理舉一反三系列專題2.3 氣體的等壓變化和等容變化(含答案)
- 電工教程 課件
- 西華師范大學(xué)《普通地質(zhì)學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 西華師范大學(xué)《計(jì)算機(jī)組成原理》2023-2024學(xué)年期末試卷
- 西華師范大學(xué)《大氣污染防治技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 西昌學(xué)院《英漢翻譯理論與技巧》2022-2023學(xué)年第一學(xué)期期末試卷
- 聚酯生產(chǎn)技術(shù) 聚酯工藝流程介紹
- 關(guān)于日本動(dòng)漫介紹ppt
- 聽力短對話20張
- 四年級(jí)除法豎式計(jì)算題500道
- 質(zhì)量保證體系范文(必備14篇)
- 500強(qiáng)餐廳食品第二保質(zhì)期標(biāo)準(zhǔn)對照表
- 股權(quán)投資基金知識(shí)-課件
- 人工智能基礎(chǔ)與應(yīng)用課件
- 兒科運(yùn)用PDCA循環(huán)改進(jìn)提高病歷書寫質(zhì)量
- 聽神經(jīng)瘤講課課件
- 2022-2023學(xué)年廣州市南沙區(qū)小升初全真模擬數(shù)學(xué)檢測卷含答案
評論
0/150
提交評論