Vivado HLS推動協(xié)議處理系統(tǒng)蓬勃發(fā)展(下)
接上篇
本文引用地址:http://m.butianyuan.cn/article/273295.htm4 設(shè)置簡單系統(tǒng)
協(xié)議處理一般情況下屬于狀態(tài)事務(wù)。必須先順序讀取在多個時鐘周期內(nèi)進(jìn)入總線的數(shù)據(jù)包字,然后根據(jù)數(shù)據(jù)包的某些字段決定進(jìn)一步操作。通常應(yīng)對這種處理的方法是使用狀態(tài)機(jī),對數(shù)據(jù)包進(jìn)行迭代運(yùn)算,完成必要的處理。例3是一種簡單的狀態(tài)機(jī),用于根據(jù)上一級的輸入丟棄或轉(zhuǎn)發(fā)數(shù)據(jù)包。該函數(shù)接收三個參數(shù):一個是通過“inData”流接收到的輸入分組數(shù)據(jù);一個是通過“validBuffer”流顯示數(shù)據(jù)包是否有效的1位旗標(biāo);第三個是稱為“outData”的輸出分組數(shù)據(jù)流。注意Vivado HLS函數(shù)中的參數(shù)是按引用傳遞的。這在使用較為復(fù)雜的Vivado HLS流的時候是必要的。ap_uint等較為簡單的數(shù)據(jù)類型則可按值傳遞。
第2行中的流水線編譯指令指示Vivado HLS將該函數(shù)流水線化,讓初始化間隔為1(II=1),即每個時鐘周期處理一個新的輸入數(shù)據(jù)字。Vivado HLS負(fù)責(zé)核驗設(shè)計,并確定需要在設(shè)計中引入多少個流水線級來滿足調(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<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行用于聲明一個靜態(tài)枚舉變量,用于表達(dá)該FSM中的狀態(tài)。使用枚舉與否可以選擇,不過能讓代碼更容易閱讀,因為可以給狀態(tài)適當(dāng)?shù)孛2贿^使用任何整數(shù)或ap_unit變量也能得到與之類似的結(jié)果。第5行用于聲明一個“axiWord”類型的變量,用于存儲準(zhǔn)備從輸入中讀取的分組數(shù)據(jù)。
第7行中的開關(guān)語句用于表達(dá)實際的狀態(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)開始,此時FSM從第10行和第11行的兩個輸入流讀取。這兩行分別代表兩種流對象讀取方法。這兩種方法均從設(shè)定的流讀取,然后將結(jié)果存儲到給定變量中。這種方法采取阻塞式讀取,意味著如果該方法調(diào)用無法順序執(zhí)行,就會暫停執(zhí)行該函數(shù)調(diào)用中的其余代碼。在試圖讀取空流的時候會發(fā)生這種情況。
c++相關(guān)文章:c++教程
評論