新聞中心

        EEPW首頁 > 網絡與存儲 > 設計應用 > Vivado HLS推動協議處理系統蓬勃發展(下)

        Vivado HLS推動協議處理系統蓬勃發展(下)

        作者:KimonKarras JamesHrica 時間:2015-04-29 來源:電子產品世界 收藏

          接上篇

        本文引用地址:http://www.104case.com/article/273295.htm

          4 設置簡單系統

          協議處理一般情況下屬于狀態事務。必須先順序讀取在多個時鐘周期內進入總線的數據包字,然后根據數據包的某些字段決定進一步操作。通常應對這種處理的方法是使用狀態機,對數據包進行迭代運算,完成必要的處理。例3是一種簡單的狀態機,用于根據上一級的輸入丟棄或轉發數據包。該函數接收三個參數:一個是通過“inData”流接收到的輸入分組數據;一個是通過“validBuffer”流顯示數據包是否有效的1位旗標;第三個是稱為“outData”的輸出分組數據流。注意 HLS函數中的參數是按引用傳遞的。這在使用較為復雜的 HLS流的時候是必要的。ap_uint等較為簡單的數據類型則可按值傳遞。

          第2行中的流水線編譯指令指示 HLS將該函數流水線化,讓初始化間隔為1(II=1),即每個時鐘周期處理一個新的輸入數據字。Vivado HLS負責核驗設計,并確定需要在設計中引入多少個流水線級來滿足調度限制要求。

          例3:使用Vivado HLS的有限狀態機

          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<1> 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行用于聲明一個靜態枚舉變量,用于表達該FSM中的狀態。使用枚舉與否可以選擇,不過能讓代碼更容易閱讀,因為可以給狀態適當地命名。不過使用任何整數或ap_unit變量也能得到與之類似的結果。第5行用于聲明一個“axiWord”類型的變量,用于存儲準備從輸入中讀取的分組數據。

          第7行中的開關語句用于表達實際的狀態機。建議使用開關,但非強制要求。使用if-else決策樹也能執行同樣的功能。開關語句能夠讓Vivado HLS工具更高效地枚舉所有狀態,并優化得到的狀態機RTL代碼。

          執行從D_IDLE狀態開始,此時FSM從第10行和第11行的兩個輸入流讀取。這兩行分別代表兩種流對象讀取方法。這兩種方法均從設定的流讀取,然后將結果存儲到給定變量中。這種方法采取阻塞式讀取,意味著如果該方法調用無法順序執行,就會暫停執行該函數調用中的其余代碼。在試圖讀取空流的時候會發生這種情況。

        c++相關文章:c++教程



        上一頁 1 2 3 下一頁

        關鍵詞: Vivado FIFO 存儲器 RAM C/C++

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 崇仁县| 吉木萨尔县| 金溪县| 小金县| 合山市| 瑞金市| 双江| 通化市| 金川县| 临潭县| 绥滨县| 霍邱县| 桦甸市| 阜阳市| 淄博市| 灵璧县| 霍林郭勒市| 宁国市| 兰溪市| 阳泉市| 宣武区| 陇南市| 浠水县| 胶南市| 宣化县| 东方市| 桐乡市| 牟定县| 扬中市| 曲靖市| 盐边县| 霍州市| 夹江县| 伊宁市| 洛阳市| 海丰县| 华容县| 石河子市| 应用必备| 泊头市| 湟源县|