默认情况下,数组变量被实现为RAM:

  • 顶层函数数组参数被实现为RAM接口端口。
  • 通用数组被实现为RAM,用于读写访问。
  • 在涉及 DATAFLOW optimizations(数据流优化)的子函数中,数组参数是使用RAM pingpong buffer (乒乓缓冲区)通道实现的。
  • 基于循环的DATAFLOW optimizations所涉及的数组被实现为一个RAM pingpong buffer 通道 。

如果存储在数组中的数据是按顺序使用或产生的,则更有效的通信机制是使用stream pragma指定的流数据,其中使用FIFOs而不是ram。
重要!:当顶级函数的参数指定为接口类型ap_fifo时,该数组自动实现为流格式
(即,用dataflow优化,数组存取使用RAM pingpong buffer 实现,用stream优化,数组存取使用FIFOs实现)

语法

将C源代码中的pragma放在所需位置的边界内。

#pragma HLS stream variable=<variable> depth=<int> dim=<int> off

其中:

  • depth=<int>:只适用于数据流通道中的数组流。默认情况下,在RTL中实现的FIFO的深度与C代码中指定的数组大小相同。这个选项允许您修改FIFO的大小并指定不同的深度。
    当数组在数据流区域中实现时,通常使用depth=选项来减小FIFO的大小。例如,在一个数据流区域中,当所有循环和函数都以II=1的速率处理数据时,就不需要一个大型FIFO,因为数据是在每个时钟周期中产生和消耗的。在这种情况下,可以使用depth=选项将FIFO大小减少到1,从而大大减少RTL设计的面积。
    提示:config_dataflow -depth命令能够流化一个数据流区域中的所有数组。这里指定的depth=选项将覆盖指定变量的config_dataflow命令。

FIFO深度的含义[1]
FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。
FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。

  • dim=<int>:指定要流化的数组的维度。默认是维度1。指定为从0到N的整数,用于具有N维数的数组。
  • off:禁用流数据。只适用于数据流通道中的数组流
    提示:config_dataflow -default_channel fifo命令全局暗示了对设计中所有数组上使用stream pragma。这里指定的off选项会覆盖指定变量的config_dataflow命令,并恢复使用基于RAM pingpong buffer通道的默认值。

例子1

下面的例子指定数组A[10]为流,并实现为FIFO:

#pragma HLS STREAM variable=A

例子2

#pragma HLS STREAM variable=B depth=12

例子3

在这个例子中,假设config_dataflow是启用的,则off命令覆盖config_dataflow设置,数组C是禁用stream的。

#pragma HLS STREAM variable=C off

在网络之中的应用例子

void DoCompute(ap_uint<64> * in, ap_uint<64> * out, const unsigned int numReps) {#pragma HLS DATAFLOWstream<ap_uint<64> > inter0("DoCompute.inter0"); //文件中DoCompute.inter0的数组stream<ap_uint<192> > inter0_1("DoCompute.inter0_1");stream<ap_uint<24> > inter0_2("DoCompute.inter0_2");
#pragma HLS STREAM variable=inter0_2 depth=128 //stream处理,数组深度(大小)是128stream<ap_uint<64> > inter1("DoCompute.inter1");
#pragma HLS STREAM variable=inter1 depth=128stream<ap_uint<64> > inter2("DoCompute.inter2");stream<ap_uint<64> > inter3("DoCompute.inter3");
#pragma HLS STREAM variable=inter3 depth=128stream<ap_uint<128> > inter4("DoCompute.inter4");
#pragma HLS STREAM variable=inter4 depth=128stream<ap_uint<128> > inter5("DoCompute.inter5");stream<ap_uint<128> > inter6("DoCompute.inter6");
#pragma HLS STREAM variable=inter6 depth=81stream<ap_uint<256> > inter7("DoCompute.inter7");
#pragma HLS STREAM variable=inter7 depth=1stream<ap_uint<256> > inter8("DoCompute.inter8");
#pragma HLS STREAM variable=inter8 depth=1stream<ap_uint<64> > inter9("DoCompute.inter9");
#pragma HLS STREAM variable=inter9 depth=128stream<ap_uint<64> > inter10("DoCompute.inter10");
#pragma HLS STREAM variable=inter10 depth=3stream<ap_uint<64> > memOutStrm("DoCompute.memOutStrm");

参考:
[1]深入理解FIFO(包含有FIFO深度的解释)

pragma HLS stream语法相关推荐

  1. FPGA HLS stream与dataflow

    基本使用 首先导入头文件 #include "hls_stream.h" 使用 stream 读写的接口(方式): 写入流 hls::stream<int> my_st ...

  2. HLS 流传输库hls::stream

    流传输数据是一种数据传输形式, 其中数据样本从第一个样本开始按顺序发送.流传输不需要地址管理. Vivado HLS 提供了 C++ 模板类 hls::stream<>, 用于对流传输数据 ...

  3. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...

  4. Java8 Stream 语法详解 用法实例

    本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A ...

  5. java8 Stream语法详解

    些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Stream初体验 我们先来看看Jav ...

  6. Java进阶知识 —— Java8 Stream语法

    前言: 讲Stream之前,先来用个小需求带入本文.毕竟代码看的最清楚. 正文: 项目某个页面有个需求,将关键词和集合比对,判断是否存在关键词,这种需求想必是再普通不过,最简单的就是循环迭代了. 上来 ...

  7. [转载] Java8新特新--Stream语法应用在ArrayList的元素移除和排序

    参考链接: 如何在Java 8中打印Stream的元素 单元测试: @Test public void Test02(){ // 源 ArrayList<Integer> IdsSour ...

  8. HLS pragma

    文章目录 Vivado HLS Pragmas by Type 1. Kernel Optimization 1.1 pragma HLS allocation 1.2 pragma HLS cloc ...

  9. Vivado HLS #pragma 学习笔记(一)

    https://www.xilinx.com/html_docs/xilinx2018_2/sdaccel_doc/hls-pragmas-okr1504034364623.html 数据精度 支持任 ...

最新文章

  1. 51nod 1270 数组的最大代价 思路:简单动态规划
  2. java 树面试题_java——二叉树面试题
  3. day5学python 基础+装饰器内容
  4. 电子书下载:Professional ASP.NET MVC 2
  5. sqlplus登录问题
  6. 动力电池溯源追溯系统_来溯有源的区块链溯源系统、追溯系统为什么做的好?值得推荐!...
  7. eclipse接入hadoop-2.7.6集群(hadoop2.x版本通用),含免费资源
  8. 5. COM编程——IDispatch介绍
  9. Hugging Face Course-Diving in 抱抱脸 Datasets library
  10. 图片压缩,分辨率和尺寸大小修改工具(完全免费)
  11. java在线查看PDF
  12. 解决QQ不能下载文件的问题
  13. 大数据开发学习:进行大数据开发课程有哪些
  14. mac 系统怎么更改 pip 源
  15. 《2022 大数据技术与架构视频合集》附PPT和文档,限时下载
  16. CRM(客户关系管理系统)项目框架搭建
  17. 场景解析和语义分割区别_语义分割概念及应用介绍
  18. RobotFramework笔记一:元素定位
  19. 思维之道:管理何必那么虚
  20. python全栈开发书籍推荐_python全栈开发学习 01

热门文章

  1. svn revert批量撤回本地修改操作
  2. 图解 Linux 文件系统
  3. html自动播放音乐(无播放器)
  4. 三分构图与井字构图在风景摄影中的应用
  5. 2019.12.05【ABAP随笔】 分组循环(LOOP AT Group) / REDUCE
  6. 西数硬盘 黑、红、蓝、绿、紫不同颜色系列硬盘区别
  7. “2019上海老字号品牌白皮书”发布 有活力才能复活
  8. 河南职称计算机考试准考证
  9. 园艺作业对自闭症儿童职业教育模式的研究
  10. 一天学会写诗词【转载】