• 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;

  • 相关阅读:
    吊打面试官系列:Redis 性能优化的 13 条军规大全
    Laravel 7.6 发布
    Laravel 8 新功能:使用 schema:dump 来加速 Migration 和测试
    php中常用的4种运行方式
    基于 Redis 的订阅与发布
    [ida]使用pycharm编写IDApython
    visual studio 配置使生成的pdb文件中包含所有符号
    D/B位、一致与非一致代码段、向下拓展的实验与总结
    [debug] CE指针扫描扫出来为空
    error LNK2019: 无法解析的外部符号 _main,该符号在函数___tmainCRTStartup 中被引用
  • 原文地址:https://www.cnblogs.com/charleechan/p/13184173.html
Copyright © 2020-2023  润新知