hls::stream作为高层次设计中最总要的建模
template<typename __STREAM_T__>
class stream{
protected://保护类型
std::string _name;//hls::stream的命名,用于做标记使用
std::deque<__STREAM_T__> _data;//队列
public://对外接口
stream(){//无参构造函数
static unsigned _counter = 1;
std::stringstream ss;
char* _demangle_name = abi::__cxa_demangle(typeid(*this).name(), 0, 0, 0);
if (_demangle_name) {
_name = _demangle_name;
free(_demangle_name);
}
else {
_name = "hls_stream";
}
ss << _counter++;
_name += "." + ss.str();
}
stream(const std::string name){//有参构造函数
_name = name;//用于给hls::stream起名字
}
private:
stream(const stream< __STREAM_T__ >& chn):
_name(chn._name), _data(chn._data) {
}
stream& operator = (const stream< __STREAM_T__ >& chn) {
_name = chn._name;
_data = chn._data;
return *this;
}
public:
/// Overload >> and << operators to implement read() and write()
void operator >> (__STREAM_T__& rdata) {
read(rdata);
}
void operator << (const __STREAM_T__& wdata) {
write(wdata);
}
};
1.这个class类是vivado hls非常重要的建模;
2.很多task的并行处理,都依赖这个class类;
3.这个是C++仿真模型,在C仿真的时候作为模拟FIFO功能的,在综合的时候就是实际的FIFO资源;
4.>>和<<做了流运算符重载
5.hls::stream在c仿真的时候,在TB中是作为无限深度的FIFO来实现的
6.hls::stream在综合的时候,作为FIFO来设计,不可能是无限深度FIFO,所以设计的时候可以依据需要来指定FIFO深度,
如果你不指定,系统默认指定的深度为2
二、ap_ctrl_hs握手
1.上电开始的时候,ap_idle拉高的,表示目前hls ip core是空闲的状态,啥也没干
2.当逻辑侧ap_start拉高,或者SDK通过驱动调用API,拉高ap_start,这个是ap_idle拉低,
表示模块开始工作了;
3.ap_ready的作用是用于告知模块是否准备好接收新的数据了,如果ap_ready拉低,表示这个模块
现在很忙,没时间理会输入的数据,只有ap_ready拉高,新数据才能进入模块被采集到,当新的
数据被采集到,那么这个时候ap_ready拉低,那么这个时候表示模块又在忙
4.ap_done表示模块,或者说函数完成了一次传输设计;当设计完成一次传输事务,也就是执行
了一次C语言函数,块协议会以ap_done拉高来表明函数已经完成。
