常見的模塊接口
如果設計的模塊有IO的協議要求,應該盡早地在設計過程中進行設置.
-
數組Port
- 設置為單端口的RAM: Directive-> Resource -> core: RAM_1P_BRAM. : RTL中最終不會包括該外部的BRAM, 而是需要你在vivado中添加一個RAM以和該設計IP連接;
- 多端口RAM(一般把輸入端口設置為多端口):ap_memory 注意必須進行循環展開,否則一個循環只會讀取一個RTL端口的數據,就算directive指定了多端口也沒用.
- 設置為FIFO接口(一般把輸出端口設置為FIFO) ap_fifo;
- 數組分塊(循環展開時): 輸出端口Directive-> ARRAY_PARTITION-> type: block, factor:4; 若輸入為雙口RAM,則輸入端口Directive-> ARRAY_PARTITION-> type: block, factor:2;
可以學習ug871的Ch4 lab3 and lab4.
-
Scalar Port(傳值的形參)
- 添加輸入有效vld信號: Directive-> Interface -> mode: ap_vld. 當port_vld為高,模塊內才會讀port.
- 添加輸出應答ack信號: Directive-> Interface -> mode: ap_ack. 當模塊讀port,port_ack才會拉高.
- 添加握手(以上兩個) : Directive-> Interface -> mode: ap_hs.
- 不需要添加控制端口: Directive-> Interface -> mode: ap_none.
-
雙向IO(傳指針的形參):
- 添加有效vld信號: Directive-> Interface -> mode: ap_vld.
- 添加應答ack信號: Directive-> Interface -> mode: ap_ack.
- 添加握手(以上兩個): Directive-> Interface -> mode: ap_hs.
- 不需要添加控制端口: Directive-> Interface -> mode: ap_none.
- 添加輸出有效ovld信號: Directive-> Interface -> mode: ap_ovld. 輸入無vld信號
- 添加FIFO接口: Directive-> Interface -> mode: ap_fifo,包括輸出的寫使能和輸入的FIFO滿信號;
- 添加HLS總線協議: Directive-> Interface -> mode: ap_bus
-
Block-level Protocol: 用於模塊的控制端口的協議設計
- 當模塊內消耗多於1個時鍾周期,ap_clk和ap_rst會被自動添加;
- 對頂層模塊進行Directive -> Interface -> mode: s_axilite, m_axi等
- Block-level的控制協議只有4種: ap_ctrl_none(無附加端口的協議), ap_ctrl_hs(default), ap_ctrl_chain, s_axilite(SoC常用);
- ap_ctrl_none(無附加端口的協議)只能用於組合邏輯電路,僅消耗1個時鍾周期的pipeline任務,數組流或hls_stream接口.
- ap_ctrl_hs中, ap_start,ap_done,ap_idle, ap_ready是控制端口,有了它, RTL模塊可以被除IO口外的其他端口控制.
- ap_start: 拉高1,並至少維持到ap_ready拉高.ap_ready拉高后,ap_start如果拉低到0,表示C函數將停止運行;如果保持高,則表示C函數將繼續運行.
- ap_ready: 可以接收新的數據輸入;
- ap_done: 模塊計算結束,此時如果有ap_return,則是該數據的有效標志;
- ap_idle: 空閑狀態;
- 返回值 ap_return 的接口協議為: ap_ctrl_hs
- clock_enable端口:必須保證是ap_ctrl_hs協議的端口,才可以添加: 選擇targeted solution, 右鍵solution setting-> config_interface -> 勾選clock_enable
- 對輸入輸出添加寄存器: 必須保證是ap_ctrl_hs協議的端口,才可以添加;
- 設置RTL屬性: 右鍵sollution setting-> config_rtl-> 設置rst_en.
- s_axilite: 使控制端口可被CPU使用.
-
注意一般IO協議一旦設定好,就不會再改變. 因此此類directive應放置到C Source文件中,而不是Driective文件.
結構體struct作為接口
結構體應該在header 文件中定義.
- Data_Pack Mode: 降低latency, 升高Throughput
在directive中定義:
field_level: 每個field會擴展到8-bit;
struct_level: 實際位寬被保留,整體位寬被擴展到8-bit對齊;
枚舉類型作為接口
- enum 枚舉類型
枚舉類型中每個數根據枚舉列表順序,被自動實現為一個integer: 0,1,2...
typedef enum
{
M_INIT,
M_ADD,
M_SUB,
M_HOLD
} mymode_t;
mymode_t mode;