hls某案例分析和总结
一、顶层设计接口1.输入为hls::streamap_axiu 2.输出为hls::streamap_axiu 3.参数配置为axilite ap_memory默认配置 resource配置为双口RAM#pragma HLS RESOURCE variableparam_mem coreRAM_2P_BRAM#pragma HLS INTERFACE s_axilite portparam_mem bundleCONTROL_BUS手册有说无法使用 bram 接口向 AXI4-Lite 接口分配数组。实际上我使用了axilitebram没有任何问题#pragma HLS INTERFACE bram portparam_mem#pragma HLS RESOURCE variableparam_mem coreRAM_2P_BRAM#pragma HLS INTERFACE s_axilite portparam_mem bundleCONTROL_BUS二、顶层函数内部设计1.顶层函数内部有一部分用于存储参数的逻辑这部分逻辑用于设计为一个axilite接口的RAM用于存储参数这部分代码直接放在顶层函数中实现之前有尝试封装为一个子函数中发现了封装后不管是资源还是时钟频率这块都变差了也就是资源变多了然后时钟频率变低了所以还是直接在顶层函数中实现吧2.顶层的axilite_bram不能直接给sub_function需要定义一个数组使用RAM_2P_BRAM或者RAM_2P_LUTRAM来优化然后接收数据这样设计的原因是由于如果不使用一个中间数组进行接收直接把顶层的数组传递给子函数由于子函数和顶层函数共用数组的时候子函数的数组会被综合为端口RAM用户不能修改如果顶层的数组指定为单口RAM没啥问题但是如果你优化为双口RAM那么就会顶层函数和子函数优化冲突所以中间需要一个数组作为缓冲才行。3.顶层函数内部两个模块其中一个就是刚才说的RAM读写这个直接在顶层函数中实现没有进行封装另外一个模块是真正的数据流进行数据的处理和运算。RAM的读取和模块的运算是顺序执行的也不需要进行并行运算使用串行流处理就行也就是RAM中先将数据全部存储完成后然后在进行数据处理。4.参数配置优化可以使用在if中使用for循环也可以使用for循环中使用if这两种方式的latency是完全不一样的可以去体会。三、核心数据流1.内部三个模块2.模块直接采用dataflow来进行优化设计3.使用了dataflow优化后模块之间的参数也会被综合为FIFO或者pingpang ram本案例被综合为depth2或者depth3的FIFO四、dataflow优化1.dataflow优化的各个模块之间的参数会被综合为管道这个管道可以是FIFO,也可以是PINGPANG ram可以查看综合后的代码设计。