国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Vivado HLS推動(dòng)協(xié)議處理系統(tǒng)蓬勃發(fā)展(下)

發(fā)布時(shí)間:2015-10-30 15:33    發(fā)布者:designapp
關(guān)鍵詞: Vivado , FIFO , 存儲(chǔ)器 , RAM
  接上篇
  4 設(shè)置簡(jiǎn)單系統(tǒng)
  協(xié)議處理一般情況下屬于狀態(tài)事務(wù)。必須先順序讀取在多個(gè)時(shí)鐘周期內(nèi)進(jìn)入總線的數(shù)據(jù)包字,然后根據(jù)數(shù)據(jù)包的某些字段決定進(jìn)一步操作。通常應(yīng)對(duì)這種處理的方法是使用狀態(tài)機(jī),對(duì)數(shù)據(jù)包進(jìn)行迭代運(yùn)算,完成必要的處理。例3是一種簡(jiǎn)單的狀態(tài)機(jī),用于根據(jù)上一級(jí)的輸入丟棄或轉(zhuǎn)發(fā)數(shù)據(jù)包。該函數(shù)接收三個(gè)參數(shù):一個(gè)是通過“inData”流接收到的輸入分組數(shù)據(jù);一個(gè)是通過“validBuffer”流顯示數(shù)據(jù)包是否有效的1位旗標(biāo);第三個(gè)是稱為“outData”的輸出分組數(shù)據(jù)流。注意Vivado HLS函數(shù)中的參數(shù)是按引用傳遞的。這在使用較為復(fù)雜的Vivado HLS流的時(shí)候是必要的。ap_uint等較為簡(jiǎn)單的數(shù)據(jù)類型則可按值傳遞。
  第2行中的流水線編譯指令指示Vivado HLS將該函數(shù)流水線化,讓初始化間隔為1(II=1),即每個(gè)時(shí)鐘周期處理一個(gè)新的輸入數(shù)據(jù)字。Vivado HLS負(fù)責(zé)核驗(yàn)設(shè)計(jì),并確定需要在設(shè)計(jì)中引入多少個(gè)流水線級(jí)來滿足調(diào)度限制要求。
  例3:使用Vivado HLS的有限狀態(tài)機(jī)
  1 void dropper(stream& inData,
  stream>& validBuffer,
  stream& outData) {
  2 #pragma HLS pipeline II=1 enable_flush
  3
  4 static enum dState {D_IDLE = 0, D_STREAM, D_
  DROP} dropState;
  5 axiWord currWord = {0, 0, 0, 0};
  6
  7 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 else
  18 dropState = 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)枚舉變量,用于表達(dá)該FSM中的狀態(tài)。使用枚舉與否可以選擇,不過能讓代碼更容易閱讀,因?yàn)榭梢越o狀態(tài)適當(dāng)?shù)孛2贿^使用任何整數(shù)或ap_unit變量也能得到與之類似的結(jié)果。第5行用于聲明一個(gè)“axiWord”類型的變量,用于存儲(chǔ)準(zhǔn)備從輸入中讀取的分組數(shù)據(jù)。
  第7行中的開關(guān)語句用于表達(dá)實(shí)際的狀態(tài)機(jī)。建議使用開關(guān),但非強(qiáng)制要求。使用if-else決策樹也能執(zhí)行同樣的功能。開關(guān)語句能夠讓Vivado HLS工具更高效地枚舉所有狀態(tài),并優(yōu)化得到的狀態(tài)機(jī)RTL代碼。
  執(zhí)行從D_IDLE狀態(tài)開始,此時(shí)FSM從第10行和第11行的兩個(gè)輸入流讀取。這兩行分別代表兩種流對(duì)象讀取方法。這兩種方法均從設(shè)定的流讀取,然后將結(jié)果存儲(chǔ)到給定變量中。這種方法采取阻塞式讀取,意味著如果該方法調(diào)用無法順序執(zhí)行,就會(huì)暫停執(zhí)行該函數(shù)調(diào)用中的其余代碼。在試圖讀取空流的時(shí)候會(huì)發(fā)生這種情況。
                               
                  5 流分割和合并
  在協(xié)議處理中,根據(jù)協(xié)議棧特定字段轉(zhuǎn)發(fā)數(shù)據(jù)包給不同模塊,然后在發(fā)送前將不同的流重新組合,是一項(xiàng)關(guān)鍵功能。Vivado HLS允許使用高級(jí)架構(gòu)來推動(dòng)這一轉(zhuǎn)發(fā)過程,具體如例4中所示的流合并。
  例4:簡(jiǎn)單的流合并情況
  1 void merge(stream inData[NUM_MERGE_
  STREAMS], stream&outData) {
  2 #pragma HLS INLINE off
  3 #pragma HLS pipeline II=1 enable_flush
  4
  5 static enum mState{M_IDLE = 0, M_STREAM}
  mergeState;
  6 static ap_uint
  rrCtr = 0;
  7 static ap_uint
  streamSource = 0;
  8 axiWord inputWord = {0, 0, 0, 0};
  9
  10 switch(mergeState) {
  11 case M_IDLE:
  12 bool streamEmpty[NUM_MERGE_STREAMS];
  13 #pragma HLS ARRAY_PARTITION variable=stream-
  Empty complete
  14 for (uint8_t i=0;i
  15 streamEmpty = inData.empty();
  16 for (uint8_t i=0;i
  17 uint8_t tempCtr = streamSource + 1 + i;
  18 if (tempCtr >= NUM_MERGE_STREAMS)
  19 tempCtr -= NUM_MERGE_STREAMS;
  20 if(!streamEmpty[tempCtr]) {
  21 streamSource = tempCtr;
  22 inputWord = inData[streamSource].
  read();
  23 outData.write(inputWord);
  24 if (inputWord.last == 0)
  25 mergeState = M_STREAM;
  26 break;
  27 }
  28 }
  29 break;
  30 case M_STREAM:
  31 if (!inData[streamSource].empty()) {
  32 inData[streamSource].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è)單流作為輸出(outData)。這個(gè)模塊的功能是以無區(qū)別的方式從輸入流讀取數(shù)據(jù),然后將讀取的數(shù)據(jù)輸出給輸出流。該模塊采用雙級(jí)FSM實(shí)現(xiàn),其結(jié)構(gòu)與前文介紹的結(jié)構(gòu)一致。
  FSM的第一個(gè)狀態(tài)用于確保選擇輸入流的無區(qū)別性(fairness)。實(shí)現(xiàn)的方法是使用循環(huán)算法檢查隊(duì)列。該算法在完成上一隊(duì)列的訪問之后,即從下一隊(duì)列起查找新的數(shù)據(jù)。第17到19行的代碼采用的即是此循環(huán)算法。常量NUM_MERGE_STREAMS用于設(shè)定待合并的流的數(shù)量。接下來的第20行負(fù)責(zé)測(cè)試當(dāng)前的流,其內(nèi)容用tempCntr變量標(biāo)示。如果當(dāng)前流非空,則將其設(shè)置為活躍流(第21行)。然后從該流中讀取數(shù)據(jù)(第22行)。如果讀取的數(shù)據(jù)字不是最后一個(gè)數(shù)據(jù)字(由第24行負(fù)責(zé)檢查),則狀態(tài)機(jī)進(jìn)入M_STREAM狀態(tài),然后輸出來自該流的剩余數(shù)據(jù)字。在處理完成最后一個(gè)數(shù)據(jù)字后,F(xiàn)SM返回M_IDLE狀態(tài),然后重復(fù)上述過程。
  這個(gè)模塊引入了一個(gè)新的編譯指令,稱為“array_partition”。該編譯指令能讓Vivado HLS了解為了提高吞吐量,是否需要把一個(gè)陣列拆分為多個(gè)子陣列。如果未加設(shè)定,Vivado HLS會(huì)使用雙端口BRAM來訪問陣列。如果要在一個(gè)時(shí)鐘周期中訪問陣列兩次以上,如果不適當(dāng)?shù)靥岣叱跏蓟g隔(II)的值,該工具將無法調(diào)度這些訪問。在本例中,略去array_partition編譯指令,將NUN_MERGE_STREAMS值設(shè)為8,就可以讓II=4。但因?yàn)橄肽軌蛟诿總(gè)時(shí)鐘周期內(nèi)訪問steamEmpty陣列的所有元素,讓目標(biāo)II=1,我們需要對(duì)這個(gè)陣列進(jìn)行充分分區(qū)。在本例中,該陣列實(shí)現(xiàn)為一組基于觸發(fā)器的寄存器。
  拆分輸入流的過程耳熟能詳,把來自一個(gè)流的數(shù)據(jù)字正確地路由到一個(gè)流陣列即可。
  6 抽取字段和重新對(duì)齊字段
  在包處理中,抽取字段和重新對(duì)齊字段是最基本的操作之一。由于數(shù)據(jù)包一般是經(jīng)過多個(gè)時(shí)鐘周期內(nèi)通過總線到達(dá)模塊的,常見的情況是需要的字段要么在它們抵達(dá)的數(shù)據(jù)字中未能對(duì)齊,要么分散在多個(gè)數(shù)據(jù)字中(往往兩種情況都有)。因此要處理這些字段,必須將它們從數(shù)據(jù)流中抽取出來,存入緩存然后重新對(duì)齊以便處理。
  例5:源MAC地址抽取示例
  1 if (!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è)非常簡(jiǎn)單的字段抽取和再對(duì)齊示例。這個(gè)示例從以太網(wǎng)報(bào)頭中抽取源MAC地址。數(shù)據(jù)通過稱為“inData”的64位流抵達(dá)。在每個(gè)時(shí)鐘周期讀入數(shù)據(jù)(第2行)。隨后根據(jù)讀取的數(shù)據(jù)字執(zhí)行合適的語句。因此在第5行中源MAC地址的頭16位被抽取出來,并移位到MAC_SRC變量的起始部分。在下一時(shí)鐘周期中,MAC地址的其余32位抵達(dá)總線,然后存入MAC_SRC變量的32位更高位中。
                               
                  7 用多級(jí)層級(jí)創(chuàng)建系統(tǒng)
  上文討論了如何使用Vivado HLS實(shí)現(xiàn)簡(jiǎn)單的三級(jí)流水線。但是一般的包處理系統(tǒng)可能會(huì)包含分布在層級(jí)結(jié)構(gòu)中多個(gè)層面的多個(gè)模塊。圖2即是這種系統(tǒng)的示例。在本例中,層級(jí)結(jié)構(gòu)的第一層由兩個(gè)模塊組成,每個(gè)模塊下面包括三個(gè)子模塊。這個(gè)示例中的頂層模塊與前面介紹的簡(jiǎn)單系統(tǒng)中頂層模塊相似。但包含有三個(gè)子模塊的較低層模塊使用INLINE編譯指令來解析函數(shù),將其子模塊推送到頂層,如例6所示。
  例6:Vivado HLS中的中間模塊
  1 void module2 (stream  &inData,
  stream&outData) {
  2 #pragma HLS INLINE
  3
  4 ………
  因此在Vivado HLS完成綜合后,系統(tǒng)基本如圖3所示。這樣Vivado HLS就能正確地根據(jù)這些模塊創(chuàng)建數(shù)據(jù)流架構(gòu),完成模塊的流水線化,然后同步執(zhí)行。在嵌入該函數(shù)后,各模塊和信號(hào)保持原來的名稱不變。


  8 使用高級(jí)語言結(jié)構(gòu)
  高層次綜合的主要優(yōu)勢(shì)之一在于可以使用高級(jí)語言結(jié)構(gòu)來表達(dá)復(fù)雜對(duì)象,與傳統(tǒng)RTL設(shè)計(jì)相比,顯著提高了抽象水平。下面的例子是描述一個(gè)小型查找表。
  例7中的代碼用于內(nèi)容可尋址存儲(chǔ)器(CAM)類定義,它使用類對(duì)象創(chuàng)建一個(gè)表,供存儲(chǔ)和恢復(fù)上述原型系統(tǒng)的ARP數(shù)據(jù)。該類有一個(gè)私有成員,這個(gè)私有成員是一個(gè)由“noOfArpTableEntries”條“arpTableEntry”類型記錄組成的陣列。這種類型屬于一種數(shù)據(jù)結(jié)構(gòu),包括MAC地址、對(duì)應(yīng)的IP地址和用于說明該條記錄是否包含有效數(shù)據(jù)的一個(gè)數(shù)位。
  例7:CAM類定義
  1 class cam {
  2 private:
  3 arpTableEntry filterEntries[noOfArpTableEntries];
  4 public:
  5 cam();
  6 bool write(arpTableEntry writeEntry);
  7 bool clear(ap_uint clearAddress);
  8 arpTableEntry compare(ap_uint
  searchAddress);
  9 };
  這個(gè)類也包括四種在這個(gè)表上運(yùn)算方法(其中一個(gè)是構(gòu)造器)。其中的一個(gè),即比較法,用于實(shí)現(xiàn)真正的查找功能。本例通過提供IP地址來返回相應(yīng)的MAC地址。處理的方法是使用“for”循環(huán)查找表中的每一條記錄,搜索有相同IP地址的有效記錄。然后完整地返回這條記錄。如果沒有找到,就返回?zé)o效記錄。為讓設(shè)計(jì)實(shí)現(xiàn)II=1的目標(biāo),必須完全展開這個(gè)循環(huán)。
  例8:用于CAM類的比較法
  1 arpTableEntry cam::compare(ap_uint searchAddress)
  {
  2 for (uint8_t i=0; i
  3 if (this->filterEntries.valid == 1 &&
  searchAddress == this->filterEntries.ipAddress)
  4 return this->filterEntries;
  5 }
  6 arpTableEntry temp = {0, 0, 0};
  7 return temp;
  8 }
  上述經(jīng)驗(yàn)和示例明確說明,用戶可以使用Vivado HLS充分發(fā)揮高級(jí)編程結(jié)構(gòu)的作用,用類似軟件的方法描述包處理系統(tǒng)。采用RTL是難以實(shí)現(xiàn)的。
  9 10GBps速率下的協(xié)議處理
  與傳統(tǒng)RTL相比,Vivado HLS可使用C/C++在FPGA上迅速方便地實(shí)現(xiàn)協(xié)議處理設(shè)計(jì),充分發(fā)揮高級(jí)語言帶來的效率提升優(yōu)勢(shì)。另外還具有下列優(yōu)點(diǎn):使用C函數(shù)輕松完成系統(tǒng)構(gòu)建;數(shù)據(jù)通過流交換,提供類似FIFO的標(biāo)準(zhǔn)化接口;靈活的流控制和HLS編譯指令,便于使用該工具實(shí)現(xiàn)需要的架構(gòu)。借助這些功能,用戶無需重寫源代碼就能夠迅速判研多種不同設(shè)計(jì)方案的利弊。
  出于解釋這類設(shè)計(jì)的基本概念的目的,上文討論了一種能夠應(yīng)答ping和ARP請(qǐng)求,解析IP地址查詢的簡(jiǎn)單ARP服務(wù)器。結(jié)果證明用Vivado HLS設(shè)計(jì)的模塊能夠以10Gbp乃至更高的線速完成協(xié)議處理。
                               
               
本文地址:http://www.qingdxww.cn/thread-155199-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • Cortex-M4外設(shè) —— TC&TCC結(jié)合事件系統(tǒng)&DMA優(yōu)化任務(wù)培訓(xùn)教程
  • 你仿真過嗎?使用免費(fèi)的MPLAB Mindi模擬仿真器降低設(shè)計(jì)風(fēng)險(xiǎn)
  • 我們是Microchip
  • 想要避免發(fā)生災(zāi)難,就用MPLAB SiC電源仿真器!
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产视频网 | 日本色网址 | 国产91精品黄网在线观看 | 欧美精品成人一区二区在线观看 | 日韩欧一级毛片在线播无遮挡 | 白色强人粤语版在线观看港剧网 | 黑人粗长大战亚洲女 | 亚洲一成人毛片 | 天天干视频网 | 日本人亚洲人jizz | 日韩毛片 | 狠狠色丁香婷婷综合尤物 | 国产青青在线视频 | 亚洲欧美一区二区三区图片 | 成人免费在线观看网站 | 尹人视频在线观看 | 午夜一级做a爰片久久毛片 午夜一级毛片看看 | 国产91精品久久久久久 | 欧美资源网 | 亚洲成人aa| 欧美日韩中文一区二区三区 | 日韩精品视频在线免费观看 | 麻豆观看| 国产成人精品一区二区三区 | 黄网站在线观看永久免费 | 久久这里精品 | 午夜免费的国产片在线观看 | 久久精品国产2020 | 国产日韩欧美在线观看不卡 | 日本免费一区视频 | 四虎影院入口 | 九九热精 | 香蕉尹人| 欧美日韩亚洲一区二区 | 天天色亚洲| 男女羞羞的视频网站在线观看 | 欧美交性a视频免费 | 老司机精品久久 | 精品国产三级a∨在线观看 精品国产三级a∨在线 | 久久久精品国产 | 污网站导航 |