Vivado_HLS 學習筆記2-接口綜合


常見的模塊接口

如果設計的模塊有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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM