版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、vivado hls推動(dòng)協(xié)議處理系統(tǒng)蓬勃發(fā)展(下) 4 設(shè)置容易系統(tǒng) 協(xié)議處理普通狀況下屬于狀態(tài)事務(wù)。必需先挨次讀取在多個(gè)時(shí)鐘周期內(nèi)進(jìn)入的數(shù)據(jù)包字,然后按照數(shù)據(jù)包的某些字段打算進(jìn)一步操作。通常應(yīng)對(duì)這種處理的辦法是用法狀態(tài)機(jī),對(duì)數(shù)據(jù)包舉行迭代運(yùn)算,完成須要的處理。例3是一種容易的狀態(tài)機(jī),用于按照上一級(jí)的輸入丟棄或轉(zhuǎn)發(fā)數(shù)據(jù)包。該函數(shù)接收三個(gè)參數(shù):一個(gè)是通過(guò)“indata”流接收到的輸入分組數(shù)據(jù);一個(gè)是通過(guò)“validbuffer”流顯示數(shù)據(jù)包是否有效的1位旗標(biāo);第三個(gè)是稱(chēng)為“outdata”的輸出分組數(shù)據(jù)流。注重vivado hls函數(shù)中的參數(shù)是按引用傳遞的。這在用法較為復(fù)雜的vivado hls
2、流的時(shí)候是須要的。ap_uint等較為容易的數(shù)據(jù)類(lèi)型則可按值傳遞。第2行中的流水線(xiàn)編譯命令指示vivado hls將該函數(shù)流水線(xiàn)化,讓初始化間隔為1(ii=1),即每個(gè)時(shí)鐘周期處理一個(gè)新的輸入數(shù)據(jù)字。vivado hls負(fù)責(zé)核驗(yàn)設(shè)計(jì),并確定需要在設(shè)計(jì)中引入多少個(gè)流水線(xiàn)級(jí)來(lái)滿(mǎn)足調(diào)度限制要求。例3:用法vivado hls的有限狀態(tài)機(jī)1 void dropper(stream& indata,stream& validbuffer,stream& outdata) 2 pragma hls pipeline ii=1 enable_flush34 static enum dstate d_idle
3、 = 0, d_stream, d_drop dropstate;5 axiword currword = 0, 0, 0, 0;67 switch(dropstate) 8 case d_idle:9 if (!validbuffer.empty() & !indata.empty() 10 ap_uint valid = validbuffer.read();11 indata.read(currword);12 if (valid) 13 outdata.write(currword);14 dropstate = d_stream;15 16 17 else18 dropstate =
4、 d_drop;19 break;20 case d_stream:21 if (!indata.empty() 22 indata.read(currword);23 outdata.write(currword);24 if (currword.last)25 dropstate = d_idle;26 27 break;28 case d_drop:29 if (!indata.empty() 30 indata.read(currword);31 if (currword.last)32 dropstate = d_idle;33 34 break;35 36 第4行用于聲明一個(gè)靜態(tài)枚
5、舉變量,用于表達(dá)該fsm中的狀態(tài)。用法枚舉與否可以挑選,不過(guò)能讓代碼更簡(jiǎn)單閱讀,由于可以給狀態(tài)適當(dāng)?shù)孛2贿^(guò)用法任何整數(shù)或ap_unit變量也能得到與之類(lèi)似的結(jié)果。第5行用于聲明一個(gè)“axiword”類(lèi)型的變量,用于存儲(chǔ)預(yù)備從輸入中讀取的分組數(shù)據(jù)。第7行中的開(kāi)關(guān)語(yǔ)句用于表達(dá)實(shí)際的狀態(tài)機(jī)。建議用法開(kāi)關(guān),但非強(qiáng)制要求。用法if-else決策樹(shù)也能執(zhí)行同樣的功能。開(kāi)關(guān)語(yǔ)句能夠讓vivado hls工具更高效地枚舉全部狀態(tài),并優(yōu)化得到的狀態(tài)機(jī)rtl代碼。執(zhí)行從d_idle狀態(tài)開(kāi)頭,此時(shí)fsm從第10行和第11行的兩個(gè)輸入流讀取。這兩行分離代表兩種流對(duì)象讀取辦法。這兩種辦法均從設(shè)定的流讀取,然后將結(jié)果
6、存儲(chǔ)到給定變量中。這種辦法實(shí)行堵塞式讀取,意味著假如該辦法調(diào)用無(wú)法挨次執(zhí)行,就會(huì)暫停執(zhí)行該函數(shù)調(diào)用中的其余代碼。在試圖讀取空流的時(shí)候會(huì)發(fā)生這種狀況。5 流分割和合并在協(xié)議處理中,按照協(xié)議棧特定字段轉(zhuǎn)發(fā)數(shù)據(jù)包給不同模塊,然后在發(fā)送前將不同的流重新組合,是一項(xiàng)關(guān)鍵功能。vivado hls允許用法高級(jí)架構(gòu)來(lái)推進(jìn)這一轉(zhuǎn)發(fā)過(guò)程,詳細(xì)如例4中所示的流合并。例4:容易的流合并狀況1 void merge(stream indatanum_merge_streams, stream&outdata) 2 pragma hls inline off3 pragma hls pipeline ii=1 enab
7、le_flush45 static enum mstatem_idle = 0, m_streammergestate;6 static ap_uintrrctr = 0;7 static ap_uintstreamsource = 0;8 axiword inputword = 0, 0, 0, 0;910 switch(mergestate) 11 case m_idle:12 bool streamemptynum_merge_streams;13 pragma hls array_partition variable=stream-empty complete14 for (uint8
8、_t i=0;i15 streamempty = indata.empty();16 for (uint8_t i=0;i17 uint8_t tempctr = streamsource + 1 + i;18 if (tempctr = num_merge_streams)19 tempctr -= num_merge_streams;20 if(!streamemptytempctr) 21 streamsource = tempctr;22 inputword = indatastreamsource.read();23 outdata.write(inputword);24 if (i
9、nputword.last = 0)25 mergestate = m_stream;26 break;27 28 29 break;30 case m_stream:31 if (!indatastreamsource.empty() 32 indatastreamsource.read(inputword);33 outdata.write(inputword);34 if (inputword.last = 1)35 mergestate = m_idle;36 37 break;38 39 本例體現(xiàn)的是模塊合并功能的用法,其中一個(gè)流陣列作為輸入(indata),一個(gè)單流作為輸出(out
10、data)。這個(gè)模塊的功能是以無(wú)區(qū)分的方式從輸入流讀取數(shù)據(jù),然后將讀取的數(shù)據(jù)輸出給輸出流。該模塊采納雙級(jí)fsm實(shí)現(xiàn),其結(jié)構(gòu)與前文介紹的結(jié)構(gòu)全都。fsm的第一個(gè)狀態(tài)用于確保挑選輸入流的無(wú)區(qū)分性(fairness)。實(shí)現(xiàn)的辦法是用法循環(huán)算法檢查隊(duì)列。該算法在完成上一隊(duì)列的拜訪之后,即從下一隊(duì)列起查找新的數(shù)據(jù)。第17到19行的代碼采納的即是此循環(huán)算法。常量num_merge_streams用于設(shè)定待合并的流的數(shù)量。接下來(lái)的第20行負(fù)責(zé)測(cè)試當(dāng)前的流,其內(nèi)容用tempcntr變量標(biāo)示。假如當(dāng)前流非空,則將其設(shè)置為活躍流(第21行)。然后從該流中讀取數(shù)據(jù)(第22行)。假如讀取的數(shù)據(jù)字不是最后一個(gè)數(shù)據(jù)字(由
11、第24行負(fù)責(zé)檢查),則狀態(tài)機(jī)進(jìn)入m_stream狀態(tài),然后輸出來(lái)自該流的剩余數(shù)據(jù)字。在處理完成最后一個(gè)數(shù)據(jù)字后,fsm返回m_idle狀態(tài),然后重復(fù)上述過(guò)程。這個(gè)模塊引入了一個(gè)新的編譯命令,稱(chēng)為“array_partition”。該編譯命令能讓vivado hls了解為了提高吞吐量,是否需要把一個(gè)陣列拆分為多個(gè)子陣列。假如未加設(shè)定,vivado hls會(huì)用法雙端口bram來(lái)拜訪陣列。假如要在一個(gè)時(shí)鐘周期中拜訪陣列兩次以上,假如不適當(dāng)?shù)靥岣叱跏蓟g隔(ii)的值,該工具將無(wú)法調(diào)度這些拜訪。在本例中,略去array_partition編譯命令,將nun_merge_streams值設(shè)為8,就可以讓
12、ii=4。但由于想能夠在每個(gè)時(shí)鐘周期內(nèi)拜訪steamempty陣列的全部元素,讓目標(biāo)ii=1,我們需要對(duì)這個(gè)陣列舉行充分分區(qū)。在本例中,該陣列實(shí)現(xiàn)為一組基于觸發(fā)器的寄存器。拆分輸入流的過(guò)程耳熟能詳,把來(lái)自一個(gè)流的數(shù)據(jù)字正確地路由到一個(gè)流陣列即可。6 抽取字段和重新對(duì)齊字段在包處理中,抽取字段和重新對(duì)齊字段是最基本的操作之一。因?yàn)閿?shù)據(jù)包普通是經(jīng)過(guò)多個(gè)時(shí)鐘周期內(nèi)通過(guò)總線(xiàn)到達(dá)模塊的,頻繁的狀況是需要的字段要么在它們抵達(dá)的數(shù)據(jù)字中未能對(duì)齊,要么簇?fù)碓诙鄠€(gè)數(shù)據(jù)字中(往往兩種狀況都有)。因此要處理這些字段,必需將它們從數(shù)據(jù)流中抽取出來(lái),存入緩存然后重新對(duì)齊以便處理。例5:源mac地址抽取示例1 if (!
13、indata.empty() 2 indata.read(currword);3 switch(wordcount) 4 case 0:5 mac_dst = currword.data.range(47, 0);6 mac_src.range(15, 0) = currword.data.range(63, 48);7 break;8 case 1:9 mac_src.range(47 ,16) = currword.data.range(31, 0);10 break;11 case 2:12 例5是一個(gè)十分容易的字段抽取和再對(duì)齊示例。這個(gè)示例從以太網(wǎng)報(bào)頭中抽取源mac地址。數(shù)據(jù)通過(guò)稱(chēng)為“
14、indata”的64位流抵達(dá)。在每個(gè)時(shí)鐘周期讀入數(shù)據(jù)(第2行)。隨后按照讀取的數(shù)據(jù)字執(zhí)行合適的語(yǔ)句。因此在第5行中源mac地址的頭16位被抽取出來(lái),并移位到mac_src變量的起始部分。在下一時(shí)鐘周期中,mac地址的其余32位抵達(dá)總線(xiàn),然后存入mac_src變量的32位更高位中。7 用多級(jí)層級(jí)創(chuàng)建系統(tǒng)上文研究了如何用法vivado hls實(shí)現(xiàn)容易的三級(jí)流水線(xiàn)。但是普通的包處理系統(tǒng)可能會(huì)包含分布在層級(jí)結(jié)構(gòu)中多個(gè)層面的多個(gè)模塊。圖2即是這種系統(tǒng)的示例。在本例中,層級(jí)結(jié)構(gòu)的第一層由兩個(gè)模塊組成,每個(gè)模塊下面包括三個(gè)子模塊。這個(gè)示例中的頂層模塊與前面介紹的容易系統(tǒng)中頂層模塊相像。但包含有三個(gè)子模塊的較
15、低層模塊用法inline編譯命令來(lái)解析函數(shù),將其子模塊推送到頂層,如例6所示。例6:vivado hls中的中間模塊1 void module2 (stream &indata,stream&outdata) 2 pragma hls inline34 因此在vivado hls完成綜合后,系統(tǒng)基本3所示。這樣vivado hls就能正確地按照這些模塊創(chuàng)建數(shù)據(jù)流架構(gòu),完成模塊的流水線(xiàn)化,然后同步執(zhí)行。在嵌入該函數(shù)后,各模塊和信號(hào)保持本來(lái)的名稱(chēng)不變。8 用法高級(jí)語(yǔ)言結(jié)構(gòu)高層次綜合的主要優(yōu)勢(shì)之一在于可以用法高級(jí)語(yǔ)言結(jié)構(gòu)來(lái)表達(dá)復(fù)雜對(duì)象,與傳統(tǒng)rtl設(shè)計(jì)相比,顯著提高了抽象水平。下面的例子是描述一個(gè)小
16、型查找表。例7中的代碼用于內(nèi)容可尋址存儲(chǔ)器(cam)類(lèi)定義,它用法類(lèi)對(duì)象創(chuàng)建一個(gè)表,供存儲(chǔ)和復(fù)原上述原型系統(tǒng)的arp數(shù)據(jù)。該類(lèi)有一個(gè)私有成員,這個(gè)私有成員是一個(gè)由“noofarptableentries”條“arptableentry”類(lèi)型記錄組成的陣列。這種類(lèi)型屬于一種數(shù)據(jù)結(jié)構(gòu),包括mac地址、對(duì)應(yīng)的ip地址和用于解釋該條記錄是否包含有效數(shù)據(jù)的一個(gè)數(shù)位。例7:cam類(lèi)定義1 class cam 2 private:3 arptableentry filterentriesnoofarptableentries;4 public:5 cam();6 bool write(arptableent
17、ry writeentry);7 bool clear(ap_uint clearaddress);8 arptableentry compare(ap_uintsearchaddress);9 ;這個(gè)類(lèi)也包括四種在這個(gè)表上運(yùn)算辦法(其中一個(gè)是構(gòu)造器)。其中的一個(gè),即比較法,用于實(shí)現(xiàn)真正的查找功能。本例通過(guò)提供ip地址來(lái)返回相應(yīng)的mac地址。處理的辦法是用法“for”循環(huán)查找表中的每一條記錄,搜尋有相同ip地址的有效記錄。然后完整地返回這條記錄。假如沒(méi)有找到,就返回?zé)o效記錄。為讓設(shè)計(jì)實(shí)現(xiàn)ii=1的目標(biāo),必需徹低綻開(kāi)這個(gè)循環(huán)。例8:用于cam類(lèi)的比較法1 arptableentry cam:compare(ap_uint searchaddress)2 for (uint8_t i=0; i3 if (this-filterentries.valid = 1 &searchaddress = this-filterentries.ipaddress)4 return this-filterentries;5 6 arptableentry temp = 0, 0, 0;7 return temp;8 上述閱歷和示例明確解釋?zhuān)脩?hù)可以用法vivado hls充分發(fā)揮高級(jí)編程結(jié)構(gòu)的作用,用類(lèi)似軟件的辦法描述包處理系統(tǒng)。采納rtl是難以實(shí)現(xiàn)的。9 10gbps速率下的協(xié)議處
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 贛南醫(yī)學(xué)院《安裝工程施工技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南師范大學(xué)科技學(xué)院《邏輯推理證明》2023-2024學(xué)年第一學(xué)期期末試卷
- 電氣培訓(xùn)課件題目
- 贛東學(xué)院《控制系統(tǒng)建模與仿真B》2023-2024學(xué)年第一學(xué)期期末試卷
- 甘孜職業(yè)學(xué)院《公司戰(zhàn)略與風(fēng)險(xiǎn)管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 甘肅政法大學(xué)《水污染控制工程(一)設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鐵塔安全培訓(xùn)課件
- 七年級(jí)道德與法治上冊(cè)第三單元師長(zhǎng)情誼第六課師生之間第二框師生交往教案新人教版
- 三年級(jí)數(shù)學(xué)上冊(cè)教材梳理數(shù)與代數(shù)新人教版
- 三年級(jí)科學(xué)上冊(cè)第三單元人與動(dòng)物5動(dòng)物世界教案首師大版1
- 2024年高等教育法學(xué)類(lèi)自考-00229證據(jù)法學(xué)考試近5年真題附答案
- 科技成果技術(shù)成熟度評(píng)估規(guī)范
- 安徽省合肥市一六八中2025屆高二生物第一學(xué)期期末教學(xué)質(zhì)量檢測(cè)試題含解析
- 醫(yī)院后勤管理作業(yè)指導(dǎo)書(shū)
- 六年級(jí)下冊(cè)心理健康教育教案-8 男女生交往小鬧鐘遼大版
- 【課件】第五單元化學(xué)反應(yīng)的定量關(guān)系新版教材單元分析九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 國(guó)庫(kù)資金支付管理辦法
- 中醫(yī)調(diào)理理療免責(zé)協(xié)議書(shū)模板
- 《列那狐的故事》導(dǎo)讀課 教學(xué)設(shè)計(jì)-2024-2025學(xué)年統(tǒng)編版語(yǔ)文五年級(jí)上冊(cè)
- 小學(xué)二年級(jí)語(yǔ)文(人教版)下冊(cè)生字筆順
- 2024 錦綸深度報(bào)告:消費(fèi)升級(jí)帶動(dòng)需求增長(zhǎng)原材料國(guó)產(chǎn)化促進(jìn)產(chǎn)能釋放
評(píng)論
0/150
提交評(píng)論