高层次综合设计模式
2026/4/27 14:16:22 网站建设 项目流程

一、设计模式
1.吞吐量的关键模式之一是生产者-消费者模式(任务级别的流水线打拍)
dataflow指令或者hls::task
2.流水线模式(指令级流水线打拍)
pipeline指令
3.串流数据范例

二、三种设计模式混合使用

1.大部分情况优化的焦点是函数和循环。
2.要为 FPGA 平台编写优秀软件,就需要了解这三个范例:生产者使用者、串流数据和流水打拍。

三、任务模型和架构
1.数据驱动的任务
纯数据驱动,不需要和外部存储器进行任何交互,函数可以并行执行,没有数据依赖关系,这种情况下使用
数据驱动任务模式是比较合适的。这种模式下的设计是free-run始终运行的,不需要进行任何控制,只是需要
对数据样本做出响应即可。


2.控制驱动的任务
如果应用需要和外部存储器进行交互,并且执行的任务存在数据依赖关系,那么适合使用控制驱动任务的模型。


3.单一设计内混用控制驱动任务与数据驱动任务

四、数据驱动的任务级别并行度
在 Vitis HLS 工具中实现数据驱动的 TLP 会使用简单的类来进行任务建模 (hls::task) 和通道建模 (hls::stream/
hls::stream_of_blocks);虽然 Vitis HLS 支持对顶层函数使用 hls::tasks,但对于顶层函数中的接口,则无法使用
hls::stream_of_blocks。

#include "test.h"
void splitter(hls::stream<int> &in, hls::stream<int> &odds_buf,
hls::stream<int> &evens_buf) {
int data = in.read();
if (data % 2 == 0)
evens_buf.write(data);
else
odds_buf.write(data);
}
void odds(hls::stream<int> &in, hls::stream<int> &out) {
out.write(in.read() + 1);
}
void evens(hls::stream<int> &in, hls::stream<int> &out) {
out.write(in.read() + 2);
}
void odds_and_evens(hls::stream<int> &in, hls::stream<int> &out1,
hls::stream<int> &out2) {
hls_thread_local hls::stream<int> s1; // channel connecting t1 and
t2
hls_thread_local hls::stream<int> s2; // channel connecting t1 and t3
// t1 infinitely runs function splitter, with input in and outputs s1
and s2
hls_thread_local hls::task t1(splitter, in, s1, s2);
// t2 infinitely runs function odds, with input s1 and output out1
hls_thread_local hls::task t2(odds, s1, out1);
// t3 infinitely runs function evens, with input s2 and output out2
hls_thread_local hls::task t3(evens, s2, out2);
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询